11use bouncycastle_core:: errors:: KEMError ;
2- use bouncycastle_core:: traits:: { KEM , KEMPrivateKey , KEMPublicKey } ;
2+ use bouncycastle_core:: traits:: { KEMDecapsulator , KEMEncapsulator , KEMPrivateKey , KEMPublicKey } ;
33
44pub struct TestFrameworkKEM {
55 // Put any config options here
@@ -16,43 +16,48 @@ impl TestFrameworkKEM {
1616 Self { alg_is_deterministic, is_implicitly_rejecting }
1717 }
1818
19- /// Test all the members of trait Hash against the given input-output pair.
19+ /// Test all the members of traits [KEMEncapsulator] and [KEMDecapsulator] against the given input-output pair.
2020 /// This gives good baseline test coverage, but is not exhaustive.
21+ ///
22+ /// Since key generation is not part of either KEM trait, the caller supplies a
23+ /// `keygen` function pointer (the inherent `keygen` associated function on the algorithm struct).
2124 pub fn test_kem <
2225 PK : KEMPublicKey < PK_LEN > ,
2326 SK : KEMPrivateKey < SK_LEN > ,
24- KEMAlg : KEM < PK , SK , PK_LEN , SK_LEN , CT_LEN , SS_LEN > ,
27+ ENCAPSULATOR : KEMEncapsulator < PK , PK_LEN , CT_LEN , SS_LEN > ,
28+ DECAPSULATOR : KEMDecapsulator < SK , SK_LEN , CT_LEN , SS_LEN > ,
2529 const PK_LEN : usize ,
2630 const SK_LEN : usize ,
2731 const CT_LEN : usize ,
2832 const SS_LEN : usize ,
2933 > (
3034 & self ,
35+ keygen : fn ( ) -> Result < ( PK , SK ) , KEMError > ,
3136 run_full_bitflipping_tests : bool ,
3237 ) {
3338 // Basic test
34- let ( pk, sk) = KEMAlg :: keygen ( ) . unwrap ( ) ;
35- let ( ss, ct) = KEMAlg :: encaps ( & pk) . unwrap ( ) ;
36- let ss1 = KEMAlg :: decaps ( & sk, & ct) . unwrap ( ) ;
39+ let ( pk, sk) = keygen ( ) . unwrap ( ) ;
40+ let ( ss, ct) = ENCAPSULATOR :: encaps ( & pk) . unwrap ( ) ;
41+ let ss1 = DECAPSULATOR :: decaps ( & sk, & ct) . unwrap ( ) ;
3742 assert_eq ! ( ss, ss1) ;
3843
3944 // Test non-determinism
4045 if !self . alg_is_deterministic {
41- let ( ss1, ct1) = KEMAlg :: encaps ( & pk) . unwrap ( ) ;
42- let ( ss2, ct2) = KEMAlg :: encaps ( & pk) . unwrap ( ) ;
46+ let ( ss1, ct1) = ENCAPSULATOR :: encaps ( & pk) . unwrap ( ) ;
47+ let ( ss2, ct2) = ENCAPSULATOR :: encaps ( & pk) . unwrap ( ) ;
4348 assert_ne ! ( ss1, ss2) ;
4449 assert_ne ! ( ct1, ct2) ;
4550 }
4651
4752 // Test that decaps fails for broken ct value
48- let ( pk, sk) = KEMAlg :: keygen ( ) . unwrap ( ) ;
49- let ( ss, mut ct) = KEMAlg :: encaps ( & pk) . unwrap ( ) ;
53+ let ( pk, sk) = keygen ( ) . unwrap ( ) ;
54+ let ( ss, mut ct) = ENCAPSULATOR :: encaps ( & pk) . unwrap ( ) ;
5055 ct[ 17 ] ^= 0xFF ;
5156 if self . is_implicitly_rejecting {
52- let ss2 = KEMAlg :: decaps ( & sk, & ct) . unwrap ( ) ;
57+ let ss2 = DECAPSULATOR :: decaps ( & sk, & ct) . unwrap ( ) ;
5358 assert_ne ! ( ss, ss2) ;
5459 } else {
55- match KEMAlg :: decaps ( & sk, & ct) {
60+ match DECAPSULATOR :: decaps ( & sk, & ct) {
5661 Err ( KEMError :: DecapsulationFailed ) =>
5762 /* good */
5863 {
@@ -71,10 +76,10 @@ impl TestFrameworkKEM {
7176
7277 // should throw an Err
7378 if self . is_implicitly_rejecting {
74- let ss2 = KEMAlg :: decaps ( & sk, & ct_copy) . unwrap ( ) ;
79+ let ss2 = DECAPSULATOR :: decaps ( & sk, & ct_copy) . unwrap ( ) ;
7580 assert_ne ! ( ss, ss2) ;
7681 } else {
77- match KEMAlg :: decaps ( & sk, & ct) {
82+ match DECAPSULATOR :: decaps ( & sk, & ct) {
7883 Err ( KEMError :: DecapsulationFailed ) =>
7984 /* good */
8085 {
@@ -88,19 +93,18 @@ impl TestFrameworkKEM {
8893 }
8994
9095 // test ct the wrong length
91- let ( pk, sk) = KEMAlg :: keygen ( ) . unwrap ( ) ;
92- let ( _ss, ct) = KEMAlg :: encaps ( & pk) . unwrap ( ) ;
93-
96+ let ( pk, sk) = keygen ( ) . unwrap ( ) ;
97+ let ( _ss, ct) = ENCAPSULATOR :: encaps ( & pk) . unwrap ( ) ;
9498 // too short
95- match KEMAlg :: decaps ( & sk, & ct[ ..CT_LEN - 1 ] ) {
99+ match DECAPSULATOR :: decaps ( & sk, & ct[ ..CT_LEN - 1 ] ) {
96100 Err ( KEMError :: LengthError ( _) ) => { /* good */ }
97101 _ => panic ! ( "This should have thrown an error but it didn't." ) ,
98102 } ;
99103
100104 // too long
101105 let mut long_ct = vec ! [ 1u8 ; CT_LEN + 2 ] ;
102106 long_ct. as_mut_slice ( ) [ ..CT_LEN ] . copy_from_slice ( & ct) ;
103- match KEMAlg :: decaps ( & sk, & long_ct) {
107+ match DECAPSULATOR :: decaps ( & sk, & long_ct) {
104108 Err ( KEMError :: LengthError ( _) ) => { /* good */ }
105109 _ => panic ! ( "This should have thrown an error but it didn't." ) ,
106110 } ;
@@ -114,33 +118,31 @@ impl TestFrameworkKEMKeys {
114118 Self { }
115119 }
116120
121+ /// Since key generation is not part of either KEM trait, the caller supplies a
122+ /// `keygen` function pointer (the inherent `keygen` associated function on the algorithm struct).
117123 pub fn test_keys <
118124 PK : KEMPublicKey < PK_LEN > ,
119125 SK : KEMPrivateKey < SK_LEN > ,
120- KEMAlg : KEM < PK , SK , PK_LEN , SK_LEN , CT_LEN , SS_LEN > ,
121126 const PK_LEN : usize ,
122127 const SK_LEN : usize ,
123- const CT_LEN : usize ,
124- const SS_LEN : usize ,
125128 > (
126129 & self ,
130+ keygen : fn ( ) -> Result < ( PK , SK ) , KEMError > ,
127131 ) {
128- self . test_boundary_conditions :: < PK , SK , KEMAlg , PK_LEN , SK_LEN , CT_LEN , SS_LEN > ( ) ;
132+ self . test_boundary_conditions :: < PK , SK , PK_LEN , SK_LEN > ( keygen ) ;
129133 }
130134
131135 /// Tests the correct behaviour on buffers too large / too small.
132136 fn test_boundary_conditions <
133137 PK : KEMPublicKey < PK_LEN > ,
134138 SK : KEMPrivateKey < SK_LEN > ,
135- KEMAlg : KEM < PK , SK , PK_LEN , SK_LEN , CT_LEN , SS_LEN > ,
136139 const PK_LEN : usize ,
137140 const SK_LEN : usize ,
138- const CT_LEN : usize ,
139- const SS_LEN : usize ,
140141 > (
141142 & self ,
143+ keygen : fn ( ) -> Result < ( PK , SK ) , KEMError > ,
142144 ) {
143- let ( pk, sk) = KEMAlg :: keygen ( ) . unwrap ( ) ;
145+ let ( pk, sk) = keygen ( ) . unwrap ( ) ;
144146
145147 let pk_bytes = pk. encode ( ) ;
146148 assert_eq ! ( pk_bytes. len( ) , PK_LEN ) ;
0 commit comments