@@ -22,6 +22,7 @@ mod kem_params {
2222
2323mod kdf_params {
2424 pub const HKDF_SHA256_ID : u16 = 0x0001 ;
25+ pub const HKDF_SHA512_ID : u16 = 0x0003 ;
2526}
2627
2728mod aead_params {
@@ -61,6 +62,26 @@ pub(crate) enum KEM {
6162#[ derive( Clone , PartialEq , Eq , Hash ) ]
6263pub ( crate ) enum KDF {
6364 HKDF_SHA256 ,
65+ HKDF_SHA512 ,
66+ }
67+
68+ impl KDF {
69+ fn id ( & self ) -> u16 {
70+ match self {
71+ KDF :: HKDF_SHA256 => kdf_params:: HKDF_SHA256_ID ,
72+ KDF :: HKDF_SHA512 => kdf_params:: HKDF_SHA512_ID ,
73+ }
74+ }
75+
76+ fn hash_algorithm < ' p > (
77+ & self ,
78+ py : pyo3:: Python < ' p > ,
79+ ) -> CryptographyResult < pyo3:: Bound < ' p , pyo3:: PyAny > > {
80+ match self {
81+ KDF :: HKDF_SHA256 => Ok ( types:: SHA256 . get ( py) ?. call0 ( ) ?) ,
82+ KDF :: HKDF_SHA512 => Ok ( types:: SHA512 . get ( py) ?. call0 ( ) ?) ,
83+ }
84+ }
6485}
6586
6687#[ allow( clippy:: upper_case_acronyms) ]
@@ -113,18 +134,17 @@ pub(crate) struct Suite {
113134 aead : AEAD ,
114135 kem_suite_id : [ u8 ; 5 ] ,
115136 hpke_suite_id : [ u8 ; 10 ] ,
137+ kdf : KDF ,
116138}
117139
118140impl Suite {
119141 fn hkdf_expand < ' p > (
120- & self ,
121142 py : pyo3:: Python < ' p > ,
143+ algorithm : pyo3:: Bound < ' _ , pyo3:: PyAny > ,
122144 prk : & [ u8 ] ,
123145 info : & [ u8 ] ,
124146 length : usize ,
125147 ) -> CryptographyResult < pyo3:: Bound < ' p , pyo3:: types:: PyBytes > > {
126- let algorithm = types:: SHA256 . get ( py) ?. call0 ( ) ?;
127-
128148 let mut hkdf_expand = HkdfExpand :: new (
129149 py,
130150 algorithm. unbind ( ) ,
@@ -167,7 +187,9 @@ impl Suite {
167187 labeled_info. extend_from_slice ( & self . kem_suite_id ) ;
168188 labeled_info. extend_from_slice ( label) ;
169189 labeled_info. extend_from_slice ( info) ;
170- self . hkdf_expand ( py, prk, & labeled_info, length)
190+
191+ let algorithm = types:: SHA256 . get ( py) ?. call0 ( ) ?;
192+ Suite :: hkdf_expand ( py, algorithm, prk, & labeled_info, length)
171193 }
172194
173195 fn extract_and_expand < ' p > (
@@ -249,7 +271,7 @@ impl Suite {
249271 labeled_ikm. extend_from_slice ( label) ;
250272 labeled_ikm. extend_from_slice ( ikm) ;
251273
252- let algorithm = types :: SHA256 . get ( py ) ? . call0 ( ) ?;
274+ let algorithm = self . kdf . hash_algorithm ( py ) ?;
253275 let buf = CffiBuf :: from_bytes ( py, & labeled_ikm) ;
254276 hkdf_extract ( py, & algorithm. unbind ( ) , salt, & buf)
255277 }
@@ -269,7 +291,8 @@ impl Suite {
269291 labeled_info. extend_from_slice ( & self . hpke_suite_id ) ;
270292 labeled_info. extend_from_slice ( label) ;
271293 labeled_info. extend_from_slice ( info) ;
272- self . hkdf_expand ( py, prk, & labeled_info, length)
294+ let algorithm = self . kdf . hash_algorithm ( py) ?;
295+ Suite :: hkdf_expand ( py, algorithm, prk, & labeled_info, length)
273296 }
274297
275298 fn aead_encrypt < ' p > (
@@ -408,7 +431,7 @@ impl Suite {
408431#[ pyo3:: pymethods]
409432impl Suite {
410433 #[ new]
411- fn new ( _kem : KEM , _kdf : KDF , aead : AEAD ) -> CryptographyResult < Suite > {
434+ fn new ( _kem : KEM , kdf : KDF , aead : AEAD ) -> CryptographyResult < Suite > {
412435 // Build suite IDs
413436 let mut kem_suite_id = [ 0u8 ; 5 ] ;
414437 kem_suite_id[ ..3 ] . copy_from_slice ( b"KEM" ) ;
@@ -417,13 +440,14 @@ impl Suite {
417440 let mut hpke_suite_id = [ 0u8 ; 10 ] ;
418441 hpke_suite_id[ ..4 ] . copy_from_slice ( b"HPKE" ) ;
419442 hpke_suite_id[ 4 ..6 ] . copy_from_slice ( & kem_params:: X25519_ID . to_be_bytes ( ) ) ;
420- hpke_suite_id[ 6 ..8 ] . copy_from_slice ( & kdf_params :: HKDF_SHA256_ID . to_be_bytes ( ) ) ;
443+ hpke_suite_id[ 6 ..8 ] . copy_from_slice ( & kdf . id ( ) . to_be_bytes ( ) ) ;
421444 hpke_suite_id[ 8 ..10 ] . copy_from_slice ( & aead. id ( ) . to_be_bytes ( ) ) ;
422445
423446 Ok ( Suite {
424447 aead,
425448 kem_suite_id,
426449 hpke_suite_id,
450+ kdf,
427451 } )
428452 }
429453
0 commit comments