Skip to content

Commit 122cf72

Browse files
feat(kyberlib): 🎨 new macros for kem.rs
1 parent 446510c commit 122cf72

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ include = [
1717
"/CONTRIBUTING.md",
1818
"/LICENSE-APACHE",
1919
"/LICENSE-MIT",
20+
"/benches/**",
2021
"/build.rs",
2122
"/Cargo.toml",
23+
"/examples/**",
2224
"/README.md",
2325
"/src/**",
26+
"/tests/**",
2427
]
2528
keywords = ["kyber", "kem", "key-exchange", "kex", "post-quantum"]
2629
license = "MIT OR Apache-2.0"

src/macros.rs

+57
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,60 @@ macro_rules! kyberlib_max {
6161
max
6262
}};
6363
}
64+
65+
/// Generates a public and private key pair for CCA-secure Kyber key encapsulation mechanism.
66+
///
67+
/// # Arguments
68+
///
69+
/// * `pk` - Output public key (an already allocated array of CRYPTO_PUBLICKEYBYTES bytes).
70+
/// * `sk` - Output private key (an already allocated array of CRYPTO_SECRETKEYBYTES bytes).
71+
/// * `_rng` - Random number generator implementing RngCore + CryptoRng.
72+
/// * `_seed` - Optional seed for key generation.
73+
///
74+
/// # Errors
75+
///
76+
/// Returns a `KyberLibError` on failure.
77+
#[macro_export]
78+
macro_rules! kyberlib_generate_key_pair {
79+
($pk:expr, $sk:expr, $rng:expr, $seed:expr) => {
80+
kyberlib::kem::generate_key_pair($pk, $sk, $rng, $seed)
81+
};
82+
}
83+
84+
/// Generates cipher text and a shared secret for a given public key.
85+
///
86+
/// # Arguments
87+
///
88+
/// * `ct` - Output cipher text (an already allocated array of CRYPTO_CIPHERTEXTBYTES bytes).
89+
/// * `ss` - Output shared secret (an already allocated array of CRYPTO_BYTES bytes).
90+
/// * `pk` - Input public key (an already allocated array of CRYPTO_PUBLICKEYBYTES bytes).
91+
/// * `_rng` - Random number generator implementing RngCore + CryptoRng.
92+
/// * `_seed` - Optional seed for random number generation.
93+
///
94+
/// # Errors
95+
///
96+
/// Returns a `KyberLibError` on failure.
97+
#[macro_export]
98+
macro_rules! kyberlib_encrypt_message {
99+
($ct:expr, $ss:expr, $pk:expr, $rng:expr, $seed:expr) => {
100+
kyberlib::kem::encrypt_message($ct, $ss, $pk, $rng, $seed)
101+
};
102+
}
103+
104+
/// Generates a shared secret for a given cipher text and private key.
105+
///
106+
/// # Arguments
107+
///
108+
/// * `ss` - Output shared secret (an already allocated array of CRYPTO_BYTES bytes).
109+
/// * `ct` - Input cipher text (an already allocated array of CRYPTO_CIPHERTEXTBYTES bytes).
110+
/// * `sk` - Input private key (an already allocated array of CRYPTO_SECRETKEYBYTES bytes).
111+
///
112+
/// On failure, `ss` will contain a pseudo-random value.
113+
#[macro_export]
114+
macro_rules! kyberlib_decrypt_message {
115+
($ss:expr, $ct:expr, $sk:expr) => {
116+
kyberlib::kem::decrypt_message($ss, $ct, $sk)
117+
};
118+
}
119+
120+

tests/test_macros.rs

+53
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
#[cfg(test)]
55
mod tests {
66
use kyberlib::{kyberlib_assert, kyberlib_max, kyberlib_min};
7+
use rand_core::OsRng;
78
use rlg::{log::Log, log_format::LogFormat, log_level::LogLevel};
9+
use kyberlib::{kyberlib_generate_key_pair, kyberlib_encrypt_message, kyberlib_decrypt_message};
10+
use kyberlib::{KYBER_PUBLIC_KEY_BYTES, KYBER_SECRET_KEY_BYTES, KYBER_CIPHERTEXT_BYTES, KYBER_SHARED_SECRET_BYTES};
811

912
#[test]
1013
fn test_kyberlib_assert() {
@@ -82,4 +85,54 @@ mod tests {
8285
assert_eq!(log.description, "Hello world");
8386
assert_eq!(log.format, LogFormat::JSON);
8487
}
88+
89+
#[test]
90+
fn test_generate_key_pair_macro() {
91+
let mut rng = OsRng;
92+
let mut public_key = [0u8; KYBER_PUBLIC_KEY_BYTES];
93+
let mut secret_key = [0u8; KYBER_SECRET_KEY_BYTES];
94+
95+
kyberlib_generate_key_pair!(&mut public_key, &mut secret_key, &mut rng, None).unwrap();
96+
97+
assert_eq!(public_key.len(), KYBER_PUBLIC_KEY_BYTES);
98+
assert_eq!(secret_key.len(), KYBER_SECRET_KEY_BYTES);
99+
}
100+
101+
#[test]
102+
fn test_encrypt_message_macro() {
103+
let mut rng = OsRng;
104+
let mut public_key = [0u8; KYBER_PUBLIC_KEY_BYTES];
105+
let mut secret_key = [0u8; KYBER_SECRET_KEY_BYTES];
106+
107+
kyberlib_generate_key_pair!(&mut public_key, &mut secret_key, &mut rng, None).unwrap();
108+
109+
let mut ciphertext = [0u8; KYBER_CIPHERTEXT_BYTES];
110+
let mut shared_secret1 = [0u8; KYBER_SHARED_SECRET_BYTES];
111+
112+
kyberlib_encrypt_message!(&mut ciphertext, &mut shared_secret1, &public_key, &mut rng, None).unwrap();
113+
114+
let mut shared_secret2 = [0u8; KYBER_SHARED_SECRET_BYTES];
115+
kyberlib_decrypt_message!(&mut shared_secret2, &ciphertext, &secret_key);
116+
117+
assert_eq!(shared_secret1, shared_secret2);
118+
}
119+
120+
#[test]
121+
fn test_decrypt_message_macro() {
122+
let mut rng = OsRng;
123+
let mut public_key = [0u8; KYBER_PUBLIC_KEY_BYTES];
124+
let mut secret_key = [0u8; KYBER_SECRET_KEY_BYTES];
125+
126+
kyberlib_generate_key_pair!(&mut public_key, &mut secret_key, &mut rng, None).unwrap();
127+
128+
let mut ciphertext = [0u8; KYBER_CIPHERTEXT_BYTES];
129+
let mut shared_secret1 = [0u8; KYBER_SHARED_SECRET_BYTES];
130+
131+
kyberlib_encrypt_message!(&mut ciphertext, &mut shared_secret1, &public_key, &mut rng, None).unwrap();
132+
133+
let mut shared_secret2 = [0u8; KYBER_SHARED_SECRET_BYTES];
134+
kyberlib_decrypt_message!(&mut shared_secret2, &ciphertext, &secret_key);
135+
136+
assert_eq!(shared_secret1, shared_secret2);
137+
}
85138
}

0 commit comments

Comments
 (0)