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.
- examples/file_encryption_example.py +57 -0
- examples/key_capsule_encryption_example.py +240 -0
- examples/kms_discovery_encryption_example.py +56 -0
- examples/local_aes_encryption_example.py +59 -0
- examples/test_rsa.py +42 -0
- examples/test_sm2.py +38 -0
- examples/test_sm4_cbc.py +37 -0
- examples/test_sm4_gcm.py +37 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/METADATA +18 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/RECORD +174 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/WHEEL +5 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/top_level.txt +3 -0
- huaweicloud_encryptionsdk/__init__.py +5 -0
- huaweicloud_encryptionsdk/_apig_sdk/__init__.py +1 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer.py +278 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer_v11.py +70 -0
- huaweicloud_encryptionsdk/_apig_sdk/sm3_hash.py +141 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/signer.py +174 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/consumer_client_adapter.py +59 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/http_client.py +211 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/client_consumer_worker.py +106 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/consumer_heartbeat.py +73 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/log_shard_consumer.py +179 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_check_point_tracker.py +120 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor_factory.py +3 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/check_point.py +20 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/consumer_config.py +27 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/log_data.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/task_result.py +40 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/consumer_fetch_task.py +53 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/initial_task.py +55 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/process_task.py +25 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/shutdown_task.py +24 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer_main.py +88 -0
- huaweicloud_encryptionsdk/_lts_sdk/parallel_main.py +64 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/call_back.py +7 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/accumulator.py +135 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_thread_pool.py +107 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_worker.py +124 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/mover.py +69 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/producer.py +98 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/http_client.py +63 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/simple_request.py +14 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/config.py +50 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/error.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log.py +87 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log_batch.py +154 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/lts_store.py +21 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/result.py +17 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/retry_queue.py +39 -0
- huaweicloud_encryptionsdk/_lts_sdk/serial_main.py +77 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/common.py +57 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/lts_threading.py +32 -0
- huaweicloud_encryptionsdk/cache/__init__.py +0 -0
- huaweicloud_encryptionsdk/cache/data_key_cache.py +79 -0
- huaweicloud_encryptionsdk/cache/local_data_key_cache.py +161 -0
- huaweicloud_encryptionsdk/common/__init__.py +0 -0
- huaweicloud_encryptionsdk/common/constants.py +15 -0
- huaweicloud_encryptionsdk/common/counting_output_stream.py +18 -0
- huaweicloud_encryptionsdk/common/crypto_factory.py +48 -0
- huaweicloud_encryptionsdk/common/ec_private_key_loader.py +43 -0
- huaweicloud_encryptionsdk/common/ecs_metadata_service.py +42 -0
- huaweicloud_encryptionsdk/common/file_path_for_example_constants.py +4 -0
- huaweicloud_encryptionsdk/common/utils.py +162 -0
- huaweicloud_encryptionsdk/exception/__init__.py +0 -0
- huaweicloud_encryptionsdk/exception/errors.py +109 -0
- huaweicloud_encryptionsdk/handler/__init__.py +0 -0
- huaweicloud_encryptionsdk/handler/cipher_handler.py +294 -0
- huaweicloud_encryptionsdk/handler/crypto_handler.py +24 -0
- huaweicloud_encryptionsdk/handler/default_crypto_handler.py +148 -0
- huaweicloud_encryptionsdk/handler/default_serialize_handler.py +45 -0
- huaweicloud_encryptionsdk/handler/file_decrypt_handler.py +101 -0
- huaweicloud_encryptionsdk/handler/file_encrypt_handler.py +30 -0
- huaweicloud_encryptionsdk/handler/serialize_handler.py +14 -0
- huaweicloud_encryptionsdk/huawei_config.py +49 -0
- huaweicloud_encryptionsdk/huawei_crypto.py +311 -0
- huaweicloud_encryptionsdk/keyrings/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/keyring.py +14 -0
- huaweicloud_encryptionsdk/keyrings/keyring_factory.py +10 -0
- huaweicloud_encryptionsdk/keyrings/kms_keyring_factory.py +21 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_discovery_keyring.py +51 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_key_capsule_keyring.py +100 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_keyring.py +155 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_multi_region_keyring.py +8 -0
- huaweicloud_encryptionsdk/keyrings/raw_keyring_factory.py +27 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_aes_keyring.py +63 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_keyring.py +112 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_rsa_keyring.py +55 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm2_keyring.py +75 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_cbc_keyring.py +66 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_keyring.py +70 -0
- huaweicloud_encryptionsdk/kms/__init__.py +0 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_request.py +35 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_request.py +32 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/kms_http_client.py +116 -0
- huaweicloud_encryptionsdk/log/__init__.py +0 -0
- huaweicloud_encryptionsdk/log/log_config.py +30 -0
- huaweicloud_encryptionsdk/log/log_file_backup.py +144 -0
- huaweicloud_encryptionsdk/log/log_metrics.py +132 -0
- huaweicloud_encryptionsdk/log/log_reporter_manager.py +163 -0
- huaweicloud_encryptionsdk/log/lts_sdk_producer.py +386 -0
- huaweicloud_encryptionsdk/log/lts_struct_log_builder.py +106 -0
- huaweicloud_encryptionsdk/meterialmanager/__init__.py +0 -0
- huaweicloud_encryptionsdk/meterialmanager/cache_crypto_meterial_manager.py +221 -0
- huaweicloud_encryptionsdk/meterialmanager/crypto_meterial_manager.py +19 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate.py +10 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate_factory.py +20 -0
- huaweicloud_encryptionsdk/meterialmanager/default_crypto_meterials_manager.py +71 -0
- huaweicloud_encryptionsdk/meterialmanager/key_capsule_data_key_generate.py +63 -0
- huaweicloud_encryptionsdk/meterialmanager/kms_data_key_generate.py +65 -0
- huaweicloud_encryptionsdk/meterialmanager/local_data_key_generate.py +13 -0
- huaweicloud_encryptionsdk/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/access_point_config.py +9 -0
- huaweicloud_encryptionsdk/model/cipher_body.py +81 -0
- huaweicloud_encryptionsdk/model/cipher_header.py +405 -0
- huaweicloud_encryptionsdk/model/ciphertext_data_key.py +166 -0
- huaweicloud_encryptionsdk/model/crypto_result.py +11 -0
- huaweicloud_encryptionsdk/model/data_key_materials.py +17 -0
- huaweicloud_encryptionsdk/model/data_materials.py +11 -0
- huaweicloud_encryptionsdk/model/enums/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/enums/access_point_type.py +28 -0
- huaweicloud_encryptionsdk/model/enums/crypto_algorithm.py +75 -0
- huaweicloud_encryptionsdk/model/enums/data_key_generate_type.py +20 -0
- huaweicloud_encryptionsdk/model/enums/key_provider_enum.py +19 -0
- huaweicloud_encryptionsdk/model/enums/keyring_type_enum.py +27 -0
- huaweicloud_encryptionsdk/model/key_capsule.py +10 -0
- huaweicloud_encryptionsdk/model/key_capsule_config.py +12 -0
- huaweicloud_encryptionsdk/model/kms_config.py +10 -0
- huaweicloud_encryptionsdk/model/request/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/request/encrypt_request.py +10 -0
- huaweicloud_encryptionsdk/model/request/sign_request.py +2 -0
- huaweicloud_encryptionsdk/model/request/verify_request.py +2 -0
- huaweicloud_encryptionsdk/proof/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/attestation_document.py +36 -0
- huaweicloud_encryptionsdk/proof/collector/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/collector/cce_proof_collector.py +24 -0
- huaweicloud_encryptionsdk/proof/collector/ecs_proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/collector/key_pair_proof_collector.py +55 -0
- huaweicloud_encryptionsdk/proof/collector/ma_proof_collector.py +51 -0
- huaweicloud_encryptionsdk/proof/private_key_decrypt_callback.py +7 -0
- huaweicloud_encryptionsdk/proof/proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/proof_collector_factory.py +53 -0
- huaweicloud_encryptionsdk/proof/proof_info.py +10 -0
- huaweicloud_encryptionsdk/util/__init__.py +0 -0
- huaweicloud_encryptionsdk/util/common_utils.py +12 -0
- tests/__init__.py +0 -0
- tests/test_enums.py +84 -0
- tests/test_exceptions.py +38 -0
- tests/test_factories.py +71 -0
- tests/test_huawei_crypto.py +67 -0
- tests/test_imports.py +46 -0
- tests/test_kms_models.py +95 -0
- tests/test_log_file_backup.py +45 -0
- tests/test_lts_struct_log_builder.py +97 -0
- tests/test_models.py +142 -0
- 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,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"
|