Skip to content

Commit 6a0c614

Browse files
committed
Working on generic key encapsulation.
1 parent 95015bd commit 6a0c614

File tree

2 files changed

+41
-43
lines changed

2 files changed

+41
-43
lines changed

src/kyber.rs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,24 @@ impl KyberPrivateKey {
8181
KyberLevel::Kyber1024 => Ok(KyberPrivateKey::Kyber1024(Box::new(kyber1024::SecretKey::from_bytes(bytes).map_err(|e| anyhow!(e))?))),
8282
}
8383
}
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+
}
84102
}
85103

86104
impl std::fmt::Debug for KyberPrivateKey {
@@ -128,6 +146,23 @@ impl KyberPublicKey {
128146
KyberLevel::Kyber1024 => Ok(KyberPublicKey::Kyber1024(Box::new(kyber1024::PublicKey::from_bytes(bytes).map_err(|e| anyhow!(e))?))),
129147
}
130148
}
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+
}
131166
}
132167

133168
impl std::fmt::Debug for KyberPublicKey {
@@ -251,78 +286,43 @@ impl std::fmt::Debug for KyberCiphertext {
251286
}
252287
}
253288

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-
289289
#[cfg(test)]
290290
mod tests {
291291
use super::*;
292292

293293
#[test]
294294
pub fn test_kyber512() {
295295
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();
297297
assert_eq!(private_key.size(), 1632);
298298
assert_eq!(public_key.size(), 800);
299299
assert_eq!(shared_secret_1.size(), 32);
300300
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);
302302
assert_eq!(shared_secret_1, shared_secret_2);
303303
}
304304

305305
#[test]
306306
pub fn test_kyber768() {
307307
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();
309309
assert_eq!(private_key.size(), 2400);
310310
assert_eq!(public_key.size(), 1184);
311311
assert_eq!(shared_secret_1.size(), 32);
312312
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);
314314
assert_eq!(shared_secret_1, shared_secret_2);
315315
}
316316

317317
#[test]
318318
pub fn test_kyber1024() {
319319
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();
321321
assert_eq!(private_key.size(), 3168);
322322
assert_eq!(public_key.size(), 1568);
323323
assert_eq!(shared_secret_1.size(), 32);
324324
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);
326326
assert_eq!(shared_secret_1, shared_secret_2);
327327
}
328328
}

src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ pub use kyber::{
117117
KyberSharedSecret,
118118
KyberCiphertext,
119119
kyber_new_keypair,
120-
kyber_encapsulate_new_shared_secret,
121-
kyber_decapsulate_shared_secret,
122120
KYBER_SHARED_SECRET_SIZE,
123121
};
124122

0 commit comments

Comments
 (0)