huaweicloud-encryption-sdk-python 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. examples/file_encryption_example.py +57 -0
  2. examples/key_capsule_encryption_example.py +240 -0
  3. examples/kms_discovery_encryption_example.py +56 -0
  4. examples/local_aes_encryption_example.py +59 -0
  5. examples/test_rsa.py +42 -0
  6. examples/test_sm2.py +38 -0
  7. examples/test_sm4_cbc.py +37 -0
  8. examples/test_sm4_gcm.py +37 -0
  9. huaweicloud_encryption_sdk_python-1.2.1.dist-info/METADATA +18 -0
  10. huaweicloud_encryption_sdk_python-1.2.1.dist-info/RECORD +174 -0
  11. huaweicloud_encryption_sdk_python-1.2.1.dist-info/WHEEL +5 -0
  12. huaweicloud_encryption_sdk_python-1.2.1.dist-info/top_level.txt +3 -0
  13. huaweicloud_encryptionsdk/__init__.py +5 -0
  14. huaweicloud_encryptionsdk/_apig_sdk/__init__.py +1 -0
  15. huaweicloud_encryptionsdk/_apig_sdk/signer.py +278 -0
  16. huaweicloud_encryptionsdk/_apig_sdk/signer_v11.py +70 -0
  17. huaweicloud_encryptionsdk/_apig_sdk/sm3_hash.py +141 -0
  18. huaweicloud_encryptionsdk/_lts_sdk/auth/__init__.py +0 -0
  19. huaweicloud_encryptionsdk/_lts_sdk/auth/signer.py +174 -0
  20. huaweicloud_encryptionsdk/_lts_sdk/consumer/__init__.py +0 -0
  21. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/__init__.py +0 -0
  22. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/consumer_client_adapter.py +59 -0
  23. huaweicloud_encryptionsdk/_lts_sdk/consumer/client/http_client.py +211 -0
  24. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/__init__.py +0 -0
  25. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/client_consumer_worker.py +106 -0
  26. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/consumer_heartbeat.py +73 -0
  27. huaweicloud_encryptionsdk/_lts_sdk/consumer/core/log_shard_consumer.py +179 -0
  28. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/__init__.py +0 -0
  29. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_check_point_tracker.py +120 -0
  30. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor.py +18 -0
  31. huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor_factory.py +3 -0
  32. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/__init__.py +0 -0
  33. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/check_point.py +20 -0
  34. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/consumer_config.py +27 -0
  35. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/log_data.py +18 -0
  36. huaweicloud_encryptionsdk/_lts_sdk/consumer/model/task_result.py +40 -0
  37. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/__init__.py +0 -0
  38. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/consumer_fetch_task.py +53 -0
  39. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/initial_task.py +55 -0
  40. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/process_task.py +25 -0
  41. huaweicloud_encryptionsdk/_lts_sdk/consumer/task/shutdown_task.py +24 -0
  42. huaweicloud_encryptionsdk/_lts_sdk/consumer_main.py +88 -0
  43. huaweicloud_encryptionsdk/_lts_sdk/parallel_main.py +64 -0
  44. huaweicloud_encryptionsdk/_lts_sdk/producer/__init__.py +0 -0
  45. huaweicloud_encryptionsdk/_lts_sdk/producer/callback/__init__.py +0 -0
  46. huaweicloud_encryptionsdk/_lts_sdk/producer/callback/call_back.py +7 -0
  47. huaweicloud_encryptionsdk/_lts_sdk/producer/core/__init__.py +0 -0
  48. huaweicloud_encryptionsdk/_lts_sdk/producer/core/accumulator.py +135 -0
  49. huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_thread_pool.py +107 -0
  50. huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_worker.py +124 -0
  51. huaweicloud_encryptionsdk/_lts_sdk/producer/core/mover.py +69 -0
  52. huaweicloud_encryptionsdk/_lts_sdk/producer/core/producer.py +98 -0
  53. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/__init__.py +0 -0
  54. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/http_client.py +63 -0
  55. huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/simple_request.py +14 -0
  56. huaweicloud_encryptionsdk/_lts_sdk/producer/model/__init__.py +0 -0
  57. huaweicloud_encryptionsdk/_lts_sdk/producer/model/config.py +50 -0
  58. huaweicloud_encryptionsdk/_lts_sdk/producer/model/error.py +18 -0
  59. huaweicloud_encryptionsdk/_lts_sdk/producer/model/log.py +87 -0
  60. huaweicloud_encryptionsdk/_lts_sdk/producer/model/log_batch.py +154 -0
  61. huaweicloud_encryptionsdk/_lts_sdk/producer/model/lts_store.py +21 -0
  62. huaweicloud_encryptionsdk/_lts_sdk/producer/model/result.py +17 -0
  63. huaweicloud_encryptionsdk/_lts_sdk/producer/model/retry_queue.py +39 -0
  64. huaweicloud_encryptionsdk/_lts_sdk/serial_main.py +77 -0
  65. huaweicloud_encryptionsdk/_lts_sdk/utils/__init__.py +0 -0
  66. huaweicloud_encryptionsdk/_lts_sdk/utils/common.py +57 -0
  67. huaweicloud_encryptionsdk/_lts_sdk/utils/lts_threading.py +32 -0
  68. huaweicloud_encryptionsdk/cache/__init__.py +0 -0
  69. huaweicloud_encryptionsdk/cache/data_key_cache.py +79 -0
  70. huaweicloud_encryptionsdk/cache/local_data_key_cache.py +161 -0
  71. huaweicloud_encryptionsdk/common/__init__.py +0 -0
  72. huaweicloud_encryptionsdk/common/constants.py +15 -0
  73. huaweicloud_encryptionsdk/common/counting_output_stream.py +18 -0
  74. huaweicloud_encryptionsdk/common/crypto_factory.py +48 -0
  75. huaweicloud_encryptionsdk/common/ec_private_key_loader.py +43 -0
  76. huaweicloud_encryptionsdk/common/ecs_metadata_service.py +42 -0
  77. huaweicloud_encryptionsdk/common/file_path_for_example_constants.py +4 -0
  78. huaweicloud_encryptionsdk/common/utils.py +162 -0
  79. huaweicloud_encryptionsdk/exception/__init__.py +0 -0
  80. huaweicloud_encryptionsdk/exception/errors.py +109 -0
  81. huaweicloud_encryptionsdk/handler/__init__.py +0 -0
  82. huaweicloud_encryptionsdk/handler/cipher_handler.py +294 -0
  83. huaweicloud_encryptionsdk/handler/crypto_handler.py +24 -0
  84. huaweicloud_encryptionsdk/handler/default_crypto_handler.py +148 -0
  85. huaweicloud_encryptionsdk/handler/default_serialize_handler.py +45 -0
  86. huaweicloud_encryptionsdk/handler/file_decrypt_handler.py +101 -0
  87. huaweicloud_encryptionsdk/handler/file_encrypt_handler.py +30 -0
  88. huaweicloud_encryptionsdk/handler/serialize_handler.py +14 -0
  89. huaweicloud_encryptionsdk/huawei_config.py +49 -0
  90. huaweicloud_encryptionsdk/huawei_crypto.py +311 -0
  91. huaweicloud_encryptionsdk/keyrings/__init__.py +0 -0
  92. huaweicloud_encryptionsdk/keyrings/keyring.py +14 -0
  93. huaweicloud_encryptionsdk/keyrings/keyring_factory.py +10 -0
  94. huaweicloud_encryptionsdk/keyrings/kms_keyring_factory.py +21 -0
  95. huaweicloud_encryptionsdk/keyrings/kmskeyring/__init__.py +0 -0
  96. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_discovery_keyring.py +51 -0
  97. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_key_capsule_keyring.py +100 -0
  98. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_keyring.py +155 -0
  99. huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_multi_region_keyring.py +8 -0
  100. huaweicloud_encryptionsdk/keyrings/raw_keyring_factory.py +27 -0
  101. huaweicloud_encryptionsdk/keyrings/rawkeyring/__init__.py +0 -0
  102. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_aes_keyring.py +63 -0
  103. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_keyring.py +112 -0
  104. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_rsa_keyring.py +55 -0
  105. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm2_keyring.py +75 -0
  106. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_cbc_keyring.py +66 -0
  107. huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_keyring.py +70 -0
  108. huaweicloud_encryptionsdk/kms/__init__.py +0 -0
  109. huaweicloud_encryptionsdk/kms/create_key_capsule_request.py +35 -0
  110. huaweicloud_encryptionsdk/kms/create_key_capsule_response.py +19 -0
  111. huaweicloud_encryptionsdk/kms/decrypt_key_capsule_request.py +32 -0
  112. huaweicloud_encryptionsdk/kms/decrypt_key_capsule_response.py +19 -0
  113. huaweicloud_encryptionsdk/kms/kms_http_client.py +116 -0
  114. huaweicloud_encryptionsdk/log/__init__.py +0 -0
  115. huaweicloud_encryptionsdk/log/log_config.py +30 -0
  116. huaweicloud_encryptionsdk/log/log_file_backup.py +144 -0
  117. huaweicloud_encryptionsdk/log/log_metrics.py +132 -0
  118. huaweicloud_encryptionsdk/log/log_reporter_manager.py +163 -0
  119. huaweicloud_encryptionsdk/log/lts_sdk_producer.py +386 -0
  120. huaweicloud_encryptionsdk/log/lts_struct_log_builder.py +106 -0
  121. huaweicloud_encryptionsdk/meterialmanager/__init__.py +0 -0
  122. huaweicloud_encryptionsdk/meterialmanager/cache_crypto_meterial_manager.py +221 -0
  123. huaweicloud_encryptionsdk/meterialmanager/crypto_meterial_manager.py +19 -0
  124. huaweicloud_encryptionsdk/meterialmanager/data_key_generate.py +10 -0
  125. huaweicloud_encryptionsdk/meterialmanager/data_key_generate_factory.py +20 -0
  126. huaweicloud_encryptionsdk/meterialmanager/default_crypto_meterials_manager.py +71 -0
  127. huaweicloud_encryptionsdk/meterialmanager/key_capsule_data_key_generate.py +63 -0
  128. huaweicloud_encryptionsdk/meterialmanager/kms_data_key_generate.py +65 -0
  129. huaweicloud_encryptionsdk/meterialmanager/local_data_key_generate.py +13 -0
  130. huaweicloud_encryptionsdk/model/__init__.py +0 -0
  131. huaweicloud_encryptionsdk/model/access_point_config.py +9 -0
  132. huaweicloud_encryptionsdk/model/cipher_body.py +81 -0
  133. huaweicloud_encryptionsdk/model/cipher_header.py +405 -0
  134. huaweicloud_encryptionsdk/model/ciphertext_data_key.py +166 -0
  135. huaweicloud_encryptionsdk/model/crypto_result.py +11 -0
  136. huaweicloud_encryptionsdk/model/data_key_materials.py +17 -0
  137. huaweicloud_encryptionsdk/model/data_materials.py +11 -0
  138. huaweicloud_encryptionsdk/model/enums/__init__.py +0 -0
  139. huaweicloud_encryptionsdk/model/enums/access_point_type.py +28 -0
  140. huaweicloud_encryptionsdk/model/enums/crypto_algorithm.py +75 -0
  141. huaweicloud_encryptionsdk/model/enums/data_key_generate_type.py +20 -0
  142. huaweicloud_encryptionsdk/model/enums/key_provider_enum.py +19 -0
  143. huaweicloud_encryptionsdk/model/enums/keyring_type_enum.py +27 -0
  144. huaweicloud_encryptionsdk/model/key_capsule.py +10 -0
  145. huaweicloud_encryptionsdk/model/key_capsule_config.py +12 -0
  146. huaweicloud_encryptionsdk/model/kms_config.py +10 -0
  147. huaweicloud_encryptionsdk/model/request/__init__.py +0 -0
  148. huaweicloud_encryptionsdk/model/request/encrypt_request.py +10 -0
  149. huaweicloud_encryptionsdk/model/request/sign_request.py +2 -0
  150. huaweicloud_encryptionsdk/model/request/verify_request.py +2 -0
  151. huaweicloud_encryptionsdk/proof/__init__.py +0 -0
  152. huaweicloud_encryptionsdk/proof/attestation_document.py +36 -0
  153. huaweicloud_encryptionsdk/proof/collector/__init__.py +0 -0
  154. huaweicloud_encryptionsdk/proof/collector/cce_proof_collector.py +24 -0
  155. huaweicloud_encryptionsdk/proof/collector/ecs_proof_collector.py +11 -0
  156. huaweicloud_encryptionsdk/proof/collector/key_pair_proof_collector.py +55 -0
  157. huaweicloud_encryptionsdk/proof/collector/ma_proof_collector.py +51 -0
  158. huaweicloud_encryptionsdk/proof/private_key_decrypt_callback.py +7 -0
  159. huaweicloud_encryptionsdk/proof/proof_collector.py +11 -0
  160. huaweicloud_encryptionsdk/proof/proof_collector_factory.py +53 -0
  161. huaweicloud_encryptionsdk/proof/proof_info.py +10 -0
  162. huaweicloud_encryptionsdk/util/__init__.py +0 -0
  163. huaweicloud_encryptionsdk/util/common_utils.py +12 -0
  164. tests/__init__.py +0 -0
  165. tests/test_enums.py +84 -0
  166. tests/test_exceptions.py +38 -0
  167. tests/test_factories.py +71 -0
  168. tests/test_huawei_crypto.py +67 -0
  169. tests/test_imports.py +46 -0
  170. tests/test_kms_models.py +95 -0
  171. tests/test_log_file_backup.py +45 -0
  172. tests/test_lts_struct_log_builder.py +97 -0
  173. tests/test_models.py +142 -0
  174. tests/test_utils.py +111 -0
