@@ -81,6 +81,24 @@ impl KyberPrivateKey {
81
81
KyberLevel :: Kyber1024 => Ok ( KyberPrivateKey :: Kyber1024 ( Box :: new ( kyber1024:: SecretKey :: from_bytes ( bytes) . map_err ( |e| anyhow ! ( e) ) ?) ) ) ,
82
82
}
83
83
}
84
+
85
+ pub fn decapsulate_shared_secret ( & self , ciphertext : & KyberCiphertext ) -> KyberSharedSecret {
86
+ match ( self , ciphertext) {
87
+ ( KyberPrivateKey :: Kyber512 ( sk) , KyberCiphertext :: Kyber512 ( ct) ) => {
88
+ let ss = kyber512:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
89
+ KyberSharedSecret :: Kyber512 ( ss. into ( ) )
90
+ }
91
+ ( KyberPrivateKey :: Kyber768 ( sk) , KyberCiphertext :: Kyber768 ( ct) ) => {
92
+ let ss = kyber768:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
93
+ KyberSharedSecret :: Kyber768 ( ss. into ( ) )
94
+ }
95
+ ( KyberPrivateKey :: Kyber1024 ( sk) , KyberCiphertext :: Kyber1024 ( ct) ) => {
96
+ let ss = kyber1024:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
97
+ KyberSharedSecret :: Kyber1024 ( ss. into ( ) )
98
+ }
99
+ _ => panic ! ( "Kyber level mismatch" ) ,
100
+ }
101
+ }
84
102
}
85
103
86
104
impl std:: fmt:: Debug for KyberPrivateKey {
@@ -128,6 +146,23 @@ impl KyberPublicKey {
128
146
KyberLevel :: Kyber1024 => Ok ( KyberPublicKey :: Kyber1024 ( Box :: new ( kyber1024:: PublicKey :: from_bytes ( bytes) . map_err ( |e| anyhow ! ( e) ) ?) ) ) ,
129
147
}
130
148
}
149
+
150
+ pub fn encapsulate_new_shared_secret ( & self ) -> ( KyberSharedSecret , KyberCiphertext ) {
151
+ match self {
152
+ KyberPublicKey :: Kyber512 ( pk) => {
153
+ let ( ss, ct) = kyber512:: encapsulate ( pk. as_ref ( ) ) ;
154
+ ( KyberSharedSecret :: Kyber512 ( ss. into ( ) ) , KyberCiphertext :: Kyber512 ( ct. into ( ) ) )
155
+ }
156
+ KyberPublicKey :: Kyber768 ( pk) => {
157
+ let ( ss, ct) = kyber768:: encapsulate ( pk. as_ref ( ) ) ;
158
+ ( KyberSharedSecret :: Kyber768 ( ss. into ( ) ) , KyberCiphertext :: Kyber768 ( ct. into ( ) ) )
159
+ }
160
+ KyberPublicKey :: Kyber1024 ( pk) => {
161
+ let ( ss, ct) = kyber1024:: encapsulate ( pk. as_ref ( ) ) ;
162
+ ( KyberSharedSecret :: Kyber1024 ( ss. into ( ) ) , KyberCiphertext :: Kyber1024 ( ct. into ( ) ) )
163
+ }
164
+ }
165
+ }
131
166
}
132
167
133
168
impl std:: fmt:: Debug for KyberPublicKey {
@@ -251,78 +286,43 @@ impl std::fmt::Debug for KyberCiphertext {
251
286
}
252
287
}
253
288
254
- pub fn kyber_encapsulate_new_shared_secret ( public_key : & KyberPublicKey ) -> ( KyberSharedSecret , KyberCiphertext ) {
255
- match public_key {
256
- KyberPublicKey :: Kyber512 ( pk) => {
257
- let ( ss, ct) = kyber512:: encapsulate ( pk. as_ref ( ) ) ;
258
- ( KyberSharedSecret :: Kyber512 ( ss. into ( ) ) , KyberCiphertext :: Kyber512 ( ct. into ( ) ) )
259
- }
260
- KyberPublicKey :: Kyber768 ( pk) => {
261
- let ( ss, ct) = kyber768:: encapsulate ( pk. as_ref ( ) ) ;
262
- ( KyberSharedSecret :: Kyber768 ( ss. into ( ) ) , KyberCiphertext :: Kyber768 ( ct. into ( ) ) )
263
- }
264
- KyberPublicKey :: Kyber1024 ( pk) => {
265
- let ( ss, ct) = kyber1024:: encapsulate ( pk. as_ref ( ) ) ;
266
- ( KyberSharedSecret :: Kyber1024 ( ss. into ( ) ) , KyberCiphertext :: Kyber1024 ( ct. into ( ) ) )
267
- }
268
- }
269
- }
270
-
271
- pub fn kyber_decapsulate_shared_secret ( ciphertext : & KyberCiphertext , private_key : & KyberPrivateKey ) -> KyberSharedSecret {
272
- match ( ciphertext, private_key) {
273
- ( KyberCiphertext :: Kyber512 ( ct) , KyberPrivateKey :: Kyber512 ( sk) ) => {
274
- let ss = kyber512:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
275
- KyberSharedSecret :: Kyber512 ( ss. into ( ) )
276
- }
277
- ( KyberCiphertext :: Kyber768 ( ct) , KyberPrivateKey :: Kyber768 ( sk) ) => {
278
- let ss = kyber768:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
279
- KyberSharedSecret :: Kyber768 ( ss. into ( ) )
280
- }
281
- ( KyberCiphertext :: Kyber1024 ( ct) , KyberPrivateKey :: Kyber1024 ( sk) ) => {
282
- let ss = kyber1024:: decapsulate ( ct. as_ref ( ) , sk. as_ref ( ) ) ;
283
- KyberSharedSecret :: Kyber1024 ( ss. into ( ) )
284
- }
285
- _ => panic ! ( "Kyber level mismatch" ) ,
286
- }
287
- }
288
-
289
289
#[ cfg( test) ]
290
290
mod tests {
291
291
use super :: * ;
292
292
293
293
#[ test]
294
294
pub fn test_kyber512 ( ) {
295
295
let ( private_key, public_key) = kyber_new_keypair ( KyberLevel :: Kyber512 ) ;
296
- let ( shared_secret_1, ciphertext) = kyber_encapsulate_new_shared_secret ( & public_key) ;
296
+ let ( shared_secret_1, ciphertext) = public_key. encapsulate_new_shared_secret ( ) ;
297
297
assert_eq ! ( private_key. size( ) , 1632 ) ;
298
298
assert_eq ! ( public_key. size( ) , 800 ) ;
299
299
assert_eq ! ( shared_secret_1. size( ) , 32 ) ;
300
300
assert_eq ! ( ciphertext. size( ) , 768 ) ;
301
- let shared_secret_2 = kyber_decapsulate_shared_secret ( & ciphertext, & private_key ) ;
301
+ let shared_secret_2 = private_key . decapsulate_shared_secret ( & ciphertext) ;
302
302
assert_eq ! ( shared_secret_1, shared_secret_2) ;
303
303
}
304
304
305
305
#[ test]
306
306
pub fn test_kyber768 ( ) {
307
307
let ( private_key, public_key) = kyber_new_keypair ( KyberLevel :: Kyber768 ) ;
308
- let ( shared_secret_1, ciphertext) = kyber_encapsulate_new_shared_secret ( & public_key) ;
308
+ let ( shared_secret_1, ciphertext) = public_key. encapsulate_new_shared_secret ( ) ;
309
309
assert_eq ! ( private_key. size( ) , 2400 ) ;
310
310
assert_eq ! ( public_key. size( ) , 1184 ) ;
311
311
assert_eq ! ( shared_secret_1. size( ) , 32 ) ;
312
312
assert_eq ! ( ciphertext. size( ) , 1088 ) ;
313
- let shared_secret_2 = kyber_decapsulate_shared_secret ( & ciphertext, & private_key ) ;
313
+ let shared_secret_2 = private_key . decapsulate_shared_secret ( & ciphertext) ;
314
314
assert_eq ! ( shared_secret_1, shared_secret_2) ;
315
315
}
316
316
317
317
#[ test]
318
318
pub fn test_kyber1024 ( ) {
319
319
let ( private_key, public_key) = kyber_new_keypair ( KyberLevel :: Kyber1024 ) ;
320
- let ( shared_secret_1, ciphertext) = kyber_encapsulate_new_shared_secret ( & public_key) ;
320
+ let ( shared_secret_1, ciphertext) = public_key. encapsulate_new_shared_secret ( ) ;
321
321
assert_eq ! ( private_key. size( ) , 3168 ) ;
322
322
assert_eq ! ( public_key. size( ) , 1568 ) ;
323
323
assert_eq ! ( shared_secret_1. size( ) , 32 ) ;
324
324
assert_eq ! ( ciphertext. size( ) , 1568 ) ;
325
- let shared_secret_2 = kyber_decapsulate_shared_secret ( & ciphertext, & private_key ) ;
325
+ let shared_secret_2 = private_key . decapsulate_shared_secret ( & ciphertext) ;
326
326
assert_eq ! ( shared_secret_1, shared_secret_2) ;
327
327
}
328
328
}
0 commit comments