ucissl / docs /architecture.md
Jack698's picture
Upload folder using huggingface_hub
efadae0 verified

็ปŸไธ€ๅฏ†็ ๆœๅŠกๆŽฅๅฃๆžถๆž„่ฎพ่ฎก

1. ๆžถๆž„ๆฆ‚่ฟฐ

็ปŸไธ€ๅฏ†็ ๆœๅŠกๆŽฅๅฃ๏ผˆUCI๏ผ‰้‡‡็”จๅˆ†ๅฑ‚ๆžถๆž„่ฎพ่ฎก๏ผŒ้€š่ฟ‡ๆŠฝ่ฑกใ€้€‚้…ๅ’Œๆณจๅ†Œๆœบๅˆถ๏ผŒๅฎž็Žฐไบ†ๅฏน็ปๅ…ธๅฏ†็ ็ฎ—ๆณ•ใ€ๆŠ—้‡ๅญๅฏ†็ ็ฎ—ๆณ•ๅ’Œๆททๅˆๅฏ†็ ๆ–นๆกˆ็š„็ปŸไธ€ๅฐ่ฃ…ใ€‚

1.1 ่ฎพ่ฎก็›ฎๆ ‡

  1. ๆŽฅๅฃ็ปŸไธ€: ๆไพ›ไธ€่‡ด็š„API๏ผŒๅฑ่”ฝๅบ•ๅฑ‚็ฎ—ๆณ•ๅฎž็Žฐๅทฎๅผ‚
  2. ็ฎ—ๆณ•ๆ•ๆท: ๆ”ฏๆŒ่ฟ่กŒๆ—ถๅŠจๆ€้€‰ๆ‹ฉๅ’Œๅˆ‡ๆข็ฎ—ๆณ•
  3. ๆ˜“ไบŽๆ‰ฉๅฑ•: ๆ–ฐๅขž็ฎ—ๆณ•ๆ— ้œ€ไฟฎๆ”นๆ ธๅฟƒๆŽฅๅฃไปฃ็ 
  4. ๅ‘ๅŽๅ…ผๅฎน: ไฟ่ฏๆŽฅๅฃ็จณๅฎšๆ€ง๏ผŒๆ”ฏๆŒ้•ฟๆœŸ็ปดๆŠค
  5. ๆ€ง่ƒฝไผ˜ๅŒ–: ๆœ€ๅฐๅŒ–ๆŠฝ่ฑกๅฑ‚ๅผ€้”€

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)๏ผŒๅฏไผ˜ๅŒ–ไธบ๏ผš

  1. ๅ“ˆๅธŒ่กจ: ไฝฟ็”จ็ฎ—ๆณ•IDไฝœไธบ้”ฎ๏ผŒO(1)ๆŸฅๆ‰พ
  2. ๅˆ†็ฑป็ดขๅผ•: ๆŒ‰็ฑปๅž‹ๅˆ†็ป„๏ผŒๅ‡ๅฐ‘ๆœ็ดข็ฉบ้—ด
  3. ็ผ“ๅญ˜: ็ผ“ๅญ˜ๆœ€่ฟ‘ไฝฟ็”จ็š„็ฎ—ๆณ•ๅฎž็Žฐ

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 ้”™่ฏฏๅค„็†็ญ–็•ฅ

  1. ๆŽฅๅฃๅฑ‚: ้ชŒ่ฏๅ‚ๆ•ฐ๏ผŒ่ฟ”ๅ›žUCI_ERROR_INVALID_PARAM
  2. ๆณจๅ†Œ่กจๅฑ‚: ็ฎ—ๆณ•ๆœชๆ‰พๅˆฐ๏ผŒ่ฟ”ๅ›žUCI_ERROR_ALGORITHM_NOT_FOUND
  3. ้€‚้…ๅ™จๅฑ‚: ๆ•่Žทๅบ•ๅฑ‚้”™่ฏฏ๏ผŒ่ฝฌๆขไธบUCI้”™่ฏฏ็ 
  4. ๅบ•ๅฑ‚ๅบ“: ไธ็›ดๆŽฅๆšด้œฒ็ป™ๅบ”็”จ

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(&registry_mutex);
    // ... ๆŸฅๆ‰พ็ฎ—ๆณ•
    pthread_mutex_unlock(&registry_mutex);
    return impl;
}

ๆ–นๆกˆ2: ่ฏปๅ†™้”

