็ปไธๅฏ็ ๆๅกๆฅๅฃๆถๆ่ฎพ่ฎก
1. ๆถๆๆฆ่ฟฐ
็ปไธๅฏ็ ๆๅกๆฅๅฃ๏ผUCI๏ผ้็จๅๅฑๆถๆ่ฎพ่ฎก๏ผ้่ฟๆฝ่ฑกใ้้ ๅๆณจๅๆบๅถ๏ผๅฎ็ฐไบๅฏน็ปๅ ธๅฏ็ ็ฎๆณใๆ้ๅญๅฏ็ ็ฎๆณๅๆททๅๅฏ็ ๆนๆก็็ปไธๅฐ่ฃ ใ
1.1 ่ฎพ่ฎก็ฎๆ
- ๆฅๅฃ็ปไธ: ๆไพไธ่ด็API๏ผๅฑ่ฝๅบๅฑ็ฎๆณๅฎ็ฐๅทฎๅผ
- ็ฎๆณๆๆท: ๆฏๆ่ฟ่กๆถๅจๆ้ๆฉๅๅๆข็ฎๆณ
- ๆไบๆฉๅฑ: ๆฐๅข็ฎๆณๆ ้ไฟฎๆนๆ ธๅฟๆฅๅฃไปฃ็
- ๅๅๅ ผๅฎน: ไฟ่ฏๆฅๅฃ็จณๅฎๆง๏ผๆฏๆ้ฟๆ็ปดๆค
- ๆง่ฝไผๅ: ๆๅฐๅๆฝ่ฑกๅฑๅผ้
1.2 ็ณป็ปๆถๆๅพ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅบ็จๅฑ (Application) โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Webๆๅก โ โ ็งปๅจๅบ็จ โ โ IoT่ฎพๅค โ โ ๅบๅ้พ โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็ปไธๅฏ็ ๆฅๅฃๅฑ (Unified Interface) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ uci_init() / uci_cleanup() โ โ
โ โ uci_keygen() / uci_keypair_free() โ โ
โ โ uci_sign() / uci_verify() โ โ
โ โ uci_encrypt() / uci_decrypt() โ โ
โ โ uci_kem_keygen() / uci_kem_encaps() / uci_kem_decaps() โ
โ โ uci_get_algorithm_info() / uci_list_algorithms() โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็ฎๆณๆณจๅ็ฎก็ๅฑ (Algorithm Registry) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Algorithm Registry Table โ โ
โ โ โโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโ โ โ
โ โ โ Alg 1 โ Alg 2 โ Alg 3 โ ... โ Alg N โ โ โ
โ โ โโโโโโโโโโผโโโโโโโโโผโโโโโโโโโผโโโโโโโโโผโโโโโโโโโค โ โ
โ โ โ Info โ Info โ Info โ ... โ Info โ โ โ
โ โ โ Impl โ Impl โ Impl โ ... โ Impl โ โ โ
โ โ โโโโโโโโโโดโโโโโโโโโดโโโโโโโโโดโโโโโโโโโดโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ้้
ๅจๅฑ (Adapter Layer) โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Classic โ โ Post-Quantum โ โ Hybrid โ โ
โ โ Adapter โ โ Adapter โ โ Adapter โ โ
โ โ โ โ โ โ โ โ
โ โ - RSA โ โ - Dilithium โ โ - RSA+Dil. โ โ
โ โ - ECDSA โ โ - Falcon โ โ - ECDSA+Dil. โ โ
โ โ - SM2 โ โ - Kyber โ โ - RSA+Kyber โ โ
โ โ โ โ - NTRU โ โ - ECDH+Kyber โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅบๅฑๅฏ็ ๅบ (Crypto Libraries) โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ OpenSSL โ โ LibOQS โ โ GmSSL โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2. ๆจกๅ่ฏฆ็ป่ฎพ่ฎก
2.1 ็ปไธๆฅๅฃๅฑ (Unified Interface Layer)
2.1.1 ่่ดฃ
- ๆไพ็ปไธ็ๅค้จAPI
- ๅๆฐ้ช่ฏๅ้่ฏฏๅค็
- ่ฐ็จ็ฎๆณๆณจๅๅฑ่ทๅๅ ทไฝๅฎ็ฐ
- ่ตๆบ็ๅฝๅจๆ็ฎก็
2.1.2 ๆ ธๅฟๆฐๆฎ็ปๆ
// ๅฏ้ฅๅฏน็ปๆ
typedef struct {
uci_algorithm_id_t algorithm;
uci_algorithm_type_t type;
uint8_t *public_key;
size_t public_key_len;
uint8_t *private_key;
size_t private_key_len;
} uci_keypair_t;
// ็ญพๅ็ปๆ
typedef struct {
uci_algorithm_id_t algorithm;
uint8_t *data;
size_t data_len;
} uci_signature_t;
// ๅฏๆ็ปๆ
typedef struct {
uci_algorithm_id_t algorithm;
uint8_t *ciphertext;
size_t ciphertext_len;
} uci_ciphertext_t;
// KEMๅฐ่ฃ
็ปๆ
typedef struct {
uint8_t *shared_secret;
size_t shared_secret_len;
uint8_t *ciphertext;
size_t ciphertext_len;
} uci_kem_encaps_result_t;
// ็ฎๆณไฟกๆฏ
typedef struct {
const char *name;
uci_algorithm_id_t id;
uci_algorithm_type_t type;
size_t public_key_len;
size_t private_key_len;
size_t signature_len;
size_t ciphertext_overhead;
uint32_t security_level;
} uci_algorithm_info_t;
2.1.3 ๆฅๅฃ่ฎพ่ฎกๆจกๅผ
ๅๅงๅๆจกๅผ: ๅไพๅๅงๅ๏ผไฟ่ฏ่ตๆบๆญฃ็กฎๅ้
int uci_init(void) {
// 1. ๅๅงๅๆณจๅ่กจ
// 2. ๅๅงๅๅ้้
ๅจ
// 3. ๆณจๅๆๆ็ฎๆณ
}
ๅทฅๅๆจกๅผ: ้่ฟ็ฎๆณIDๅๅปบๅฏ้ฅๅฏน
int uci_keygen(uci_algorithm_id_t algorithm, uci_keypair_t *keypair) {
// 1. ๆฅๆพ็ฎๆณๅฎ็ฐ
// 2. ่ฐ็จๅฏนๅบ็keygenๅฝๆฐ
// 3. ่ฎพ็ฝฎๅฏ้ฅๅฏน็็ฎๆณๆ ่ฏ
}
็ญ็ฅๆจกๅผ: ๆ นๆฎ็ฎๆณ้ๆฉไธๅ็็ญพๅ็ญ็ฅ
int uci_sign(const uci_keypair_t *keypair, ...) {
// 1. ๆ นๆฎkeypair->algorithmๆฅๆพๅฎ็ฐ
// 2. ่ฐ็จๅฏนๅบ็signๅฝๆฐ
}
2.2 ็ฎๆณๆณจๅ็ฎก็ๅฑ (Algorithm Registry)
2.2.1 ่่ดฃ
- ็ปดๆค็ฎๆณๆณจๅ่กจ
- ๆไพ็ฎๆณๆฅ่ฏขๅๆไธพๅ่ฝ
- ็ฎก็็ฎๆณๅฎ็ฐ็็ๅฝๅจๆ
2.2.2 ๆณจๅ่กจ็ปๆ
typedef struct {
uci_algorithm_info_t info; // ็ฎๆณๅ
ไฟกๆฏ
uci_keygen_func_t keygen; // ๅฏ้ฅ็ๆๅฝๆฐๆ้
uci_sign_func_t sign; // ็ญพๅๅฝๆฐๆ้
uci_verify_func_t verify; // ้ช่ฏๅฝๆฐๆ้
uci_encrypt_func_t encrypt; // ๅ ๅฏๅฝๆฐๆ้
uci_decrypt_func_t decrypt; // ่งฃๅฏๅฝๆฐๆ้
uci_kem_keygen_func_t kem_keygen; // KEMๅฏ้ฅ็ๆ
uci_kem_encaps_func_t kem_encaps; // KEMๅฐ่ฃ
uci_kem_decaps_func_t kem_decaps; // KEM่งฃๅฐ่ฃ
} uci_algorithm_impl_t;
// ๅ
จๅฑๆณจๅ่กจ
static uci_algorithm_impl_t *algorithm_table[MAX_ALGORITHMS];
static size_t algorithm_count = 0;
2.2.3 ๆณจๅๆบๅถ
// ้้
ๅจๅๅงๅๆถๆณจๅ็ฎๆณ
int classic_adapter_init(void) {
uci_algorithm_impl_t impl;
// ่ฎพ็ฝฎ็ฎๆณไฟกๆฏ
impl.info.name = "RSA-2048";
impl.info.id = UCI_ALG_RSA2048;
impl.info.type = UCI_ALG_TYPE_CLASSIC;
// ... ๅ
ถไปไฟกๆฏ
// ่ฎพ็ฝฎๅฝๆฐๆ้
impl.keygen = classic_rsa2048_keygen;
impl.sign = classic_rsa2048_sign;
impl.verify = classic_rsa2048_verify;
// ... ๅ
ถไปๅฝๆฐ
// ๆณจๅๅฐๆณจๅ่กจ
registry_register_algorithm(&impl);
}
2.2.4 ๆฅ่ฏขไผๅ
ๅฝๅๅฎ็ฐไฝฟ็จ็บฟๆงๆฅๆพO(n)๏ผๅฏไผๅไธบ๏ผ
- ๅๅธ่กจ: ไฝฟ็จ็ฎๆณIDไฝไธบ้ฎ๏ผO(1)ๆฅๆพ
- ๅ็ฑป็ดขๅผ: ๆ็ฑปๅๅ็ป๏ผๅๅฐๆ็ดข็ฉบ้ด
- ็ผๅญ: ็ผๅญๆ่ฟไฝฟ็จ็็ฎๆณๅฎ็ฐ
2.3 ้้ ๅจๅฑ (Adapter Layer)
2.3.1 ็ปๅ ธๅฏ็ ้้ ๅจ
่ฎพ่ฎก่ฆ็น:
- ๅฐ่ฃ OpenSSL/GmSSL็ๅคๆAPI
- ๅค็ๅฏน่ฑกๅๅปบๅ้ๆฏ
- ็ปไธ้่ฏฏๅค็
็คบไพ๏ผRSA้้
int classic_rsa2048_keygen(uci_keypair_t *keypair) {
// 1. ๅๅปบOpenSSL RSAๅฏน่ฑก
RSA *rsa = RSA_new();
BIGNUM *bn = BN_new();
BN_set_word(bn, RSA_F4);
// 2. ็ๆๅฏ้ฅ
RSA_generate_key_ex(rsa, 2048, bn, NULL);
// 3. ๅฏผๅบไธบDERๆ ผๅผ
unsigned char *pub_der = NULL;
int pub_len = i2d_RSA_PUBKEY(rsa, &pub_der);
unsigned char *priv_der = NULL;
int priv_len = i2d_RSAPrivateKey(rsa, &priv_der);
// 4. ่ฝฌๆขไธบUCIๆ ผๅผ
keypair->public_key = malloc(pub_len);
memcpy(keypair->public_key, pub_der, pub_len);
keypair->public_key_len = pub_len;
keypair->private_key = malloc(priv_len);
memcpy(keypair->private_key, priv_der, priv_len);
keypair->private_key_len = priv_len;
// 5. ๆธ
็OpenSSLๅฏน่ฑก
OPENSSL_free(pub_der);
OPENSSL_free(priv_der);
BN_free(bn);
RSA_free(rsa);
return UCI_SUCCESS;
}
2.3.2 ๆ้ๅญๅฏ็ ้้ ๅจ
่ฎพ่ฎก่ฆ็น:
- ๅฉ็จLibOQS็็ธๅฏน็ปไธๆฅๅฃ
- ๅค็ๅคงๅฐบๅฏธๅฏ้ฅๅ็ญพๅ
- ็กฎไฟๅ ๅญๅฎๅ จ
็คบไพ๏ผDilithium้้
int pqc_dilithium2_keygen(uci_keypair_t *keypair) {
OQS_SIG *sig = OQS_SIG_new(OQS_SIG_alg_dilithium_2);
if (!sig) return UCI_ERROR_INTERNAL;
// ๅ้
ๅ
ๅญ
keypair->public_key = malloc(sig->length_public_key);
keypair->private_key = malloc(sig->length_secret_key);
// ็ๆๅฏ้ฅ
if (OQS_SIG_keypair(sig, keypair->public_key,
keypair->private_key) != OQS_SUCCESS) {
free(keypair->public_key);
free(keypair->private_key);
OQS_SIG_free(sig);
return UCI_ERROR_INTERNAL;
}
keypair->public_key_len = sig->length_public_key;
keypair->private_key_len = sig->length_secret_key;
OQS_SIG_free(sig);
return UCI_SUCCESS;
}
2.3.3 ๆททๅๅฏ็ ้้ ๅจ
่ฎพ่ฎก่ฆ็น:
- ็ปๅ็ปๅ ธๅๆ้ๅญ็ฎๆณ
- ๅๅนถๅฏ้ฅๅ็ญพๅๆ ผๅผ
- ๅฎ็ฐๅ้้ช่ฏ้ป่พ
ๆททๅๅฏ้ฅๆ ผๅผ:
Hybrid Public Key:
[classic_pk_len(8)] [classic_pk] [pq_pk_len(8)] [pq_pk]
Hybrid Private Key:
[classic_sk_len(8)] [classic_sk] [pq_sk_len(8)] [pq_sk]
Hybrid Signature:
[classic_sig_len(8)] [classic_sig] [pq_sig_len(8)] [pq_sig]
็คบไพ๏ผๆททๅ็ญพๅ
int hybrid_rsa_dilithium_sign(const uci_keypair_t *keypair, ...) {
// 1. ่งฃๆๆททๅๅฏ้ฅ
extract_classic_key(keypair, &classic_keypair);
extract_pq_key(keypair, &pq_keypair);
// 2. ๅๅซ็ญพๅ
classic_rsa2048_sign(&classic_keypair, message, len, &classic_sig);
pqc_dilithium2_sign(&pq_keypair, message, len, &pq_sig);
// 3. ็ปๅ็ญพๅ
combine_signatures(&classic_sig, &pq_sig, signature);
return UCI_SUCCESS;
}
3. ๆฐๆฎๆตๅๆ
3.1 ๅฏ้ฅ็ๆๆต็จ
ๅบ็จ่ฐ็จ uci_keygen(UCI_ALG_DILITHIUM2, &keypair)
โ
[็ปไธๆฅๅฃๅฑ]
- ๅๆฐ้ช่ฏ
- ่ฎพ็ฝฎ keypair.algorithm = UCI_ALG_DILITHIUM2
โ
[ๆณจๅ่กจๅฑ]
- ๆฅๆพ UCI_ALG_DILITHIUM2 ็ๅฎ็ฐ
- ่ฟๅ uci_algorithm_impl_t*
โ
[้้
ๅจๅฑ]
- ่ฐ็จ pqc_dilithium2_keygen(&keypair)
โ
[LibOQS]
- OQS_SIG_new(OQS_SIG_alg_dilithium_2)
- OQS_SIG_keypair(sig, pk, sk)
โ
[้้
ๅจๅฑ]
- ๅ้
UCIๅฏ้ฅ็ปๆๅ
ๅญ
- ๆท่ดๅฏ้ฅๆฐๆฎ
- ่ฎพ็ฝฎๅฏ้ฅ้ฟๅบฆ
โ
[็ปไธๆฅๅฃๅฑ]
- ่ฟๅ UCI_SUCCESS
โ
ๅบ็จ่ทๅพ keypair๏ผๅ
ๅซๅ
ฌ้ฅๅ็ง้ฅ๏ผ
3.2 ็ญพๅๆต็จ
ๅบ็จ่ฐ็จ uci_sign(&keypair, message, len, &signature)
โ
[็ปไธๆฅๅฃๅฑ]
- ๅๆฐ้ช่ฏ๏ผkeypair != NULL, message != NULL็ญ๏ผ
- ๆ นๆฎ keypair.algorithm ๆฅๆพๅฎ็ฐ
โ
[ๆณจๅ่กจๅฑ]
- ๆฅๆพ็ฎๆณๅฎ็ฐ
- ่ทๅ sign ๅฝๆฐๆ้
โ
[้้
ๅจๅฑ]
- ๆ นๆฎ็ฎๆณ็ฑปๅ่ฐ็จ็ธๅบ็็ญพๅๅฝๆฐ
- pqc_dilithium2_sign(&keypair, message, len, &signature)
โ
[LibOQS]
- OQS_SIG_sign(sig, sig_buf, &sig_len, msg, msg_len, sk)
โ
[้้
ๅจๅฑ]
- ๅ้
็ญพๅ็ปๆๅ
ๅญ
- signature.data = malloc(sig_len)
- memcpy(signature.data, sig_buf, sig_len)
- signature.data_len = sig_len
โ
[็ปไธๆฅๅฃๅฑ]
- signature.algorithm = keypair.algorithm
- ่ฟๅ UCI_SUCCESS
โ
ๅบ็จ่ทๅพ signature
3.3 ้ช่ฏๆต็จ
ๅบ็จ่ฐ็จ uci_verify(&keypair, message, len, &signature)
โ
[็ปไธๆฅๅฃๅฑ]
- ๅๆฐ้ช่ฏ
- ๆฃๆฅ keypair.algorithm == signature.algorithm
- ๆฅๆพ็ฎๆณๅฎ็ฐ
โ
[ๆณจๅ่กจๅฑ]
- ่ฟๅ verify ๅฝๆฐๆ้
โ
[้้
ๅจๅฑ]
- pqc_dilithium2_verify(&keypair, message, len, &signature)
โ
[LibOQS]
- OQS_SIG_verify(sig, msg, msg_len, sig_data, sig_len, pk)
- ่ฟๅ OQS_SUCCESS ๆ OQS_ERROR
โ
[้้
ๅจๅฑ]
- ่ฝฌๆขไธบ UCI ้่ฏฏ็
- OQS_SUCCESS โ UCI_SUCCESS
- OQS_ERROR โ UCI_ERROR_SIGNATURE_INVALID
โ
[็ปไธๆฅๅฃๅฑ]
- ่ฟๅ้ช่ฏ็ปๆ
โ
ๅบ็จๅคๆญ็ญพๅๆฏๅฆๆๆ
4. ้่ฏฏๅค็ๆบๅถ
4.1 ้่ฏฏ็ ่ฎพ่ฎก
#define UCI_SUCCESS 0 // ๆๅ
#define UCI_ERROR_INVALID_PARAM -1 // ๅๆฐ้่ฏฏ
#define UCI_ERROR_NOT_SUPPORTED -2 // ๆไฝไธๆฏๆ
#define UCI_ERROR_BUFFER_TOO_SMALL -3 // ็ผๅฒๅบๅคชๅฐ
#define UCI_ERROR_ALGORITHM_NOT_FOUND -4 // ็ฎๆณๆชๆพๅฐ
#define UCI_ERROR_INTERNAL -5 // ๅ
้จ้่ฏฏ
#define UCI_ERROR_SIGNATURE_INVALID -6 // ็ญพๅๆ ๆ
4.2 ้่ฏฏๅค็็ญ็ฅ
- ๆฅๅฃๅฑ: ้ช่ฏๅๆฐ๏ผ่ฟๅUCI_ERROR_INVALID_PARAM
- ๆณจๅ่กจๅฑ: ็ฎๆณๆชๆพๅฐ๏ผ่ฟๅUCI_ERROR_ALGORITHM_NOT_FOUND
- ้้ ๅจๅฑ: ๆ่ทๅบๅฑ้่ฏฏ๏ผ่ฝฌๆขไธบUCI้่ฏฏ็
- ๅบๅฑๅบ: ไธ็ดๆฅๆด้ฒ็ปๅบ็จ
4.3 ้่ฏฏไผ ๆญ่ทฏๅพ
ๅบๅฑๅบ้่ฏฏ (OQS_ERROR)
โ ้้
ๅจๆ่ท
้้
ๅจๅฑ้่ฏฏ (UCI_ERROR_INTERNAL)
โ ๅไธ่ฟๅ
็ปไธๆฅๅฃๅฑ้่ฏฏ
โ ๅบ็จๅค็
ๅบ็จๅฑ (if (ret != UCI_SUCCESS) { ... })
5. ๅ ๅญ็ฎก็็ญ็ฅ
5.1 ๅ ๅญๆๆๆ่งๅ
ๅฏ้ฅๅฏน:
uci_keygen()ๅ้ ๅฏ้ฅๅ ๅญ- ๅบ็จ่ด่ดฃ่ฐ็จ
uci_keypair_free()้ๆพ - ไธๅ ่ฎธๅคๆฌก้ๆพ๏ผfreeๅๆ้็ฝฎNULL๏ผ
็ญพๅ:
uci_sign()ๅ้ ็ญพๅๅ ๅญ- ๅบ็จ่ด่ดฃ่ฐ็จ
uci_signature_free()้ๆพ
KEM็ปๆ:
uci_kem_encaps()ๅ้ ๅ ฑไบซๅฏ้ฅๅๅฏๆๅ ๅญ- ๅบ็จ่ด่ดฃ่ฐ็จ
uci_kem_encaps_result_free()้ๆพ
5.2 ๅ ๅญๆณๆผ้ฒๆค
int uci_keypair_free(uci_keypair_t *keypair) {
if (!keypair) return UCI_ERROR_INVALID_PARAM;
if (keypair->public_key) {
// ๅฏ้๏ผๆธ
้ถๆๆๆฐๆฎ
memset(keypair->public_key, 0, keypair->public_key_len);
free(keypair->public_key);
keypair->public_key = NULL;
}
if (keypair->private_key) {
memset(keypair->private_key, 0, keypair->private_key_len);
free(keypair->private_key);
keypair->private_key = NULL;
}
keypair->public_key_len = 0;
keypair->private_key_len = 0;
return UCI_SUCCESS;
}
5.3 ๅ ๅญๆฑ ไผๅ๏ผๆชๆฅ๏ผ
ๅฏนไบ้ข็น็ๅฏ้ฅ็ๆๅ็ญพๅๆไฝ๏ผๅฏๅฎ็ฐๅ ๅญๆฑ ๏ผ
typedef struct {
void *pool;
size_t block_size;
size_t num_blocks;
// ...
} uci_memory_pool_t;
uci_memory_pool_t *uci_create_memory_pool(size_t block_size, size_t num_blocks);
void *uci_pool_alloc(uci_memory_pool_t *pool);
void uci_pool_free(uci_memory_pool_t *pool, void *ptr);
6. ็บฟ็จๅฎๅ จๆง
6.1 ๅฝๅๅฎ็ฐ
ๅฝๅๅฎ็ฐไธๆฏ็บฟ็จๅฎๅ จ็๏ผไธป่ฆ้ฎ้ข๏ผ
- ๅ จๅฑๆณจๅ่กจๆ ้ไฟๆค
- ็ฎๆณๅๅงๅไธๆฏๅๅญๆไฝ
6.2 ็บฟ็จๅฎๅ จๆน่ฟๆนๆก
ๆนๆก1: ๅ จๅฑไบๆฅ้
static pthread_mutex_t registry_mutex = PTHREAD_MUTEX_INITIALIZER;
const uci_algorithm_impl_t *registry_get_algorithm(uci_algorithm_id_t alg) {
pthread_mutex_lock(®istry_mutex);
// ... ๆฅๆพ็ฎๆณ
pthread_mutex_unlock(®istry_mutex);
return impl;
}
ๆนๆก2: ่ฏปๅ้
static pthread_rwlock_t registry_rwlock = PTHREAD_RWLOCK_INITIALIZER;
int registry_register_algorithm(...) {
pthread_rwlock_wrlock(®istry_rwlock);
// ... ๆณจๅ
pthread_rwlock_unlock(®istry_rwlock);
}
const uci_algorithm_impl_t *registry_get_algorithm(...) {
pthread_rwlock_rdlock(®istry_rwlock);
// ... ๆฅๆพ
pthread_rwlock_unlock(®istry_rwlock);
}
ๆนๆก3: ๆ ้่ฎพ่ฎก
- ๆณจๅ่กจๅจๅๅงๅๅไธๅไฟฎๆน
- ไฝฟ็จๅๅญๆไฝๆ ่ฎฐๅๅงๅ็ถๆ
- ็ฎๆณๅฎ็ฐๆฌ่บซๆ ็ถๆ
7. ๆง่ฝไผๅ
7.1 ๅทฒๅฎ็ฐ็ไผๅ
- ๆ้ไผ ้: ้ฟๅ ๅคง็ปๆไฝๆท่ด
- ้ถๆท่ด: ๅฏ้ฅๅ็ญพๅไฝฟ็จๆ้๏ผไธ้ขๅคๆท่ด
- ๆ้็ผ่ฏ: ้่ฟๆกไปถ็ผ่ฏๆ้คๆชไฝฟ็จ็็ฎๆณ
7.2 ๅฏไผๅ็น
ๅๅธ่กจๆณจๅ่กจ
#define REGISTRY_HASH_SIZE 64
typedef struct registry_node {
uci_algorithm_impl_t impl;
struct registry_node *next;
} registry_node_t;
static registry_node_t *registry_hash_table[REGISTRY_HASH_SIZE];
static inline int hash_algorithm_id(uci_algorithm_id_t id) {
return id % REGISTRY_HASH_SIZE;
}
ๅ ่ๅ ณ้ฎๅฝๆฐ
static inline const uci_algorithm_impl_t *
fast_get_algorithm(uci_algorithm_id_t id) {
int hash = hash_algorithm_id(id);
for (registry_node_t *node = registry_hash_table[hash];
node != NULL; node = node->next) {
if (node->impl.info.id == id) {
return &node->impl;
}
}
return NULL;
}
็ญ่ทฏๅพไผๅ
// ็ผๅญๆ่ฟไฝฟ็จ็็ฎๆณ
static __thread const uci_algorithm_impl_t *last_used_impl = NULL;
static __thread uci_algorithm_id_t last_used_id = 0;
const uci_algorithm_impl_t *registry_get_algorithm(uci_algorithm_id_t id) {
if (id == last_used_id && last_used_impl) {
return last_used_impl; // ๅฟซ้่ทฏๅพ
}
// ๆ
ข้่ทฏๅพ๏ผๆฅๆพๆณจๅ่กจ
const uci_algorithm_impl_t *impl = slow_lookup(id);
if (impl) {
last_used_id = id;
last_used_impl = impl;
}
return impl;
}
8. ๅฏๆฉๅฑๆง่ฎพ่ฎก
8.1 ๆทปๅ ๆฐ็ฎๆณ
ๆญฅ้ชค๏ผ
- ๅจ
uci_algorithm_id_tๆไธพไธญๆทปๅ ๆฐID - ๅฎ็ฐ้้ ๅจๅฝๆฐ
- ๅจ้้ ๅจๅๅงๅๆถๆณจๅ็ฎๆณ
็คบไพ๏ผๆทปๅ SPHINCS+
// 1. ๆทปๅ ID
typedef enum {
// ... ็ฐๆID
UCI_ALG_SPHINCS_SHA256_128F = 220,
} uci_algorithm_id_t;
// 2. ๅฎ็ฐ้้
ๅจ
int pqc_sphincs_sha256_128f_keygen(uci_keypair_t *keypair) {
return pqc_sig_keygen(OQS_SIG_alg_sphincs_sha256_128f_simple, keypair);
}
int pqc_sphincs_sha256_128f_sign(...) { /* ... */ }
int pqc_sphincs_sha256_128f_verify(...) { /* ... */ }
// 3. ๆณจๅ
int pqc_adapter_init(void) {
// ... ็ฐๆๆณจๅ
uci_algorithm_impl_t impl;
memset(&impl, 0, sizeof(impl));
impl.info.name = "SPHINCS+-SHA256-128f";
impl.info.id = UCI_ALG_SPHINCS_SHA256_128F;
impl.info.type = UCI_ALG_TYPE_POST_QUANTUM;
impl.keygen = pqc_sphincs_sha256_128f_keygen;
impl.sign = pqc_sphincs_sha256_128f_sign;
impl.verify = pqc_sphincs_sha256_128f_verify;
registry_register_algorithm(&impl);
}
8.2 ๆทปๅ ๆฐๆไฝ
ๅฝๅๆฏๆ็ๆไฝ๏ผ
- ๅฏ้ฅ็ๆ
- ็ญพๅ/้ช่ฏ
- ๅ ๅฏ/่งฃๅฏ
- KEMๅฐ่ฃ /่งฃๅฐ่ฃ
ๆชๆฅๅฏ่ฝ็ๆฉๅฑ:
- ๅฏ้ฅๅๅ๏ผDH, ECDH๏ผ
- ๅๅธๅฝๆฐ๏ผSHA-256, SHA-3, SM3๏ผ
- ๅฏน็งฐๅ ๅฏ๏ผAES, SM4๏ผ
- ๆถๆฏ่ฎค่ฏ็ ๏ผHMAC, CMAC๏ผ
ๆฉๅฑๆนๆณ:
// ๅจ uci_algorithm_impl_t ไธญๆทปๅ ๆฐๅฝๆฐๆ้
typedef struct {
// ... ็ฐๆๅญๆฎต
uci_hash_func_t hash;
uci_mac_func_t mac;
} uci_algorithm_impl_t;
// ๅจ็ปไธๆฅๅฃไธญๆทปๅ ๆฐAPI
int uci_hash(uci_algorithm_id_t algorithm,
const uint8_t *input, size_t input_len,
uint8_t *output, size_t *output_len);
9. ้จ็ฝฒๆถๆ
9.1 ๅไฝๅบ็จ้จ็ฝฒ
Application Binary
โโโ UCI Library (libuci.so)
โโโ LibOQS (liboqs.so)
โโโ GmSSL (libgmssl.so)
โโโ OpenSSL (libssl.so, libcrypto.so)
9.2 ๅพฎๆๅกๆถๆ
โโโโโโโโโโโโโโโโโโโ
โ Application โ
โโโโโโโโโโฌโโโโโโโโโ
โ HTTP/gRPC
โ
โโโโโโโโโโโโโโโโโโโ
โ Crypto Service โ โ UCI Library
โ (Container) โ
โโโโโโโโโโฌโโโโโโโโโ
โ
โ
โโโโโโโโโโโโโโโโโโโ
โ Key Management โ
โ Service โ
โโโโโโโโโโโโโโโโโโโ
9.3 ็กฌไปถๅ ้ๅบๆฏ
Application
โ
UCI Library
โ (ๅจๆ้ๆฉ)
โโโโโโโโโโโโโฌโโโโโโโโโโโโฌโโโโโโโโโโโโ
โ Software โ Hardware โ Cloud โ
โ Adapter โ Adapter โ Adapter โ
โโโโโโโโโโโโโดโโโโโโโโโโโโดโโโโโโโโโโโโ
โ โ โ
LibOQS HSM/TPM Cloud KMS
10. ๆป็ป
UCI็ๆถๆ่ฎพ่ฎก้ตๅพชไปฅไธๅๅ๏ผ
- ๅๅฑๆธ ๆฐ: ่่ดฃๅ็ฆป๏ผไพฟไบ็ปดๆคๅๆต่ฏ
- ้ซๅ ่ไฝ่ฆๅ: ๆฏๅฑ็ฌ็ซ๏ผๆฅๅฃๆ็กฎ
- ๅฏๆฉๅฑๆง: ๆไปถๅผๆถๆ๏ผๆไบๆทปๅ ๆฐ็ฎๆณ
- ๆง่ฝไผๅ : ๆๅฐๅๆฝ่ฑกๅผ้
- ๅฎๅ จ็ฌฌไธ: ๅ ๅญๅฎๅ จ๏ผ้่ฏฏๅค็ๅฎๅ
่ฟ็งๆถๆไธบๆ้ๅญๅฏ็ ่ฟ็งปๆไพไบๅๅฎ็ๆๆฏๅบ็ก๏ผๆฏๆ็ปๅ ธใๆ้ๅญๅๆททๅๅฏ็ ๆนๆก็ๅนณๆป่ฟๆธกๅ้ฟๆๆผ่ฟใ