@@ -0,0 +1,405 @@
1
+ import struct
2
+ import io
3
+ from typing import Dict, List, Optional
4
+
5
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
6
+ from huaweicloud_encryptionsdk.model.ciphertext_data_key import CiphertextDataKey
7
+ from huaweicloud_encryptionsdk.model.key_capsule import KeyCapsule
8
+ from huaweicloud_encryptionsdk.exception.errors import HuaweicloudException, CipherTamperedException, ErrorMessage
9
+
10
+ VERSION = 1
11
+ VERSION_2 = 2
12
+
13
+
14
+ def _serialize_context(encryption_context):
15
+ if not encryption_context:
16
+ return b""
17
+ sorted_entries = sorted(encryption_context.items(), key=lambda x: x[1])
18
+ buf = bytearray()
19
+ buf.extend(struct.pack(">h", len(encryption_context)))
20
+ for key, value in sorted_entries:
21
+ key_bytes = key.encode("utf-8")
22
+ buf.extend(struct.pack(">h", len(key_bytes)))
23
+ buf.extend(key_bytes)
24
+ value_bytes = value.encode("utf-8")
25
+ buf.extend(struct.pack(">h", len(value_bytes)))
26
+ buf.extend(value_bytes)
27
+ return bytes(buf)
28
+
29
+
30
+ def _deserialize_context(encryption_context_bytes):
31
+ if not encryption_context_bytes:
32
+ return {}
33
+ stream = io.BytesIO(encryption_context_bytes)
34
+ size = struct.unpack(">h", stream.read(2))[0]
35
+ result = {}
36
+ for _ in range(size):
37
+ key_len = struct.unpack(">h", stream.read(2))[0]
38
+ key = stream.read(key_len).decode("utf-8")
39
+ value_len = struct.unpack(">h", stream.read(2))[0]
40
+ value = stream.read(value_len).decode("utf-8")
41
+ result[key] = value
42
+ return result
43
+
44
+
45
+ def _write_string(stream, value):
46
+ if value is None:
47
+ stream.write(struct.pack(">i", -1))
48
+ else:
49
+ value_bytes = value.encode("utf-8")
50
+ stream.write(struct.pack(">i", len(value_bytes)))
51
+ stream.write(value_bytes)
52
+
53
+
54
+ def _read_string(stream):
55
+ length = struct.unpack(">i", stream.read(4))[0]
56
+ if length < 0:
57
+ return None
58
+ value_bytes = stream.read(length)
59
+ if len(value_bytes) != length:
60
+ raise HuaweicloudException("Failed to read string")
61
+ return value_bytes.decode("utf-8")
62
+
63
+
64
+ def _serialize_key_capsule(key_capsule):
65
+ buf = io.BytesIO()
66
+ _write_string(buf, key_capsule.key_id)
67
+ _write_string(buf, key_capsule.datakey_capsule)
68
+ buf.write(struct.pack(">i", key_capsule.access_point_type))
69
+ return buf.getvalue()
70
+
71
+
72
+ def _deserialize_key_capsule(data):
73
+ stream = io.BytesIO(data)
74
+ key_id = _read_string(stream)
75
+ datakey_capsule = _read_string(stream)
76
+ access_point_type = struct.unpack(">i", stream.read(4))[0]
77
+ return KeyCapsule(key_id=key_id, datakey_capsule=datakey_capsule, access_point_type=access_point_type)
78
+
79
+
80
+ class CipherHeader:
81
+
82
+ def __init__(self, algorithm=None, encryption_context=None, ciphertext_data_keys=None, secret_key=None, key_capsule=None):
83
+ self._version = VERSION
84
+ self._algorithm_id = 0
85
+ self._algorithm = algorithm
86
+ self._encryption_context_byte_length = 0
87
+ self._encryption_context_byte = b""
88
+ self._content_type = 1
89
+ self._encryption_context = encryption_context if encryption_context is not None else {}
90
+ self._ciphertext_data_keys = ciphertext_data_keys if ciphertext_data_keys is not None else []
91
+ self._key_capsule = key_capsule
92
+ self._key_capsule_length = 0
93
+ self._cipher_data_key_size = 0
94
+ self._iv_length = 0
95
+ self._header_tag_length = 0
96
+ self._header_tag = b""
97
+ self._iv = b""
98
+ self._content_length = 0
99
+
100
+ if algorithm is not None:
101
+ self._algorithm = algorithm
102
+ self._algorithm_id = algorithm.value
103
+ self._encryption_context = encryption_context if encryption_context is not None else {}
104
+ self._encryption_context_byte = _serialize_context(self._encryption_context)
105
+ self._encryption_context_byte_length = len(self._encryption_context_byte)
106
+ self._content_type = 1
107
+ self._ciphertext_data_keys = ciphertext_data_keys if ciphertext_data_keys is not None else []
108
+ self._cipher_data_key_size = len(self._ciphertext_data_keys)
109
+ self._iv_length = algorithm.iv_len
110
+ self._key_capsule = key_capsule
111
+ if self._key_capsule is not None:
112
+ self._version = VERSION_2
113
+ if secret_key is not None:
114
+ self._calculate_tag(secret_key)
115
+
116
+ def _calculate_tag(self, secret_key):
117
+ header_fields_bytes = self.serialize_authenticated_fields()
118
+ if self._algorithm == CryptoAlgorithm.SM4_128_CBC_PADDING:
119
+ from huaweicloud_encryptionsdk.common.crypto_factory import CryptoFactory
120
+ digest = CryptoFactory.get_message_digest("SM3")
121
+ if len(header_fields_bytes) == 0:
122
+ digest.update(b"\x00")
123
+ else:
124
+ digest.update(header_fields_bytes)
125
+ self._header_tag = digest.digest()
126
+ self._header_tag_length = len(self._header_tag)
127
+ return
128
+ from huaweicloud_encryptionsdk.handler.cipher_handler import CipherHandler, ENCRYPT_MODE
129
+ cipher_handler = CipherHandler(self._algorithm, secret_key, ENCRYPT_MODE)
130
+ header_tag_byte = cipher_handler.cipher_header_data(b"", header_fields_bytes, 0, 0)
131
+ iv_len = len(cipher_handler.get_iv())
132
+ message = bytearray(iv_len + len(header_tag_byte))
133
+ message[:iv_len] = cipher_handler.get_iv()
134
+ message[iv_len:] = header_tag_byte
135
+ self._header_tag = bytes(message)
136
+ self._header_tag_length = len(self._header_tag)
137
+
138
+ @property
139
+ def version(self):
140
+ return self._version
141
+
142
+ @version.setter
143
+ def version(self, value):
144
+ self._version = value
145
+
146
+ @property
147
+ def algorithm_id(self):
148
+ return self._algorithm_id
149
+
150
+ @algorithm_id.setter
151
+ def algorithm_id(self, value):
152
+ self._algorithm_id = value
153
+
154
+ @property
155
+ def algorithm(self):
156
+ return self._algorithm
157
+
158
+ @algorithm.setter
159
+ def algorithm(self, value):
160
+ self._algorithm = value
161
+
162
+ @property
163
+ def encryption_context_byte_length(self):
164
+ return self._encryption_context_byte_length
165
+
166
+ @encryption_context_byte_length.setter
167
+ def encryption_context_byte_length(self, value):
168
+ self._encryption_context_byte_length = value
169
+
170
+ @property
171
+ def encryption_context_byte(self):
172
+ return self._encryption_context_byte
173
+
174
+ @encryption_context_byte.setter
175
+ def encryption_context_byte(self, value):
176
+ self._encryption_context_byte = value
177
+
178
+ @property
179
+ def content_type(self):
180
+ return self._content_type
181
+
182
+ @content_type.setter
183
+ def content_type(self, value):
184
+ self._content_type = value
185
+
186
+ @property
187
+ def encryption_context(self):
188
+ return self._encryption_context
189
+
190
+ @encryption_context.setter
191
+ def encryption_context(self, value):
192
+ self._encryption_context = value
193
+
194
+ @property
195
+ def ciphertext_data_keys(self):
196
+ return self._ciphertext_data_keys
197
+
198
+ @ciphertext_data_keys.setter
199
+ def ciphertext_data_keys(self, value):
200
+ self._ciphertext_data_keys = value
201
+
202
+ @property
203
+ def key_capsule(self):
204
+ return self._key_capsule
205
+
206
+ @key_capsule.setter
207
+ def key_capsule(self, value):
208
+ self._key_capsule = value
209
+
210
+ @property
211
+ def key_capsule_length(self):
212
+ return self._key_capsule_length
213
+
214
+ @key_capsule_length.setter
215
+ def key_capsule_length(self, value):
216
+ self._key_capsule_length = value
217
+
218
+ @property
219
+ def cipher_data_key_size(self):
220
+ return self._cipher_data_key_size
221
+
222
+ @cipher_data_key_size.setter
223
+ def cipher_data_key_size(self, value):
224
+ self._cipher_data_key_size = value
225
+
226
+ @property
227
+ def iv_length(self):
228
+ return self._iv_length
229
+
230
+ @iv_length.setter
231
+ def iv_length(self, value):
232
+ self._iv_length = value
233
+
234
+ @property
235
+ def header_tag_length(self):
236
+ return self._header_tag_length
237
+
238
+ @header_tag_length.setter
239
+ def header_tag_length(self, value):
240
+ self._header_tag_length = value
241
+
242
+ @property
243
+ def header_tag(self):
244
+ return self._header_tag
245
+
246
+ @header_tag.setter
247
+ def header_tag(self, value):
248
+ self._header_tag = value
249
+
250
+ @property
251
+ def iv(self):
252
+ return self._iv
253
+
254
+ @iv.setter
255
+ def iv(self, value):
256
+ self._iv = value
257
+
258
+ @property
259
+ def content_length(self):
260
+ return self._content_length
261
+
262
+ @content_length.setter
263
+ def content_length(self, value):
264
+ self._content_length = value
265
+
266
+ def serialize_authenticated_fields(self):
267
+ try:
268
+ buf = io.BytesIO()
269
+ buf.write(struct.pack(">b", self._version))
270
+ buf.write(struct.pack(">h", self._algorithm_id))
271
+ buf.write(struct.pack(">h", self._encryption_context_byte_length))
272
+ buf.write(self._encryption_context_byte)
273
+ buf.write(struct.pack(">b", self._cipher_data_key_size))
274
+ for data_key in self._ciphertext_data_keys:
275
+ buf.write(data_key.to_byte_array())
276
+ buf.write(struct.pack(">b", self._content_type))
277
+ buf.write(struct.pack(">b", self._iv_length))
278
+ if self._version == 2 and self._key_capsule is not None:
279
+ key_capsule_bytes = _serialize_key_capsule(self._key_capsule)
280
+ self._key_capsule_length = len(key_capsule_bytes)
281
+ buf.write(struct.pack(">i", self._key_capsule_length))
282
+ buf.write(key_capsule_bytes)
283
+ return buf.getvalue()
284
+ except Exception as e:
285
+ raise HuaweicloudException(ErrorMessage.SERIALIZE_EXCEPTION.message, e)
286
+
287
+ def deserialize_authenticated_fields(self, data_stream):
288
+ try:
289
+ self._version = struct.unpack(">b", data_stream.read(1))[0]
290
+ if self._version == 1:
291
+ self._deserialize_v1_format(data_stream)
292
+ elif self._version == 2:
293
+ self._deserialize_v2_format(data_stream)
294
+ else:
295
+ raise HuaweicloudException(
296
+ ErrorMessage.CIPHER_TEXT_CHANGED_ERROR.message + ", unsupported version: " + str(self._version))
297
+ return self
298
+ except HuaweicloudException:
299
+ raise
300
+ except Exception as e:
301
+ raise HuaweicloudException(ErrorMessage.DESERIALIZE_EXCEPTION.message, e)
302
+
303
+ def _deserialize_v1_format(self, data_stream):
304
+ self._algorithm_id = struct.unpack(">h", data_stream.read(2))[0]
305
+ self._algorithm = CryptoAlgorithm.get_algorithm(self._algorithm_id)
306
+ if self._algorithm is None:
307
+ raise HuaweicloudException(
308
+ ErrorMessage.CIPHER_TEXT_CHANGED_ERROR.message + ",algorithm id is: " + str(self._algorithm_id))
309
+ self._encryption_context_byte_length = struct.unpack(">h", data_stream.read(2))[0]
310
+ self._encryption_context_byte = data_stream.read(self._encryption_context_byte_length)
311
+ if len(self._encryption_context_byte) != self._encryption_context_byte_length:
312
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
313
+ self._encryption_context = _deserialize_context(self._encryption_context_byte)
314
+ self._cipher_data_key_size = struct.unpack(">b", data_stream.read(1))[0]
315
+ if self._cipher_data_key_size < 0:
316
+ raise HuaweicloudException(ErrorMessage.NOT_FOUND_CIPHER_TEXT_DATA_KEY.message)
317
+ self._ciphertext_data_keys = []
318
+ for _ in range(self._cipher_data_key_size):
319
+ cdk = CiphertextDataKey()
320
+ cdk.from_data_stream(data_stream)
321
+ self._ciphertext_data_keys.append(cdk)
322
+ self._content_type = struct.unpack(">b", data_stream.read(1))[0]
323
+ self._iv_length = struct.unpack(">b", data_stream.read(1))[0]
324
+ self._header_tag_length = struct.unpack(">h", data_stream.read(2))[0]
325
+ self._header_tag = data_stream.read(self._header_tag_length)
326
+ if len(self._header_tag) != self._header_tag_length:
327
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
328
+
329
+ def _deserialize_v2_format(self, data_stream):
330
+ self._algorithm_id = struct.unpack(">h", data_stream.read(2))[0]
331
+ self._algorithm = CryptoAlgorithm.get_algorithm(self._algorithm_id)
332
+ if self._algorithm is None:
333
+ raise HuaweicloudException(
334
+ ErrorMessage.CIPHER_TEXT_CHANGED_ERROR.message + ",algorithm id is: " + str(self._algorithm_id))
335
+ self._encryption_context_byte_length = struct.unpack(">h", data_stream.read(2))[0]
336
+ self._encryption_context_byte = data_stream.read(self._encryption_context_byte_length)
337
+ if len(self._encryption_context_byte) != self._encryption_context_byte_length:
338
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
339
+ self._encryption_context = _deserialize_context(self._encryption_context_byte)
340
+ self._cipher_data_key_size = struct.unpack(">b", data_stream.read(1))[0]
341
+ if self._cipher_data_key_size < 0:
342
+ raise HuaweicloudException(ErrorMessage.NOT_FOUND_CIPHER_TEXT_DATA_KEY.message)
343
+ self._ciphertext_data_keys = []
344
+ for _ in range(self._cipher_data_key_size):
345
+ cdk = CiphertextDataKey()
346
+ cdk.from_data_stream(data_stream)
347
+ self._ciphertext_data_keys.append(cdk)
348
+ self._content_type = struct.unpack(">b", data_stream.read(1))[0]
349
+ self._iv_length = struct.unpack(">b", data_stream.read(1))[0]
350
+ if self._version == 2:
351
+ self._key_capsule_length = struct.unpack(">i", data_stream.read(4))[0]
352
+ if self._key_capsule_length > 0:
353
+ key_capsule_bytes = data_stream.read(self._key_capsule_length)
354
+ if len(key_capsule_bytes) != self._key_capsule_length:
355
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
356
+ self._key_capsule = _deserialize_key_capsule(key_capsule_bytes)
357
+ self._header_tag_length = struct.unpack(">h", data_stream.read(2))[0]
358
+ self._header_tag = data_stream.read(self._header_tag_length)
359
+ if len(self._header_tag) != self._header_tag_length:
360
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
361
+
362
+ def verify_header(self, cipher_handler=None):
363
+ try:
364
+ self._header_tag = self._header_tag
365
+ header_fields_bytes = self.serialize_authenticated_fields()
366
+ if self._algorithm == CryptoAlgorithm.SM4_128_CBC_PADDING:
367
+ from huaweicloud_encryptionsdk.common.crypto_factory import CryptoFactory
368
+ digest = CryptoFactory.get_message_digest("SM3")
369
+ if len(header_fields_bytes) == 0:
370
+ digest.update(b"\x00")
371
+ else:
372
+ digest.update(header_fields_bytes)
373
+ computed = digest.hexdigest()
374
+ from huaweicloud_encryptionsdk.common import utils as _utils
375
+ encrypt_tag = _utils.bytes_to_hex(self._header_tag)
376
+ decrypt_tag = computed
377
+ if not encrypt_tag and not decrypt_tag:
378
+ return
379
+ if not encrypt_tag or not decrypt_tag:
380
+ raise CipherTamperedException(ErrorMessage.TAMPERED_EXCEPTION.message)
381
+ if encrypt_tag != decrypt_tag:
382
+ raise CipherTamperedException(ErrorMessage.TAMPERED_EXCEPTION.message)
383
+ return
384
+ if cipher_handler is not None:
385
+ cipher_handler.cipher_header_data(
386
+ self._header_tag, header_fields_bytes,
387
+ self._algorithm.iv_len,
388
+ len(self._header_tag) - self._algorithm.iv_len)
389
+ except CipherTamperedException:
390
+ raise
391
+ except Exception as e:
392
+ raise CipherTamperedException(ErrorMessage.TAMPERED_EXCEPTION.message, e)
393
+
394
+ def serialize_file_fields(self):
395
+ try:
396
+ return self._iv + struct.pack(">q", self._content_length)
397
+ except Exception as e:
398
+ raise HuaweicloudException(ErrorMessage.SERIALIZE_EXCEPTION.message, e)
399
+
400
+ def get_file_header_length(self, algorithm):
401
+ return algorithm.iv_len + 8
402
+
403
+ def deserialize_file_fields(self, header_bytes, algorithm):
404
+ self._iv = header_bytes[:algorithm.iv_len]
405
+ self._content_length = struct.unpack(">q", header_bytes[algorithm.iv_len:])[0]
@@ -0,0 +1,166 @@
1
+ import struct
2
+ import io
3
+ from enum import Enum
4
+ from typing import Optional
5
+
6
+ from huaweicloud_encryptionsdk.model.enums.key_provider_enum import KeyProviderEnum
7
+ from huaweicloud_encryptionsdk.model.kms_config import KMSConfig
8
+ from huaweicloud_encryptionsdk.exception.errors import HuaweicloudException, ErrorMessage
9
+
10
+
11
+ class Discovery(Enum):
12
+ DISCOVERY = (True, 1)
13
+ NO_DISCOVERY = (False, 2)
14
+
15
+ def __init__(self, is_discovery, code):
16
+ self._is_discovery = is_discovery
17
+ self._code = code
18
+
19
+ @property
20
+ def is_discovery(self):
21
+ return self._is_discovery
22
+
23
+ @property
24
+ def code(self):
25
+ return self._code
26
+
27
+ @classmethod
28
+ def get_discovery_status(cls, code):
29
+ for d in cls:
30
+ if d.code == code:
31
+ return d.is_discovery
32
+ return False
33
+
34
+
35
+ class CiphertextDataKey:
36
+
37
+ def __init__(self, data_key=None, kms_config=None):
38
+ self._key_provider_length = 0
39
+ self._key_provider = b""
40
+ self._data_key = b""
41
+ self._data_key_length = 0
42
+ self._key_information_length = 0
43
+ self._key_information = b""
44
+ self._key_id = b""
45
+ self._region = b""
46
+ self._project_id = b""
47
+ self._end_point = b""
48
+ self._discovery = Discovery.NO_DISCOVERY
49
+ self._total_length = 0
50
+
51
+ if data_key is not None and kms_config is None:
52
+ self._data_key = data_key
53
+ self._data_key_length = len(data_key)
54
+ self._key_provider = KeyProviderEnum.LOCAL_PROVIDER.name.encode("utf-8")
55
+ self._key_provider_length = len(self._key_provider)
56
+ self._discovery = Discovery.NO_DISCOVERY
57
+ self._key_information = self._build_key_information(Discovery.NO_DISCOVERY)
58
+ self._key_information_length = len(self._key_information)
59
+ self._total_length = self._data_key_length + self._key_provider_length + self._key_information_length + 4
60
+ elif data_key is not None and kms_config is not None:
61
+ self._data_key = data_key
62
+ self._data_key_length = len(data_key)
63
+ self._key_id = (kms_config.key_id or "").encode("utf-8")
64
+ self._region = (kms_config.region or "").encode("utf-8")
65
+ self._project_id = (kms_config.project_id or "").encode("utf-8")
66
+ self._end_point = (kms_config.end_point or "").encode("utf-8")
67
+ self._key_provider = KeyProviderEnum.KMS_PROVIDER.name.encode("utf-8")
68
+ self._key_provider_length = len(self._key_provider)
69
+ self._discovery = Discovery.DISCOVERY
70
+ self._key_information = self._build_key_information(Discovery.DISCOVERY)
71
+ self._key_information_length = len(self._key_information)
72
+ self._total_length = self._data_key_length + self._key_provider_length + self._key_information_length + 4
73
+
74
+ @property
75
+ def data_key(self):
76
+ return self._data_key
77
+
78
+ @property
79
+ def key_id(self):
80
+ return self._key_id.decode("utf-8") if self._key_id else ""
81
+
82
+ @property
83
+ def region(self):
84
+ return self._region.decode("utf-8") if self._region else ""
85
+
86
+ @property
87
+ def project_id(self):
88
+ return self._project_id.decode("utf-8") if self._project_id else ""
89
+
90
+ @property
91
+ def end_point(self):
92
+ return self._end_point.decode("utf-8") if self._end_point else ""
93
+
94
+ @property
95
+ def discovery(self):
96
+ return self._discovery
97
+
98
+ def is_discovery(self):
99
+ return self._discovery.is_discovery
100
+
101
+ def _build_key_information(self, discovery):
102
+ buf = bytearray()
103
+ buf.append(discovery.code & 0xFF)
104
+ if discovery.is_discovery:
105
+ buf.append(len(self._key_id) & 0xFF)
106
+ buf.extend(self._key_id)
107
+ buf.append(len(self._region) & 0xFF)
108
+ buf.extend(self._region)
109
+ buf.append(len(self._project_id) & 0xFF)
110
+ buf.extend(self._project_id)
111
+ buf.append(len(self._end_point) & 0xFF)
112
+ buf.extend(self._end_point)
113
+ return bytes(buf)
114
+
115
+ def to_byte_array(self):
116
+ buf = bytearray(self._total_length)
117
+ offset = 0
118
+ buf[offset] = self._key_provider_length & 0xFF
119
+ offset += 1
120
+ buf[offset:offset + self._key_provider_length] = self._key_provider
121
+ offset += self._key_provider_length
122
+ buf[offset] = self._key_information_length & 0xFF
123
+ offset += 1
124
+ buf[offset:offset + self._key_information_length] = self._key_information
125
+ offset += self._key_information_length
126
+ struct.pack_into(">h", buf, offset, self._data_key_length)
127
+ offset += 2
128
+ buf[offset:offset + self._data_key_length] = self._data_key
129
+ return bytes(buf)
130
+
131
+ def from_data_stream(self, data_stream):
132
+ self._key_provider_length = struct.unpack(">B", data_stream.read(1))[0]
133
+ self._key_provider = data_stream.read(self._key_provider_length)
134
+ if len(self._key_provider) != self._key_provider_length:
135
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
136
+ self._key_information_length = struct.unpack(">B", data_stream.read(1))[0]
137
+ if self._key_information_length > 0:
138
+ self._key_information = data_stream.read(self._key_information_length)
139
+ if len(self._key_information) != self._key_information_length:
140
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
141
+ self._parse_key_information()
142
+ self._data_key_length = struct.unpack(">h", data_stream.read(2))[0]
143
+ self._data_key = data_stream.read(self._data_key_length)
144
+ if len(self._data_key) != self._data_key_length:
145
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
146
+ self._total_length = self._data_key_length + self._key_provider_length + self._key_information_length + 4
147
+
148
+ def _parse_key_information(self):
149
+ stream = io.BytesIO(self._key_information)
150
+ code = struct.unpack(">B", stream.read(1))[0]
151
+ if Discovery.get_discovery_status(code):
152
+ self._key_id = self._read_field(stream)
153
+ self._region = self._read_field(stream)
154
+ self._project_id = self._read_field(stream)
155
+ self._end_point = self._read_field(stream)
156
+ self._discovery = Discovery.DISCOVERY
157
+ else:
158
+ self._discovery = Discovery.DISCOVERY
159
+
160
+ @staticmethod
161
+ def _read_field(stream):
162
+ length = struct.unpack(">B", stream.read(1))[0]
163
+ field_bytes = stream.read(length)
164
+ if len(field_bytes) != length:
165
+ raise HuaweicloudException(ErrorMessage.SOURCE_FILE_INVALID.message)
166
+ return field_bytes
@@ -0,0 +1,11 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Generic, TypeVar, Optional
3
+
4
+ T = TypeVar("T")
5
+
6
+
7
+ @dataclass
8
+ class CryptoResult(Generic[T]):
9
+ result: Optional[T] = None
10
+ headers: Optional["CipherHeader"] = None
11
+ data_length: int = 0
@@ -0,0 +1,17 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Dict, List, Optional
3
+
4
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
5
+ from huaweicloud_encryptionsdk.model.key_capsule import KeyCapsule
6
+ from huaweicloud_encryptionsdk.model.ciphertext_data_key import CiphertextDataKey
7
+
8
+
9
+ @dataclass
10
+ class DataKeyMaterials:
11
+ plaintext_data_key: bytes = b""
12
+ ciphertext_data_keys: List[CiphertextDataKey] = field(default_factory=list)
13
+ encryption_contexts: Dict[str, str] = field(default_factory=dict)
14
+ crypto_algorithm: Optional[CryptoAlgorithm] = None
15
+ key_capsule: Optional[KeyCapsule] = None
16
+ policy_id: Optional[str] = None
17
+ key_policy: Optional[str] = None
@@ -0,0 +1,11 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from huaweicloud_encryptionsdk.model.cipher_header import CipherHeader
5
+ from huaweicloud_encryptionsdk.model.cipher_body import CipherBody
6
+
7
+
8
+ @dataclass
9
+ class DataMaterials:
10
+ cipher_body: Optional[CipherBody] = None
11
+ headers: Optional[CipherHeader] = None
File without changes
@@ -0,0 +1,28 @@
1
+ from enum import Enum
2
+
3
+
4
+ class AccessPointType(Enum):
5
+
6
+ ECS = (1, "ECS")
7
+ CUSTOM = (2, "Custom")
8
+ CCE = (3, "CCE")
9
+ MA = (4, "MA")
10
+
11
+ def __init__(self, code, display_name):
12
+ self._code = code
13
+ self._display_name = display_name
14
+
15
+ @property
16
+ def code(self):
17
+ return self._code
18
+
19
+ @property
20
+ def display_name(self):
21
+ return self._display_name
22
+
23
+ @classmethod
24
+ def get_display_name_by_code(cls, code):
25
+ for apt in cls:
26
+ if apt.code == code:
27
+ return apt.display_name
28
+ return "Unknown"