@@ -108,10 +108,20 @@ pub unsafe extern "C" fn key_manager_generate_kem_keypair(
108108/// * `aad_len` - The length of the AAD.
109109/// * `out_encapsulated_key` - A pointer to a buffer where the new encapsulated key will be written.
110110/// * `out_encapsulated_key_len` - A pointer to a `usize` containing the size of `out_encapsulated_key`.
111- /// On success, updated with the actual size.
111+ /// On success, updated with the actual size.
112112/// * `out_ciphertext` - A pointer to a buffer where the sealed ciphertext will be written.
113113/// * `out_ciphertext_len` - A pointer to a `usize` containing the size of `out_ciphertext`.
114- /// On success, updated with the actual size.
114+ /// On success, updated with the actual size.
115+ ///
116+ /// ## Safety
117+ /// This function is unsafe because it dereferences raw pointers. The caller must ensure that:
118+ /// * `uuid_bytes` points to a valid 16-byte buffer.
119+ /// * `encapsulated_key` points to a valid buffer of at least `encapsulated_key_len` bytes.
120+ /// * `aad` is either null or points to a valid buffer of at least `aad_len` bytes.
121+ /// * `out_encapsulated_key` points to a valid buffer of at least `*out_encapsulated_key_len` bytes.
122+ /// * `out_encapsulated_key_len` points to a valid `usize`.
123+ /// * `out_ciphertext` points to a valid buffer of at least `*out_ciphertext_len` bytes.
124+ /// * `out_ciphertext_len` points to a valid `usize`.
115125///
116126/// ## Returns
117127/// * `0` on success.
@@ -120,7 +130,7 @@ pub unsafe extern "C" fn key_manager_generate_kem_keypair(
120130/// * `-3` if decapsulation fails.
121131/// * `-4` if sealing (HPKE encryption) fails.
122132#[ unsafe( no_mangle) ]
123- pub extern "C" fn key_manager_decap_and_seal (
133+ pub unsafe extern "C" fn key_manager_decap_and_seal (
124134 uuid_bytes : * const u8 ,
125135 encapsulated_key : * const u8 ,
126136 encapsulated_key_len : usize ,
@@ -437,16 +447,17 @@ mod tests {
437447 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
438448 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
439449 } ;
440-
441- key_manager_generate_kem_keypair (
442- algo,
443- binding_pk. as_ptr ( ) ,
444- binding_pk. len ( ) ,
445- 3600 ,
446- uuid_bytes. as_mut_ptr ( ) ,
447- kem_pubkey_bytes. as_mut_ptr ( ) ,
448- & mut kem_pubkey_len,
449- ) ;
450+ unsafe {
451+ key_manager_generate_kem_keypair (
452+ algo,
453+ binding_pk. as_ptr ( ) ,
454+ binding_pk. len ( ) ,
455+ 3600 ,
456+ uuid_bytes. as_mut_ptr ( ) ,
457+ kem_pubkey_bytes. as_mut_ptr ( ) ,
458+ & mut kem_pubkey_len,
459+ ) ;
460+ }
450461
451462 // 3. Generate a "client" ciphertext/encapsulation targeting KEM key.
452463 let pt = b"ignored_plaintext" ;
@@ -461,17 +472,19 @@ mod tests {
461472 let mut out_ct = [ 0u8 ; 48 ] ; // 32 bytes secret + 16 tag
462473 let mut out_ct_len = 48 ;
463474
464- let result = key_manager_decap_and_seal (
465- uuid_bytes. as_ptr ( ) ,
466- client_enc. as_ptr ( ) ,
467- client_enc. len ( ) ,
468- aad. as_ptr ( ) ,
469- aad. len ( ) ,
470- out_enc_key. as_mut_ptr ( ) ,
471- & mut out_enc_key_len,
472- out_ct. as_mut_ptr ( ) ,
473- & mut out_ct_len,
474- ) ;
475+ let result = unsafe {
476+ key_manager_decap_and_seal (
477+ uuid_bytes. as_ptr ( ) ,
478+ client_enc. as_ptr ( ) ,
479+ client_enc. len ( ) ,
480+ aad. as_ptr ( ) ,
481+ aad. len ( ) ,
482+ out_enc_key. as_mut_ptr ( ) ,
483+ & mut out_enc_key_len,
484+ out_ct. as_mut_ptr ( ) ,
485+ & mut out_ct_len,
486+ )
487+ } ;
475488
476489 assert_eq ! ( result, 0 ) ;
477490
@@ -515,17 +528,19 @@ mod tests {
515528 let mut out_ct = [ 0u8 ; 48 ] ;
516529 let mut out_ct_len = 48 ;
517530
518- let result = key_manager_decap_and_seal (
519- [ 0u8 ; 16 ] . as_ptr ( ) ,
520- [ 0u8 ; 32 ] . as_ptr ( ) ,
521- 32 ,
522- std:: ptr:: null ( ) ,
523- 0 ,
524- out_enc_key. as_mut_ptr ( ) ,
525- & mut out_enc_key_len,
526- out_ct. as_mut_ptr ( ) ,
527- & mut out_ct_len,
528- ) ;
531+ let result = unsafe {
532+ key_manager_decap_and_seal (
533+ [ 0u8 ; 16 ] . as_ptr ( ) ,
534+ [ 0u8 ; 32 ] . as_ptr ( ) ,
535+ 32 ,
536+ std:: ptr:: null ( ) ,
537+ 0 ,
538+ out_enc_key. as_mut_ptr ( ) ,
539+ & mut out_enc_key_len,
540+ out_ct. as_mut_ptr ( ) ,
541+ & mut out_ct_len,
542+ )
543+ } ;
529544
530545 assert_eq ! ( result, -1 ) ;
531546 }
@@ -535,17 +550,19 @@ mod tests {
535550 let mut out_enc_key = [ 0u8 ; 32 ] ;
536551 let mut out_enc_key_len = 32 ;
537552
538- let result = key_manager_decap_and_seal (
539- std:: ptr:: null ( ) ,
540- std:: ptr:: null ( ) ,
541- 0 ,
542- std:: ptr:: null ( ) ,
543- 0 ,
544- out_enc_key. as_mut_ptr ( ) ,
545- & mut out_enc_key_len,
546- std:: ptr:: null_mut ( ) ,
547- std:: ptr:: null_mut ( ) ,
548- ) ;
553+ let result = unsafe {
554+ key_manager_decap_and_seal (
555+ std:: ptr:: null ( ) ,
556+ std:: ptr:: null ( ) ,
557+ 0 ,
558+ std:: ptr:: null ( ) ,
559+ 0 ,
560+ out_enc_key. as_mut_ptr ( ) ,
561+ & mut out_enc_key_len,
562+ std:: ptr:: null_mut ( ) ,
563+ std:: ptr:: null_mut ( ) ,
564+ )
565+ } ;
549566
550567 assert_eq ! ( result, -1 ) ;
551568 }
@@ -563,33 +580,37 @@ mod tests {
563580 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
564581 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
565582 } ;
566- key_manager_generate_kem_keypair (
567- algo,
568- binding_pk. as_ptr ( ) ,
569- binding_pk. len ( ) ,
570- 3600 ,
571- uuid_bytes. as_mut_ptr ( ) ,
572- std:: ptr:: null_mut ( ) ,
573- std:: ptr:: null_mut ( ) ,
574- ) ;
583+ unsafe {
584+ key_manager_generate_kem_keypair (
585+ algo,
586+ binding_pk. as_ptr ( ) ,
587+ binding_pk. len ( ) ,
588+ 3600 ,
589+ uuid_bytes. as_mut_ptr ( ) ,
590+ std:: ptr:: null_mut ( ) ,
591+ std:: ptr:: null_mut ( ) ,
592+ ) ;
593+ }
575594
576595 // 3. Call with invalid encapsulated key (wrong length for X25519)
577596 let mut out_enc_key = [ 0u8 ; 32 ] ;
578597 let mut out_enc_key_len = 32 ;
579598 let mut out_ct = [ 0u8 ; 48 ] ;
580599 let mut out_ct_len = 48 ;
581600
582- let result = key_manager_decap_and_seal (
583- uuid_bytes. as_ptr ( ) ,
584- [ 0u8 ; 31 ] . as_ptr ( ) ,
585- 31 ,
586- std:: ptr:: null ( ) ,
587- 0 ,
588- out_enc_key. as_mut_ptr ( ) ,
589- & mut out_enc_key_len,
590- out_ct. as_mut_ptr ( ) ,
591- & mut out_ct_len,
592- ) ;
601+ let result = unsafe {
602+ key_manager_decap_and_seal (
603+ uuid_bytes. as_ptr ( ) ,
604+ [ 0u8 ; 31 ] . as_ptr ( ) ,
605+ 31 ,
606+ std:: ptr:: null ( ) ,
607+ 0 ,
608+ out_enc_key. as_mut_ptr ( ) ,
609+ & mut out_enc_key_len,
610+ out_ct. as_mut_ptr ( ) ,
611+ & mut out_ct_len,
612+ )
613+ } ;
593614
594615 assert_eq ! ( result, -3 ) ;
595616 }
@@ -609,15 +630,17 @@ mod tests {
609630 kdf : KdfAlgorithm :: HkdfSha256 as i32 ,
610631 aead : AeadAlgorithm :: Aes256Gcm as i32 ,
611632 } ;
612- key_manager_generate_kem_keypair (
613- algo. clone ( ) ,
614- binding_pk. as_ptr ( ) ,
615- binding_pk. len ( ) ,
616- 3600 ,
617- uuid_bytes. as_mut_ptr ( ) ,
618- kem_pubkey_bytes. as_mut_ptr ( ) ,
619- & mut kem_pubkey_len,
620- ) ;
633+ unsafe {
634+ key_manager_generate_kem_keypair (
635+ algo,
636+ binding_pk. as_ptr ( ) ,
637+ binding_pk. len ( ) ,
638+ 3600 ,
639+ uuid_bytes. as_mut_ptr ( ) ,
640+ kem_pubkey_bytes. as_mut_ptr ( ) ,
641+ & mut kem_pubkey_len,
642+ ) ;
643+ }
621644
622645 // 3. Generate valid client encapsulation
623646 let ( client_enc, _) =
@@ -629,17 +652,19 @@ mod tests {
629652 let mut out_ct = [ 0u8 ; 47 ] ; // Small
630653 let mut out_ct_len = 47 ;
631654
632- let result = key_manager_decap_and_seal (
633- uuid_bytes. as_ptr ( ) ,
634- client_enc. as_ptr ( ) ,
635- client_enc. len ( ) ,
636- std:: ptr:: null ( ) ,
637- 0 ,
638- out_enc_key. as_mut_ptr ( ) ,
639- & mut out_enc_key_len,
640- out_ct. as_mut_ptr ( ) ,
641- & mut out_ct_len,
642- ) ;
655+ let result = unsafe {
656+ key_manager_decap_and_seal (
657+ uuid_bytes. as_ptr ( ) ,
658+ client_enc. as_ptr ( ) ,
659+ client_enc. len ( ) ,
660+ std:: ptr:: null ( ) ,
661+ 0 ,
662+ out_enc_key. as_mut_ptr ( ) ,
663+ & mut out_enc_key_len,
664+ out_ct. as_mut_ptr ( ) ,
665+ & mut out_ct_len,
666+ )
667+ } ;
643668
644669 assert_eq ! ( result, -2 ) ;
645670 }
0 commit comments