static pthread_rwlock_t registry_rwlock = PTHREAD_RWLOCK_INITIALIZER;

int registry_register_algorithm(...) {
    pthread_rwlock_wrlock(&registry_rwlock);
    // ... ๆณจๅ†Œ
    pthread_rwlock_unlock(&registry_rwlock);
}

const uci_algorithm_impl_t *registry_get_algorithm(...) {
    pthread_rwlock_rdlock(&registry_rwlock);
    // ... ๆŸฅๆ‰พ
    pthread_rwlock_unlock(&registry_rwlock);
}

ๆ–นๆกˆ3: ๆ— ้”่ฎพ่ฎก

  • ๆณจๅ†Œ่กจๅœจๅˆๅง‹ๅŒ–ๅŽไธๅ†ไฟฎๆ”น
  • ไฝฟ็”จๅŽŸๅญๆ“ไฝœๆ ‡่ฎฐๅˆๅง‹ๅŒ–็Šถๆ€
  • ็ฎ—ๆณ•ๅฎž็Žฐๆœฌ่บซๆ— ็Šถๆ€

7. ๆ€ง่ƒฝไผ˜ๅŒ–

7.1 ๅทฒๅฎž็Žฐ็š„ไผ˜ๅŒ–

  1. ๆŒ‡้’ˆไผ ้€’: ้ฟๅ…ๅคง็ป“ๆž„ไฝ“ๆ‹ท่ด
  2. ้›ถๆ‹ท่ด: ๅฏ†้’ฅๅ’Œ็ญพๅไฝฟ็”จๆŒ‡้’ˆ๏ผŒไธ้ขๅค–ๆ‹ท่ด
  3. ๆŒ‰้œ€็ผ–่ฏ‘: ้€š่ฟ‡ๆกไปถ็ผ–่ฏ‘ๆŽ’้™คๆœชไฝฟ็”จ็š„็ฎ—ๆณ•

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 ๆทปๅŠ ๆ–ฐ็ฎ—ๆณ•

ๆญฅ้ชค๏ผš

  1. ๅœจ uci_algorithm_id_t ๆžšไธพไธญๆทปๅŠ ๆ–ฐID
  2. ๅฎž็Žฐ้€‚้…ๅ™จๅ‡ฝๆ•ฐ
  3. ๅœจ้€‚้…ๅ™จๅˆๅง‹ๅŒ–ๆ—ถๆณจๅ†Œ็ฎ—ๆณ•

็คบไพ‹๏ผšๆทปๅŠ 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็š„ๆžถๆž„่ฎพ่ฎก้ตๅพชไปฅไธ‹ๅŽŸๅˆ™๏ผš

  1. ๅˆ†ๅฑ‚ๆธ…ๆ™ฐ: ่Œ่ดฃๅˆ†็ฆป๏ผŒไพฟไบŽ็ปดๆŠคๅ’Œๆต‹่ฏ•
  2. ้ซ˜ๅ†…่šไฝŽ่€ฆๅˆ: ๆฏๅฑ‚็‹ฌ็ซ‹๏ผŒๆŽฅๅฃๆ˜Ž็กฎ
  3. ๅฏๆ‰ฉๅฑ•ๆ€ง: ๆ’ไปถๅผๆžถๆž„๏ผŒๆ˜“ไบŽๆทปๅŠ ๆ–ฐ็ฎ—ๆณ•
  4. ๆ€ง่ƒฝไผ˜ๅ…ˆ: ๆœ€ๅฐๅŒ–ๆŠฝ่ฑกๅผ€้”€
  5. ๅฎ‰ๅ…จ็ฌฌไธ€: ๅ†…ๅญ˜ๅฎ‰ๅ…จ๏ผŒ้”™่ฏฏๅค„็†ๅฎŒๅ–„

่ฟ™็งๆžถๆž„ไธบๆŠ—้‡ๅญๅฏ†็ ่ฟ็งปๆไพ›ไบ†ๅšๅฎž็š„ๆŠ€ๆœฏๅŸบ็ก€๏ผŒๆ”ฏๆŒ็ปๅ…ธใ€ๆŠ—้‡ๅญๅ’Œๆททๅˆๅฏ†็ ๆ–นๆกˆ็š„ๅนณๆป‘่ฟ‡ๆธกๅ’Œ้•ฟๆœŸๆผ”่ฟ›ใ€‚