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,57 @@
1
+ import base64
2
+ import sys
3
+
4
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
5
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
6
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
7
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
8
+
9
+
10
+ def compare_file(source_file_path: str, target_file_path: str) -> bool:
11
+ import os
12
+ if os.path.getsize(source_file_path) != os.path.getsize(target_file_path):
13
+ return False
14
+ with open(source_file_path, "rb") as sf, open(target_file_path, "rb") as tf:
15
+ while True:
16
+ source_chunk = sf.read(1024)
17
+ target_chunk = tf.read(1024)
18
+ if not source_chunk:
19
+ break
20
+ if source_chunk != target_chunk:
21
+ return False
22
+ return True
23
+
24
+
25
+ def main():
26
+ if len(sys.argv) < 5:
27
+ print("Usage: python file_encryption_example.py <symmetric_key> <source_file> <encrypted_file> <decrypted_file>")
28
+ sys.exit(1)
29
+
30
+ symmetry_key = sys.argv[1]
31
+ source_file_path = sys.argv[2]
32
+ target_file_path = sys.argv[3]
33
+ backup_file_path = sys.argv[4]
34
+
35
+ huawei_config = HuaweiConfig(
36
+ crypto_algorithm=CryptoAlgorithm.AES_256_GCM_NOPADDING,
37
+ )
38
+
39
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_AES.type)
40
+
41
+ key_bytes = base64.b64decode(symmetry_key.encode("utf-8"))
42
+ keyring.set_symmetric_key([key_bytes])
43
+
44
+ huawei_crypto = HuaweiCrypto(huawei_config).with_keyring(keyring)
45
+
46
+ encryption_context = {"key": "value", "context": "encrypt"}
47
+
48
+ huawei_crypto.encrypt_file(source_file_path, target_file_path, encryption_context)
49
+
50
+ huawei_crypto.decrypt_file(target_file_path, backup_file_path)
51
+
52
+ assert compare_file(source_file_path, backup_file_path), "Decrypted file does not match original"
53
+ print("File encryption example completed successfully!")
54
+
55
+
56
+ if __name__ == "__main__":
57
+ main()
@@ -0,0 +1,240 @@
1
+ import base64
2
+ import logging
3
+ import os
4
+ import sys
5
+
6
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
7
+ from huaweicloud_encryptionsdk.cache.local_data_key_cache import LocalDataKeyCache
8
+ from huaweicloud_encryptionsdk.keyrings.kms_keyring_factory import KmsKeyringFactory
9
+ from huaweicloud_encryptionsdk.log.log_config import LogConfig
10
+ from huaweicloud_encryptionsdk.meterialmanager.cache_crypto_meterial_manager import CacheCryptoMaterialsManager
11
+ from huaweicloud_encryptionsdk.model.access_point_config import AccessPointConfig
12
+ from huaweicloud_encryptionsdk.model.kms_config import KMSConfig
13
+ from huaweicloud_encryptionsdk.model.key_capsule_config import KeyCapsuleConfig
14
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
15
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
16
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
17
+ from huaweicloud_encryptionsdk.common import utils as _utils
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ def bytes_to_hex(data: bytes) -> str:
23
+ return data.hex()
24
+
25
+
26
+ def load_properties(filepath: str) -> dict:
27
+ props = {}
28
+ with open(filepath, "r", encoding="utf-8") as f:
29
+ for line in f:
30
+ line = line.strip()
31
+ if not line or line.startswith("#"):
32
+ continue
33
+ sep = line.find("=")
34
+ if sep > 0:
35
+ key = line[:sep].strip()
36
+ value = line[sep + 1:].strip()
37
+ props[key] = value
38
+ return props
39
+
40
+
41
+ def main():
42
+ if len(sys.argv) < 2:
43
+ print("Usage: python key_capsule_encryption_example.py <config.properties>")
44
+ sys.exit(1)
45
+
46
+ props = load_properties(sys.argv[1])
47
+
48
+ ak = props.get("ak")
49
+ sk = props.get("sk")
50
+
51
+ kms_config_list = [KMSConfig(
52
+ region=props.get("kms.region"),
53
+ key_id=props.get("kms.keyId"),
54
+ project_id=props.get("kms.projectId"),
55
+ end_point=props.get("kms.endpoint"),
56
+ )]
57
+
58
+ access_point_config = AccessPointConfig(
59
+ type=int(props.get("keyCapsule.accessPointType", "2")),
60
+ encrypted_private_key=props.get("keyCapsule.encryptedPrivateKey"),
61
+ private_key_decrypt_callback=lambda encrypted_key: props.get("keyCapsule.plainPrivateKey"),
62
+ )
63
+
64
+ key_capsule_config = KeyCapsuleConfig(
65
+ region=props.get("keyCapsule.region"),
66
+ default_policy_id=props.get("keyCapsule.defaultPolicyId"),
67
+ default_key_policy=props.get("keyCapsule.defaultKeyPolicy"),
68
+ access_point_config=access_point_config,
69
+ )
70
+
71
+ log_enabled = props.get("log.enabled", "false").lower() == "true"
72
+ log_config = None
73
+ if log_enabled:
74
+ log_config = LogConfig(
75
+ log_group_id=props.get("log.groupId"),
76
+ log_stream_id=props.get("log.streamId"),
77
+ log_group_name=props.get("log.groupName", "DSC"),
78
+ log_stream_name=props.get("log.streamName", "crypto_operation_log"),
79
+ region=props.get("log.region"),
80
+ lts_endpoint=props.get("log.ltsEndpoint"),
81
+ project_id=props.get("log.projectId"),
82
+ batch_count_threshold=int(props.get("log.batchCountThreshold", "1000")),
83
+ linger_ms=int(props.get("log.lingerMs", "30000")),
84
+ batch_size_threshold_in_bytes=int(props.get("log.batchSizeThresholdInBytes", "524288")),
85
+ io_thread_count=int(props.get("log.ioThreadCount", "4")),
86
+ total_size_in_bytes=int(props.get("log.totalSizeInBytes", "104857600")),
87
+ max_block_ms=int(props.get("log.maxBlockMs", "0")),
88
+ retries=int(props.get("log.retries", "5")),
89
+ base_retry_backoff_ms=int(props.get("log.baseRetryBackoffMs", "100")),
90
+ max_retry_backoff_ms=int(props.get("log.maxRetryBackoffMs", "500")),
91
+ backup_dir=props.get("log.backupDir", "/home/logbackup"),
92
+ enable_recovery_on_startup=props.get("log.enableRecoveryOnStartup", "true").lower() == "true",
93
+ recovery_batch_size=int(props.get("log.recoveryBatchSize", "1000")),
94
+ recovery_batch_interval=int(props.get("log.recoveryBatchInterval", "1000")),
95
+ )
96
+
97
+ config = HuaweiConfig(
98
+ ak=ak,
99
+ sk=sk,
100
+ crypto_algorithm=CryptoAlgorithm.AES_256_GCM_NOPADDING,
101
+ kms_config_list=kms_config_list,
102
+ key_capsule_config=key_capsule_config,
103
+ log_config=log_config,
104
+ )
105
+
106
+ keyring = KmsKeyringFactory().get_keyring(KeyringTypeEnum.KMS_KEY_CAPSULE.type)
107
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
108
+
109
+ decrypt_config = HuaweiConfig(
110
+ ak=ak,
111
+ sk=sk,
112
+ key_capsule_config=key_capsule_config,
113
+ log_config=log_config,
114
+ )
115
+ decrypt_keyring = KmsKeyringFactory().get_keyring(KeyringTypeEnum.KMS_KEY_CAPSULE.type)
116
+ decrypt_crypto = HuaweiCrypto(decrypt_config).with_keyring(decrypt_keyring)
117
+
118
+ cache_enabled = props.get("cache.enabled", "false").lower() == "true"
119
+ if cache_enabled:
120
+ local_data_key_cache = LocalDataKeyCache()
121
+ local_data_key_cache.set_capacity(int(props.get("cache.capacity", "10")))
122
+ cache_manager = CacheCryptoMaterialsManager(local_data_key_cache, config)
123
+ cache_manager.set_max_byte_limit(int(props.get("cache.maxByteLimit", "3000")))
124
+ cache_manager.set_max_message_limit(int(props.get("cache.maxMessageLimit", "1000")))
125
+ cache_manager.set_survival_time(int(props.get("cache.survivalTime", "5000")))
126
+ crypto.with_crypto_material_manager(cache_manager)
127
+ decrypt_cache_manager = CacheCryptoMaterialsManager(local_data_key_cache, decrypt_config)
128
+ decrypt_cache_manager.set_max_byte_limit(int(props.get("cache.maxByteLimit", "3000")))
129
+ decrypt_cache_manager.set_max_message_limit(int(props.get("cache.maxMessageLimit", "1000")))
130
+ decrypt_cache_manager.set_survival_time(int(props.get("cache.survivalTime", "5000")))
131
+ decrypt_crypto.with_crypto_material_manager(decrypt_cache_manager)
132
+
133
+ test_file_enabled = props.get("test.file.enabled", "false").lower() == "true"
134
+ cross_lang_enabled = props.get("test.crossLang.enabled", "false").lower() == "true"
135
+
136
+ if cross_lang_enabled:
137
+ cross_lang_mode = props.get("test.crossLang.mode", "decrypt").lower()
138
+ if cross_lang_mode == "decrypt":
139
+ cipher_hex = props.get("test.crossLang.cipherHex", "")
140
+ if not cipher_hex:
141
+ logger.error("test.crossLang.cipherHex 未配置")
142
+ crypto.close()
143
+ decrypt_crypto.close()
144
+ os._exit(1)
145
+ cipher_data = bytes.fromhex(cipher_hex)
146
+ decrypt_result = decrypt_crypto.decrypt(cipher_data)
147
+ logger.info("跨语言解密成功: %s", decrypt_result.result.decode("utf-8"))
148
+ print("Cross-language decrypt passed! Plain text:", decrypt_result.result.decode("utf-8"))
149
+ elif cross_lang_mode == "encrypt":
150
+ plain_text = props.get("test.plainText", "Hello, Key Capsule!")
151
+ encrypt_request = EncryptRequest(plain_text=plain_text.encode("utf-8"))
152
+ custom_policy_id = props.get("test.encrypt.policyId")
153
+ custom_key_policy = props.get("test.encrypt.keyPolicy")
154
+ if custom_policy_id:
155
+ encrypt_request.policy_id = custom_policy_id
156
+ if custom_key_policy:
157
+ encrypt_request.key_policy = custom_key_policy
158
+ result = crypto.encrypt(encrypt_request)
159
+ cipher_hex = bytes_to_hex(result.result)
160
+ logger.info("跨语言加密成功, 密文HEX: %s", cipher_hex)
161
+
162
+ cipher_file_path = props.get("test.crossLang.cipherFile", "")
163
+ if cipher_file_path:
164
+ with open(cipher_file_path, "wb") as f:
165
+ f.write(result.result)
166
+ logger.info("密文已写入文件: %s", cipher_file_path)
167
+ else:
168
+ print("cipherHex=" + cipher_hex)
169
+ print("Cross-language encrypt passed!")
170
+ elif cross_lang_mode == "decryptFile":
171
+ cipher_file_path = props.get("test.crossLang.cipherFile", "")
172
+ if not cipher_file_path:
173
+ logger.error("test.crossLang.cipherFile 未配置")
174
+ crypto.close()
175
+ decrypt_crypto.close()
176
+ os._exit(1)
177
+ with open(cipher_file_path, "rb") as f:
178
+ cipher_data = f.read()
179
+ decrypt_result = decrypt_crypto.decrypt(cipher_data)
180
+ logger.info("跨语言文件解密成功: %s", decrypt_result.result.decode("utf-8"))
181
+ print("Cross-language decrypt file passed! Plain text:", decrypt_result.result.decode("utf-8"))
182
+ else:
183
+ logger.error("不支持的 test.crossLang.mode: %s (支持: decrypt/encrypt/decryptFile)", cross_lang_mode)
184
+ crypto.close()
185
+ decrypt_crypto.close()
186
+ os._exit(1)
187
+ elif test_file_enabled:
188
+ origin_file_path = props.get("test.file.path.origin")
189
+ encrypt_file_path = props.get("test.file.path.encrypt")
190
+ decrypt_file_path = props.get("test.file.path.decrypt")
191
+ crypto.encrypt_file(origin_file_path, encrypt_file_path, None)
192
+ logger.info("加密成功,源文件:%s,加密后文件:%s", origin_file_path, encrypt_file_path)
193
+ crypto.decrypt_file(encrypt_file_path, decrypt_file_path)
194
+ logger.info("解密成功:源文件:%s,解密后文件:%s", encrypt_file_path, decrypt_file_path)
195
+ else:
196
+ encrypt_request = EncryptRequest()
197
+ custom_policy_id = props.get("test.encrypt.policyId")
198
+ custom_key_policy = props.get("test.encrypt.keyPolicy")
199
+ if custom_policy_id:
200
+ encrypt_request.policy_id = custom_policy_id
201
+ if custom_key_policy:
202
+ encrypt_request.key_policy = custom_key_policy
203
+
204
+ plain_text = props.get("test.plainText", "Hello, Key Capsule!")
205
+ encrypt_request.plain_text = plain_text.encode("utf-8")
206
+ logger.info("原文: %s, HEX: %s", plain_text, bytes_to_hex(plain_text.encode("utf-8")))
207
+
208
+ # 第一次加密:创建密钥胶囊,生成数据密钥
209
+ result = crypto.encrypt(encrypt_request)
210
+ logger.info("第1次加密成功,密文HEX: %s", bytes_to_hex(result.result))
211
+
212
+ # 第二次加密:相同策略,命中加密缓存,复用数据密钥
213
+ plain_text2 = "xxxxxxxxxxxxxxxxxxxxxxxxxxssssssssssssss"
214
+ encrypt_request.plain_text = plain_text2.encode("utf-8")
215
+ result2 = crypto.encrypt(encrypt_request)
216
+ logger.info("第2次加密成功(命中加密缓存),密文HEX: %s", bytes_to_hex(result2.result))
217
+
218
+ # encHex1 = "0200020000010a6875617765692d6b6d737b012463633035383832662d366532362d346235372d613435302d6463353032306163663466340a636e2d6e6f7274682d372064346535353962343962336234303364613532373937323332393965643461362868747470733a2f2f6b6d732e636e2d6e6f7274682d372e6d79687561776569636c6f75642e636f6d01520101240030313965663362382d623235302d373030302d626334612d303761636162646136346232023d0082a8706f6c6963794964d92430313965663362662d343238332d373030302d623832342d356461666361326362306337a776657273696f6ea476312e30039c00050064006b98fe4b2aced0f515d0d49ce68a2cdd35d4da2f07072d05108dc5ad99570a6c635231abfef85cc9e82f082ed4a0b4e1bece2c25fedf2ec95430dc0763633035383832662d366532362d346235372d613435302d6463353032306163663466340000000014131211100f0e0d0c0b0a0908070605040302013c6dfd5c78023edf345ab0c6e5f60e0806e44ba6cb943733aa0f1e4d73718413044800304602210094322b0eeddc0c04f5744b7668f83e2492b3c5e8f611a5059ba5521aeb942dd90221009b9cf773b896a6dbee3fe52e523437f3f45ccef7cb1b407d4511b0d31352231d010c000002d40000002463633035383832662d366532362d346235372d613435302d646335303230616366346634000002a43031303132343030333033313339363536363333363233383264363233323335333032643337333033303330326436323633333436313264333033373631363336313632363436313336333436323332303233643030383261383730366636633639363337393439363464393234333033313339363536363333363236363264333433323338333332643337333033303330326436323338333233343264333536343631363636333631333236333632333036333337613737363635373237333639366636656134373633313265333030333963303030353030363430303662393866653462326163656430663531356430643439636536386132636464333564346461326630373037326430353130386463356164393935373061366336333532333161626665663835636339653832663038326564346130623465316265636532633235666564663265633935343330646330373633363333303335333833383332363632643336363533323336326433343632333533373264363133343335333032643634363333353330333233303631363336363334363633343030303030303030313431333132313131303066306530643063306230613039303830373036303530343033303230313363366466643563373830323365646633343561623063366535663630653038303665343462613663623934333733336161306631653464373337313834313330343438303033303436303232313030393433323262306565646463306330346635373434623736363866383365323439326233633565386636313161353035396261353532316165623934326464393032323130303962396366373733623839366136646265653366653532653532333433376633663435636365663763623162343037643435313162306433313335323233316400000001001ca65bef18a898010f701c7df2ab96ef7863d4c58c56086c19aaf48cd2240ed6b618f19470f42bccc90000000000000013a9bb136da90ef53d47207bb28a79619036b6e53483934fe0a3145687a048fba23db06a"
219
+ # encHex2 = "0200020000010a6875617765692d6b6d737b012463633035383832662d366532362d346235372d613435302d6463353032306163663466340a636e2d6e6f7274682d372064346535353962343962336234303364613532373937323332393965643461362868747470733a2f2f6b6d732e636e2d6e6f7274682d372e6d79687561776569636c6f75642e636f6d01510101240030313965663362382d623235302d373030302d626334612d303761636162646136346232023d0082a8706f6c6963794964d92430313965663362662d343238332d373030302d623832342d356461666361326362306337a776657273696f6ea476312e30039c0005006400ab449c495f299a35b8e01dff7444364d038afbd721eeba85faaf103f3bce848bc430e9d45dc9e9ab2fd1ee5287216e5f1552a2168c1894f94ddabeaf63633035383832662d366532362d346235372d613435302d6463353032306163663466340000000014131211100f0e0d0c0b0a0908070605040302017364ec6d796b69f52a79674f21d71ba9a5613594e0a8434205581372e55885f504470030450220765e71084e3768faabf363698a92b0be4c7f58c6d706ab86267870139f313ee0022100d5d93f83fdfe701b9286875c043d8820c319da8b085820dec42f511e09a0669d010c000002d20000002463633035383832662d366532362d346235372d613435302d646335303230616366346634000002a2303130313234303033303331333936353636333336323338326436323332333533303264333733303330333032643632363333343631326433303337363136333631363236343631333633343632333230323364303038326138373036663663363936333739343936346439323433303331333936353636333336323636326433343332333833333264333733303330333032643632333833323334326433353634363136363633363133323633363233303633333761373736363537323733363936663665613437363331326533303033396330303035303036343030616234343963343935663239396133356238653031646666373434343336346430333861666264373231656562613835666161663130336633626365383438626334333065396434356463396539616232666431656535323837323136653566313535326132313638633138393466393464646162656166363336333330333533383338333236363264333636353332333632643334363233353337326436313334333533303264363436333335333033323330363136333636333436363334303030303030303031343133313231313130306630653064306330623061303930383037303630353034303330323031373336346563366437393662363966353261373936373466323164373162613961353631333539346530613834333432303535383133373265353538383566353034343730303330343530323230373635653731303834653337363866616162663336333639386139326230626534633766353863366437303661623836323637383730313339663331336565303032323130306435643933663833666466653730316239323836383735633034336438383230633331396461386230383538323064656334326635313165303961303636396400000001001ca9b08b8751b75fdbb3b3ca65138a9c5de8ab50f451896d8a40041301ae1092d6ea48c33de6c961a7000000000000000f8a5e5b4a4befaea03920a18cbb6dfdf8ae1463cc3048f00da4b4b46f1591c8"
220
+
221
+ # 第一次解密:解密密钥胶囊
222
+ decrypt_result = decrypt_crypto.decrypt(result.result)
223
+ logger.info("第1次解密成功: %s", decrypt_result.result.decode("utf-8"))
224
+
225
+ # 第二次解密:同一密文,命中解密缓存
226
+ decrypt_result2 = decrypt_crypto.decrypt(result2.result)
227
+ logger.info("第2次解密成功: %s", decrypt_result2.result.decode("utf-8"))
228
+
229
+ assert plain_text.encode("utf-8") == decrypt_result.result, "Decrypted data does not match original"
230
+ assert plain_text2.encode("utf-8") == decrypt_result2.result, "Decrypted data from cache does not match original"
231
+ print("Key Capsule encryption example completed successfully!")
232
+
233
+ crypto.close()
234
+ decrypt_crypto.close()
235
+ os._exit(0)
236
+
237
+
238
+ if __name__ == "__main__":
239
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
240
+ main()
@@ -0,0 +1,56 @@
1
+ import os
2
+ import sys
3
+
4
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
5
+ from huaweicloud_encryptionsdk.model.kms_config import KMSConfig
6
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
7
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
8
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
9
+ from huaweicloud_encryptionsdk.keyrings.kms_keyring_factory import KmsKeyringFactory
10
+
11
+
12
+ def main():
13
+ if len(sys.argv) < 5:
14
+ print("Usage: python kms_discovery_encryption_example.py <project_id> <region> <key_id> <plain_text>")
15
+ sys.exit(1)
16
+
17
+ ak = os.environ.get("CLOUD_SDK_AK")
18
+ sk = os.environ.get("CLOUD_SDK_SK")
19
+
20
+ project_id = sys.argv[1]
21
+ region = sys.argv[2]
22
+ key_id = sys.argv[3]
23
+ plain_text = sys.argv[4]
24
+
25
+ kms_config_list = [KMSConfig(region=region, key_id=key_id, project_id=project_id)]
26
+
27
+ huawei_config = HuaweiConfig(
28
+ ak=ak,
29
+ sk=sk,
30
+ kms_config_list=kms_config_list,
31
+ crypto_algorithm=CryptoAlgorithm.AES_256_GCM_NOPADDING,
32
+ is_discovery=True,
33
+ )
34
+
35
+ keyring = KmsKeyringFactory().get_keyring(KeyringTypeEnum.KMS_MULTI_REGION.type)
36
+
37
+ huawei_crypto = HuaweiCrypto(huawei_config).with_keyring(keyring)
38
+
39
+ encryption_context = {"encryption": "context", "simple": "test", "caching": "encrypt"}
40
+
41
+ result = huawei_crypto.encrypt(
42
+ EncryptRequest(encryption_context=encryption_context, plain_text=plain_text.encode("utf-8"))
43
+ )
44
+
45
+ huawei_config_discovery = HuaweiConfig(ak=ak, sk=sk)
46
+ keyring_discovery = KmsKeyringFactory().get_keyring(KeyringTypeEnum.KMS_DISCOVERY.type)
47
+ huawei_crypto_decrypt = HuaweiCrypto(huawei_config_discovery).with_keyring(keyring_discovery)
48
+
49
+ decrypt_result = huawei_crypto_decrypt.decrypt(result.result)
50
+
51
+ assert plain_text.encode("utf-8") == decrypt_result.result, "Decrypted data does not match original"
52
+ print("KMS discovery encryption example completed successfully!")
53
+
54
+
55
+ if __name__ == "__main__":
56
+ main()
@@ -0,0 +1,59 @@
1
+ import base64
2
+ import logging
3
+ import sys
4
+
5
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
6
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
7
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
8
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
9
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ def bytes_to_hex(data: bytes) -> str:
15
+ return data.hex()
16
+
17
+
18
+ def main():
19
+ if len(sys.argv) < 2:
20
+ print("Usage: python local_aes_encryption_example.py <symmetric_key_base64> [plain_text]")
21
+ print(" symmetric_key_base64: Base64 encoded 16-byte (AES-128) or 32-byte (AES-256) key")
22
+ print(" plain_text: optional, default 'Hello, AES!'")
23
+ sys.exit(1)
24
+
25
+ symmetric_key = sys.argv[1]
26
+ plain_text = sys.argv[2] if len(sys.argv) > 2 else "Hello, AES!"
27
+
28
+ key_bytes = base64.b64decode(symmetric_key.encode("utf-8"))
29
+ key_len = len(key_bytes)
30
+ if key_len == 16:
31
+ algorithm = CryptoAlgorithm.AES_128_GCM_NOPADDING
32
+ elif key_len == 32:
33
+ algorithm = CryptoAlgorithm.AES_256_GCM_NOPADDING
34
+ else:
35
+ print(f"Error: key length must be 16 or 32 bytes, got {key_len}")
36
+ sys.exit(1)
37
+
38
+ config = HuaweiConfig(crypto_algorithm=algorithm)
39
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_AES.type)
40
+ keyring.set_symmetric_key([key_bytes])
41
+
42
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
43
+
44
+ encrypt_request = EncryptRequest(plain_text=plain_text.encode("utf-8"))
45
+ logger.info("原文: %s, HEX: %s", plain_text, bytes_to_hex(plain_text.encode("utf-8")))
46
+
47
+ result = crypto.encrypt(encrypt_request)
48
+ logger.info("加密成功,密文HEX: %s", bytes_to_hex(result.result))
49
+
50
+ decrypt_result = crypto.decrypt(result.result)
51
+ logger.info("解密成功: %s, HEX: %s", decrypt_result.result.decode("utf-8"), bytes_to_hex(decrypt_result.result))
52
+
53
+ assert plain_text.encode("utf-8") == decrypt_result.result, "Decrypted data does not match original"
54
+ print("Local AES encryption example completed successfully!")
55
+
56
+
57
+ if __name__ == "__main__":
58
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
59
+ main()
examples/test_rsa.py ADDED
@@ -0,0 +1,42 @@
1
+ import base64
2
+ import logging
3
+ import sys
4
+
5
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
6
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
7
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
8
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
9
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ RSA_PUB = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgxDL8ovgpDITH2v5QlRAsTJ9/toepH9dwyh+Nw+6LMS6Xlyp2QLrSLzPLpW0XsNFPYb6l910e7SpDOSuaualCNb3UqlIphiZmZ3DTzIqsSqY+rTY6S65oFM/wMstZjgy5DYwuNNMrB1JOuLb5JwX9inotcHel4UFH0OnjRzPj+PTfFqv+/PIA2yFBdKVMLqn0fjKRnTxKEhM1hRz/YRTVFwUqvSRbU/bqBmd/2chtRKi5gVpyx37/HYHdZywYSIf8ckM9hGsdxigAThmrLUKud7jOFSAHAtUSIlXTOhQRNWDSiPY9FDE4tCujoUOOGJ0WVaNHGQop8NjCPIlZUmj0QIDAQAB"
14
+ RSA_PRI = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDEMvyi+CkMhMfa/lCVECxMn3+2h6kf13DKH43D7osxLpeXKnZAutIvM8ulbRew0U9hvqX3XR7tKkM5K5q5qUI1vdSqUimGJmZncNPMiqxKpj6tNjpLrmgUz/Ayy1mODLkNjC400ysHUk64tvknBf2Kei1wd6XhQUfQ6eNHM+P49N8Wq/788gDbIUF0pUwuqfR+MpGdPEoSEzWFHP9hFNUXBSq9JFtT9uoGZ3/ZyG1EqLmBWnLHfv8dgd1nLBhIh/xyQz2Eax3GKABOGastQq53uM4VIAcC1RIiVdM6FBE1YNKI9j0UMTi0K6OhQ44YnRZVo0cZCinw2MI8iVlSaPRAgMBAAECggEAXg5Uvdehu1NwI7GBrBb4YfFhN93h9Zytddr+UJdJvMzlDcij3udYX9eXOtAWI5cwfkn6VbeH2yq30lfdzzt7nc9ep4RybTfkKrhrq87NklyGcgwMSbLNZX+4lat5Bg04gEtfRZPlRvKxVb/tm65lB7Plm2HoUoYUOe58NClDzvbeDHN/czJbk8EpJBi0re2czQ7NK0icS9zorhclhazssYKxBCS37cQDIgwr5+5HFIGpkZLirnB+yR+iGUelSsYLt+X+wQy+wp6ymhm0+poNOm3NbJbzmnY5b8OZJHai2k9OXVLvgA7F3IiTmZ20vG8wYkCWxX6B48jr40j/xfpMfQKBgQDam3UECjPdO4Z6asELsz93EeAVjxKUh48FQjJMOU0EYSyIGdcWDnVaiCiXq/26t0zBb7lYwNDVziD6c006UHxF7R26BGJm4pypQjTU9P4OrDd82sOn8UMi/QH/OAQNAF8KKah/o9la/EdLKS1SFtZppI1AN9/CMfm2pXXqLJ6tlwKBgQCZe/+p30P7URXggw3JtK9LXTNqIKFLDJGxjTuVhkURHNRnrHJvD46azjiG7qPzEt3pgB0+G7rGOuHLfrNBCPA8aQAMsZPAfciU1aq8Rsdab6XjL+7pvbNqlcCRsp75bM6bJ4pA3Qk86SF1zcTpvS91iEsqHvQ9bXMmV8F5ZNg21wKBgQCIIj8goOnjX2pDWa+WBa4EDFGrm0lKzZA3Ch4gcZ6Ql6MPrmfPCHn0Qs5khWqgl/1oiJa3untSaecHkD4LjouVUDAu4wQUZhKBJQWZiGed44k6a1FkiE3yv/Q6Zzu+jPiib4bK1dJJYslS+PWMJUSozRxZXXIukMidATUI+3hlSQKBgCUDt3ODKYTpWCpN0LxtO70kG+sjNWLBBD3afp0fxXZMCpl6CBrqmIyS4SUBVj6ftS7Du8mnrFJ0DtIhmx87BZy8AcwN40EP1Ji4MrW3KAqSVGJGxApQun0g4lEAz7/9UpIuZfQgmkK7QluDpVJtUo24sc/VqTdLNvLvRPR+snn/AoGAfrHketzlE6W9btyKcw7G6mf2utTdAkKaD/TFmVFCNtLc+Aw5cMlmWWhiMGP3ec0oFw9qHg1xUTdz38ThhRvThNlB/tbJbqscIfqC9+rY722GThZIl1jGCW8jR4O24lWS3jfF+B0iOdxFdTEn6bhTGtY5i4eZrqq7d44n70f3jRg="
15
+
16
+
17
+ def main():
18
+ rsa_pub = base64.b64decode(RSA_PUB)
19
+ rsa_pri = base64.b64decode(RSA_PRI)
20
+
21
+ config = HuaweiConfig(crypto_algorithm=CryptoAlgorithm.AES_256_GCM_NOPADDING)
22
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_RSA.type)
23
+ keyring.set_public_key([rsa_pub])
24
+ keyring.set_private_key([rsa_pri])
25
+
26
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
27
+
28
+ plain_text = b"Hello, RSA!"
29
+ req = EncryptRequest(plain_text=plain_text)
30
+ result = crypto.encrypt(req)
31
+ logger.info("加密成功, 密文HEX: %s", result.result.hex())
32
+
33
+ decrypt_result = crypto.decrypt(result.result)
34
+ logger.info("解密成功: %s", decrypt_result.result.decode("utf-8"))
35
+
36
+ assert plain_text == decrypt_result.result
37
+ print("RSA test passed!")
38
+
39
+
40
+ if __name__ == "__main__":
41
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
42
+ main()
examples/test_sm2.py ADDED
@@ -0,0 +1,38 @@
1
+ import logging
2
+ import sys
3
+
4
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
5
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
6
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
7
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
8
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ SM2_PRIVATE_KEY = "d7dd778833db7bca5f67a5df84497cc709f0bf1955146c8a82ab22a3d9566631"
13
+ SM2_PUBLIC_KEY = "da8582c7d9e6c621f9d4a56ff0b95e7544c14c37aa763ed160473ffa2c7acee333d02543c1e06eaf100fd479f98175f94021a35143aab17fff3d36e23295a45d"
14
+
15
+
16
+ def main():
17
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_SM2.type)
18
+ keyring.set_public_key([bytes.fromhex(SM2_PUBLIC_KEY)])
19
+ keyring.set_private_key([bytes.fromhex(SM2_PRIVATE_KEY)])
20
+
21
+ config = HuaweiConfig(crypto_algorithm=CryptoAlgorithm.SM4_128_GCM_NOPADDING)
22
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
23
+
24
+ plain_text = b"Hello, SM2!"
25
+ req = EncryptRequest(plain_text=plain_text)
26
+ result = crypto.encrypt(req)
27
+ logger.info("加密成功, 密文HEX: %s", result.result.hex())
28
+
29
+ decrypt_result = crypto.decrypt(result.result)
30
+ logger.info("解密成功: %s", decrypt_result.result.decode("utf-8"))
31
+
32
+ assert plain_text == decrypt_result.result
33
+ print("SM2 test passed!")
34
+
35
+
36
+ if __name__ == "__main__":
37
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
38
+ main()
@@ -0,0 +1,37 @@
1
+ import base64
2
+ import logging
3
+ import sys
4
+
5
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
6
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
7
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
8
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
9
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ def main():
15
+ key_bytes = base64.b64decode("I+BmZXZEftgtsDfs5YNnUg==")
16
+
17
+ config = HuaweiConfig(crypto_algorithm=CryptoAlgorithm.SM4_128_CBC_PADDING)
18
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_SM4_CBC.type)
19
+ keyring.set_symmetric_key([key_bytes])
20
+
21
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
22
+
23
+ plain_text = b"Hello, SM4-CBC!"
24
+ req = EncryptRequest(plain_text=plain_text)
25
+ result = crypto.encrypt(req)
26
+ logger.info("加密成功, 密文HEX: %s", result.result.hex())
27
+
28
+ decrypt_result = crypto.decrypt(result.result)
29
+ logger.info("解密成功: %s", decrypt_result.result.decode("utf-8"))
30
+
31
+ assert plain_text == decrypt_result.result
32
+ print("SM4-CBC test passed!")
33
+
34
+
35
+ if __name__ == "__main__":
36
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
37
+ main()
@@ -0,0 +1,37 @@
1
+ import base64
2
+ import logging
3
+ import sys
4
+
5
+ from huaweicloud_encryptionsdk import HuaweiCrypto, HuaweiConfig
6
+ from huaweicloud_encryptionsdk.keyrings.raw_keyring_factory import RawKeyringFactory
7
+ from huaweicloud_encryptionsdk.model.enums.crypto_algorithm import CryptoAlgorithm
8
+ from huaweicloud_encryptionsdk.model.enums.keyring_type_enum import KeyringTypeEnum
9
+ from huaweicloud_encryptionsdk.model.request.encrypt_request import EncryptRequest
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ def main():
15
+ key_bytes = base64.b64decode("I+BmZXZEftgtsDfs5YNnUg==")
16
+
17
+ config = HuaweiConfig(crypto_algorithm=CryptoAlgorithm.SM4_128_GCM_NOPADDING)
18
+ keyring = RawKeyringFactory().get_keyring(KeyringTypeEnum.RAW_SM4_GCM.type)
19
+ keyring.set_symmetric_key([key_bytes])
20
+
21
+ crypto = HuaweiCrypto(config).with_keyring(keyring)
22
+
23
+ plain_text = b"Hello, SM4-GCM!"
24
+ req = EncryptRequest(plain_text=plain_text)
25
+ result = crypto.encrypt(req)
26
+ logger.info("加密成功, 密文HEX: %s", result.result.hex())
27
+
28
+ decrypt_result = crypto.decrypt(result.result)
29
+ logger.info("解密成功: %s", decrypt_result.result.decode("utf-8"))
30
+
31
+ assert plain_text == decrypt_result.result
32
+ print("SM4-GCM test passed!")
33
+
34
+
35
+ if __name__ == "__main__":
36
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s")
37
+ main()
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.4
2
+ Name: huaweicloud-encryption-sdk-python
3
+ Version: 1.2.1
4
+ Summary: HuaweiCloud Encryption SDK for Python
5
+ License: Apache-2.0
6
+ Requires-Python: >=3.9
7
+ Requires-Dist: cryptography>=42.0.0
8
+ Requires-Dist: gmssl>=3.2.2
9
+ Requires-Dist: huaweicloudsdkkms>=3.1.190
10
+ Requires-Dist: huaweicloudsdkcore>=3.1.190
11
+ Requires-Dist: requests>=2.31.0
12
+ Requires-Dist: cachetools>=5.3.0
13
+ Provides-Extra: lts
14
+ Requires-Dist: loguru; extra == "lts"
15
+ Requires-Dist: six; extra == "lts"
16
+ Provides-Extra: dev
17
+ Requires-Dist: pytest>=7.0; extra == "dev"
18
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"