@@ -163,8 +163,8 @@ pub unsafe extern "C" fn key_manager_decap_and_seal(
163163 } ;
164164
165165 let key_record = match KEY_REGISTRY . get_key ( & uuid) {
166- Some ( record) => record,
167- None => return -1 ,
166+ Ok ( record) => record,
167+ Err ( _ ) => return -1 ,
168168 } ;
169169
170170 let ( hpke_algo, binding_public_key) = match & key_record. meta . spec {
@@ -184,9 +184,14 @@ pub unsafe extern "C" fn key_manager_decap_and_seal(
184184 let enc_key_slice = unsafe { slice:: from_raw_parts ( encapsulated_key, encapsulated_key_len) } ;
185185
186186 // Decapsulate
187- let mut shared_secret = match km_common:: crypto:: decaps ( & key_record. private_key , enc_key_slice)
187+ let private_key = match km_common:: crypto:: PrivateKey :: try_from ( key_record. private_key . as_bytes ( ) . to_vec ( ) ) {
188+ Ok ( pk) => pk,
189+ Err ( _) => return -3 ,
190+ } ;
191+
192+ let mut shared_secret = match km_common:: crypto:: decaps ( & private_key, enc_key_slice)
188193 {
189- Ok ( s ) => s ,
194+ Ok ( secret ) => secret ,
190195 Err ( _) => return -3 ,
191196 } ;
192197
@@ -198,10 +203,10 @@ pub unsafe extern "C" fn key_manager_decap_and_seal(
198203
199204 // Seal
200205 let ( new_enc_key, sealed_ciphertext) = match km_common:: crypto:: hpke_seal (
201- binding_public_key,
206+ & binding_public_key,
202207 & shared_secret,
203208 aad_slice,
204- hpke_algo,
209+ & hpke_algo,
205210 ) {
206211 Ok ( res) => res,
207212 Err ( _) => {
@@ -427,21 +432,22 @@ mod tests {
427432 fn test_destroy_kem_key_success ( ) {
428433 let binding_pubkey = [ 1u8 ; 32 ] ;
429434 let mut uuid_bytes = [ 0u8 ; 16 ] ;
430- let algo = HpkeAlgorithm {
435+ let algo = KmHpkeAlgorithm {
431436 kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
432437 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
433438 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
434439 } ;
435440
436441 unsafe {
442+ let mut pubkey_bytes = [ 0u8 ; 32 ] ;
437443 key_manager_generate_kem_keypair (
438444 algo,
439445 binding_pubkey. as_ptr ( ) ,
440446 binding_pubkey. len ( ) ,
441447 3600 ,
442448 uuid_bytes. as_mut_ptr ( ) ,
443- std :: ptr :: null_mut ( ) ,
444- std :: ptr :: null_mut ( ) ,
449+ pubkey_bytes . as_mut_ptr ( ) ,
450+ 32 ,
445451 ) ;
446452 }
447453
@@ -466,6 +472,38 @@ mod tests {
466472 assert_eq ! ( result, -1 ) ;
467473 }
468474
475+ #[ test]
476+ fn test_key_manager_generate_kem_keypair ( ) {
477+ // 1. Setup binding key
478+ let binding_kem_algo = KemAlgorithm :: DhkemX25519HkdfSha256 ;
479+ let ( binding_pk, _) = km_common:: crypto:: generate_x25519_keypair ( binding_kem_algo) . unwrap ( ) ;
480+
481+ // 2. Call generate_kem_keypair
482+ let mut uuid_bytes = [ 0u8 ; 16 ] ;
483+ let mut kem_pubkey_bytes = [ 0u8 ; 32 ] ;
484+ let kem_pubkey_len = 32 ;
485+ let algo = KmHpkeAlgorithm {
486+ kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
487+ kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
488+ aead : AeadAlgorithm :: Aes256Gcm as i32 ,
489+ } ;
490+ let result = unsafe {
491+ key_manager_generate_kem_keypair (
492+ algo,
493+ binding_pk. as_ptr ( ) ,
494+ binding_pk. len ( ) ,
495+ 3600 ,
496+ uuid_bytes. as_mut_ptr ( ) ,
497+ kem_pubkey_bytes. as_mut_ptr ( ) ,
498+ kem_pubkey_len,
499+ )
500+ } ;
501+
502+ assert_eq ! ( result, 0 ) ;
503+ assert_ne ! ( uuid_bytes, [ 0u8 ; 16 ] ) ;
504+ assert_ne ! ( kem_pubkey_bytes, [ 0u8 ; 32 ] ) ;
505+ }
506+
469507 #[ test]
470508 fn test_decap_and_seal_success ( ) {
471509 // 1. Setup binding key (receiver for seal)
@@ -476,12 +514,13 @@ mod tests {
476514 // 2. Generate KEM key in registry
477515 let mut uuid_bytes = [ 0u8 ; 16 ] ;
478516 let mut kem_pubkey_bytes = [ 0u8 ; 32 ] ;
479- let mut kem_pubkey_len = 32 ;
480- let algo = HpkeAlgorithm {
517+ let kem_pubkey_len = 32 ;
518+ let algo = KmHpkeAlgorithm {
481519 kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
482520 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
483521 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
484522 } ;
523+ let hpke_algo: HpkeAlgorithm = algo. into ( ) ;
485524 unsafe {
486525 key_manager_generate_kem_keypair (
487526 algo,
@@ -490,7 +529,7 @@ mod tests {
490529 3600 ,
491530 uuid_bytes. as_mut_ptr ( ) ,
492531 kem_pubkey_bytes. as_mut_ptr ( ) ,
493- & mut kem_pubkey_len,
532+ kem_pubkey_len,
494533 ) ;
495534 }
496535
@@ -499,7 +538,7 @@ mod tests {
499538 let aad = b"test_aad" ;
500539 // We use `hpke_seal_raw` to act as the client to generate a valid encapsulation
501540 let ( client_enc, client_ct) =
502- km_common:: crypto:: hpke_seal_raw ( & kem_pubkey_bytes, pt, aad, & algo ) . unwrap ( ) ;
541+ km_common:: crypto:: hpke_seal_raw ( & kem_pubkey_bytes, pt, aad, & hpke_algo ) . unwrap ( ) ;
503542
504543 // Step 3: Call `decap_and_seal`.
505544 let mut out_enc_key = [ 0u8 ; 32 ] ;
@@ -524,32 +563,33 @@ mod tests {
524563 assert_eq ! ( result, 0 ) ;
525564
526565 // 4. Verify we can decrypt the result using binding_sk
566+ let binding_sk_priv = km_common:: crypto:: PrivateKey :: try_from ( binding_sk. clone ( ) ) . unwrap ( ) ;
527567 let recovered_shared_secret =
528- km_common:: crypto:: hpke_open ( & binding_sk , & out_enc_key, & out_ct, aad, & algo )
568+ km_common:: crypto:: hpke_open ( & binding_sk_priv , & out_enc_key, & out_ct, aad, & hpke_algo )
529569 . expect ( "Failed to decrypt the resealed secret" ) ;
530570
531- assert_eq ! ( recovered_shared_secret. len( ) , 32 ) ;
571+ assert_eq ! ( recovered_shared_secret. as_slice ( ) . len( ) , 32 ) ;
532572
533573 // 5. Verify the recovered secret matches what decaps would produce
534574 let key_record = KEY_REGISTRY . get_key ( & Uuid :: from_bytes ( uuid_bytes) ) . unwrap ( ) ;
575+ let private_key = km_common:: crypto:: PrivateKey :: try_from ( key_record. private_key . as_bytes ( ) . to_vec ( ) ) . unwrap ( ) ;
535576 let expected_shared_secret = km_common:: crypto:: decaps (
536- key_record . private_key . as_bytes ( ) ,
577+ & private_key,
537578 & client_enc,
538- KemAlgorithm :: DhkemX25519HkdfSha256 ,
539579 )
540580 . expect ( "decaps failed" ) ;
541581 assert_eq ! (
542- recovered_shared_secret, expected_shared_secret,
582+ recovered_shared_secret. as_slice ( ) , expected_shared_secret. as_slice ( ) ,
543583 "Recovered secret mismatch"
544584 ) ;
545585
546586 // 6. Verify that this secret correctly decrypts the original client ciphertext
547587 // using the shared secret directly instead of the private key.
548588 let decrypted_pt = km_common:: crypto:: hpke_open_with_shared_secret (
549- & recovered_shared_secret,
589+ recovered_shared_secret. as_slice ( ) ,
550590 & client_ct,
551591 aad,
552- & algo ,
592+ & hpke_algo ,
553593 )
554594 . expect ( "Failed to decrypt client message with shared secret" ) ;
555595
@@ -610,20 +650,21 @@ mod tests {
610650
611651 // 2. Generate KEM key
612652 let mut uuid_bytes = [ 0u8 ; 16 ] ;
613- let algo = HpkeAlgorithm {
653+ let algo = KmHpkeAlgorithm {
614654 kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
615655 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
616656 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
617657 } ;
658+ let mut kem_pubkey_bytes = [ 0u8 ; 32 ] ;
618659 unsafe {
619660 key_manager_generate_kem_keypair (
620661 algo,
621662 binding_pk. as_ptr ( ) ,
622663 binding_pk. len ( ) ,
623664 3600 ,
624665 uuid_bytes. as_mut_ptr ( ) ,
625- std :: ptr :: null_mut ( ) ,
626- std :: ptr :: null_mut ( ) ,
666+ kem_pubkey_bytes . as_mut_ptr ( ) ,
667+ 32 ,
627668 ) ;
628669 }
629670
@@ -659,8 +700,14 @@ mod tests {
659700 // 2. Generate KEM key
660701 let mut uuid_bytes = [ 0u8 ; 16 ] ;
661702 let mut kem_pubkey_bytes = [ 0u8 ; 32 ] ;
703+ let mut kem_pubkey_bytes = [ 0u8 ; 32 ] ;
662704 let mut kem_pubkey_len = 32 ;
663- let algo = HpkeAlgorithm {
705+ let algo = KmHpkeAlgorithm {
706+ kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
707+ kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
708+ aead : AeadAlgorithm :: Aes256Gcm as i32 ,
709+ } ;
710+ let client_algo = HpkeAlgorithm {
664711 kem : KemAlgorithm :: DhkemX25519HkdfSha256 as i32 ,
665712 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
666713 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
@@ -673,13 +720,13 @@ mod tests {
673720 3600 ,
674721 uuid_bytes. as_mut_ptr ( ) ,
675722 kem_pubkey_bytes. as_mut_ptr ( ) ,
676- & mut kem_pubkey_len,
723+ kem_pubkey_len,
677724 ) ;
678725 }
679726
680727 // 3. Generate valid client encapsulation
681728 let ( client_enc, _) =
682- km_common:: crypto:: hpke_seal_raw ( & kem_pubkey_bytes, b"secret" , b"" , & algo ) . unwrap ( ) ;
729+ km_common:: crypto:: hpke_seal_raw ( & kem_pubkey_bytes, b"secret" , b"" , & client_algo ) . unwrap ( ) ;
683730
684731 // 4. Call with small output buffers
685732 let mut out_enc_key = [ 0u8 ; 31 ] ; // Small
0 commit comments