1
1
use std:: ffi:: c_uchar;
2
2
3
3
use cas_lib:: hybrid:: { cas_hybrid:: CASHybrid , hpke:: CASHPKE } ;
4
- use types:: { HpkeEncrypt , HpkeKeyPair } ;
4
+ use types:: { HpkeDecrypt , HpkeEncrypt , HpkeKeyPair } ;
5
5
6
6
mod types;
7
7
@@ -59,4 +59,33 @@ pub extern "C" fn hpke_encrypt(
59
59
std:: mem:: forget ( ciphertext) ;
60
60
std:: mem:: forget ( tag) ;
61
61
return_result
62
+ }
63
+
64
+ #[ no_mangle]
65
+ pub extern "C" fn hpke_decrypt (
66
+ ciphertext : * const c_uchar ,
67
+ ciphertext_length : usize ,
68
+ private_key : * const c_uchar ,
69
+ private_keylength : usize ,
70
+ encapped_key : * const c_uchar ,
71
+ encapped_key_length : usize ,
72
+ tag : * const c_uchar ,
73
+ tag_length : usize ,
74
+ info_str : * const c_uchar ,
75
+ info_str_length : usize ,
76
+ ) -> HpkeDecrypt {
77
+ let ciphertext = unsafe { std:: slice:: from_raw_parts ( ciphertext, ciphertext_length) } . to_vec ( ) ;
78
+ let private_key = unsafe { std:: slice:: from_raw_parts ( private_key, private_keylength) } . to_vec ( ) ;
79
+ let encapped_key = unsafe { std:: slice:: from_raw_parts ( encapped_key, encapped_key_length) } . to_vec ( ) ;
80
+ let tag = unsafe { std:: slice:: from_raw_parts ( tag, tag_length) } . to_vec ( ) ;
81
+ let info_str = unsafe { std:: slice:: from_raw_parts ( info_str, info_str_length) } . to_vec ( ) ;
82
+ let mut plaintext = <CASHPKE as CASHybrid >:: decrypt ( ciphertext, private_key, encapped_key, tag, info_str) ;
83
+ let plaintext_capacity = plaintext. capacity ( ) ;
84
+ plaintext. reserve_exact ( plaintext_capacity) ;
85
+ let return_result = HpkeDecrypt {
86
+ plaintext_ptr : plaintext. as_mut_ptr ( ) ,
87
+ plaintext_ptr_length : plaintext. len ( )
88
+ } ;
89
+ std:: mem:: forget ( plaintext) ;
90
+ return_result
62
91
}
0 commit comments