Skip to content

Commit 892fec9

Browse files
Tobias WaurickTobTheRock
Tobias Waurick
authored andcommitted
test: add test vectors from draft 03
1 parent ccd5d64 commit 892fec9

File tree

7 files changed

+1821
-465
lines changed

7 files changed

+1821
-465
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ rand = "0.8"
4545
serde = { version = "1.0", features = ["derive"] }
4646
serde_json = "1.0"
4747
strum_macros = "0.25"
48+
test-case = "3.1.0"
4849

4950
[features]
5051
default = ["ring"]

src/crypto/aead.rs

Lines changed: 98 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -34,167 +34,116 @@ pub trait AeadDecrypt {
3434
#[cfg(test)]
3535
mod test {
3636

37-
mod aes_gcm {
38-
use crate::{
39-
crypto::{
40-
aead::AeadEncrypt,
41-
cipher_suite::{CipherSuite, CipherSuiteVariant},
42-
key_expansion::KeyExpansion,
43-
secret::Secret,
44-
},
45-
header::{Header, HeaderFields},
46-
};
47-
use rand::{thread_rng, Rng};
48-
const KEY_MATERIAL: &str = "THIS_IS_RANDOM";
49-
50-
#[test]
51-
fn encrypt_random_frame() {
52-
let mut data = vec![0u8; 1024];
53-
thread_rng().fill(data.as_mut_slice());
54-
let header = Header::default();
55-
let cipher_suite = CipherSuite::from(CipherSuiteVariant::AesGcm256Sha512);
56-
let secret = Secret::expand_from(&cipher_suite, KEY_MATERIAL.as_bytes()).unwrap();
57-
58-
let _tag = cipher_suite
59-
.encrypt(
60-
&mut data,
61-
&secret,
62-
&Vec::from(&header),
63-
header.frame_count(),
64-
)
65-
.unwrap();
66-
}
37+
use crate::crypto::key_expansion::KeyExpansion;
38+
use crate::header::{FrameCount, KeyId};
39+
use crate::test_vectors::{get_sframe_test_vector, SframeTest};
40+
use crate::util::test::assert_bytes_eq;
41+
use crate::{
42+
crypto::{
43+
aead::AeadDecrypt,
44+
aead::AeadEncrypt,
45+
cipher_suite::{CipherSuite, CipherSuiteVariant},
46+
secret::Secret,
47+
},
48+
header::{Header, HeaderFields},
49+
};
50+
51+
use test_case::test_case;
52+
53+
use rand::{thread_rng, Rng};
54+
55+
const KEY_MATERIAL: &str = "THIS_IS_RANDOM";
56+
57+
#[test]
58+
fn encrypt_random_frame() {
59+
let mut data = vec![0u8; 1024];
60+
thread_rng().fill(data.as_mut_slice());
61+
let header = Header::default();
62+
let cipher_suite = CipherSuite::from(CipherSuiteVariant::AesGcm256Sha512);
63+
let secret = Secret::expand_from(&cipher_suite, KEY_MATERIAL.as_bytes()).unwrap();
64+
65+
let _tag = cipher_suite
66+
.encrypt(
67+
&mut data,
68+
&secret,
69+
&Vec::from(&header),
70+
header.frame_count(),
71+
)
72+
.unwrap();
73+
}
6774

68-
mod test_vectors {
69-
70-
use crate::crypto::key_expansion::KeyExpansion;
71-
use crate::test_vectors::{get_test_vector, TestVector};
72-
73-
use crate::{
74-
crypto::{
75-
aead::{AeadDecrypt, AeadEncrypt},
76-
cipher_suite::{CipherSuite, CipherSuiteVariant},
77-
secret::Secret,
78-
},
79-
header::{FrameCount, Header, HeaderFields, KeyId},
80-
util::test::assert_bytes_eq,
81-
};
82-
83-
fn encrypt_test_vector(variant: CipherSuiteVariant) {
84-
let test_vector = get_test_vector(&variant.to_string());
85-
let cipher_suite = CipherSuite::from(variant);
86-
87-
let secret = prepare_secret(&cipher_suite, test_vector);
88-
89-
for enc in &test_vector.encryptions {
90-
let mut data = test_vector.plain_text.clone();
91-
let header = Header::with_frame_count(
92-
KeyId::from(enc.key_id),
93-
FrameCount::from(enc.frame_count),
94-
);
95-
let header_buffer = Vec::from(&header);
96-
let tag = cipher_suite
97-
.encrypt(&mut data, &secret, &header_buffer, header.frame_count())
98-
.unwrap();
99-
let full_frame: Vec<u8> = header_buffer
100-
.into_iter()
101-
.chain(data.into_iter())
102-
.chain(tag.as_ref().iter().cloned())
103-
.collect();
104-
105-
assert_bytes_eq(&full_frame, &enc.cipher_text);
106-
}
107-
}
75+
#[test_case(CipherSuiteVariant::AesGcm128Sha256; "AesGcm128Sha256")]
76+
#[test_case(CipherSuiteVariant::AesGcm256Sha512; "AesGcm256Sha512")]
77+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_80; "AesCtr128HmacSha256_80"))]
78+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_64; "AesCtr128HmacSha256_64"))]
79+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_32; "AesCtr128HmacSha256_32"))]
80+
fn encrypt_test_vector(variant: CipherSuiteVariant) {
81+
let test_vec = get_sframe_test_vector(&variant.to_string());
82+
let cipher_suite = CipherSuite::from(variant);
10883

109-
fn decrypt_test_vector(variant: CipherSuiteVariant) {
110-
let test_vector = get_test_vector(&variant.to_string());
111-
let cipher_suite = CipherSuite::from(variant);
84+
let secret = prepare_secret(&cipher_suite, test_vec);
11285

113-
let secret = prepare_secret(&cipher_suite, test_vector);
86+
let mut data_buffer = test_vec.plain_text.clone();
11487

115-
for enc in &test_vector.encryptions {
116-
let header = Header::with_frame_count(
117-
KeyId::from(enc.key_id),
118-
FrameCount::from(enc.frame_count),
119-
);
120-
let header_buffer = Vec::from(&header);
121-
let mut data = Vec::from(&enc.cipher_text[header.size()..]);
88+
let header = Header::with_frame_count(
89+
KeyId::from(test_vec.key_id),
90+
FrameCount::from(test_vec.frame_count),
91+
);
92+
let header_buffer = Vec::from(&header);
12293

123-
let decrypted = cipher_suite
124-
.decrypt(&mut data, &secret, &header_buffer, header.frame_count())
125-
.unwrap();
94+
let aad_buffer = [header_buffer.as_slice(), test_vec.metadata.as_slice()].concat();
12695

127-
assert_bytes_eq(decrypted, &test_vector.plain_text);
128-
}
129-
}
96+
let tag = cipher_suite
97+
.encrypt(&mut data_buffer, &secret, &aad_buffer, header.frame_count())
98+
.unwrap();
13099

131-
fn prepare_secret(cipher_suite: &CipherSuite, test_vector: &TestVector) -> Secret {
132-
if cipher_suite.is_ctr_mode() {
133-
Secret::expand_from(cipher_suite, &test_vector.key_material).unwrap()
134-
} else {
135-
Secret::from_test_vector(test_vector)
136-
}
137-
}
100+
let full_frame: Vec<u8> = header_buffer
101+
.into_iter()
102+
.chain(data_buffer.into_iter())
103+
.chain(tag.as_ref().iter().cloned())
104+
.collect();
138105

139-
#[test]
140-
fn encrypt_test_vector_aes_gcm_128_sha256() {
141-
encrypt_test_vector(CipherSuiteVariant::AesGcm128Sha256);
142-
}
106+
assert_bytes_eq(&aad_buffer, &test_vec.aad);
107+
assert_bytes_eq(&full_frame, &test_vec.cipher_text);
108+
}
143109

144-
#[test]
145-
fn should_decrypt_test_vector_aes_gcm_128_sha256() {
146-
decrypt_test_vector(CipherSuiteVariant::AesGcm128Sha256);
147-
}
110+
#[test_case(CipherSuiteVariant::AesGcm128Sha256; "AesGcm128Sha256")]
111+
#[test_case(CipherSuiteVariant::AesGcm256Sha512; "AesGcm256Sha512")]
112+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_80; "AesCtr128HmacSha256_80"))]
113+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_64; "AesCtr128HmacSha256_64"))]
114+
#[cfg_attr(feature = "openssl", test_case(CipherSuiteVariant::AesCtr128HmacSha256_32; "AesCtr128HmacSha256_32"))]
115+
fn decrypt_test_vector(variant: CipherSuiteVariant) {
116+
let test_vec = get_sframe_test_vector(&variant.to_string());
117+
let cipher_suite = CipherSuite::from(variant);
148118

149-
#[test]
150-
fn encrypt_test_vectors_aes_gcm_256_sha512() {
151-
encrypt_test_vector(CipherSuiteVariant::AesGcm256Sha512);
152-
}
119+
let secret = prepare_secret(&cipher_suite, test_vec);
120+
let header = Header::with_frame_count(
121+
KeyId::from(test_vec.key_id),
122+
FrameCount::from(test_vec.frame_count),
123+
);
124+
let header_buffer = Vec::from(&header);
153125

154-
#[test]
155-
fn should_decrypt_test_vectors_aes_gcm_256_sha512() {
156-
decrypt_test_vector(CipherSuiteVariant::AesGcm256Sha512);
157-
}
126+
let aad_buffer = [header_buffer.as_slice(), test_vec.metadata.as_slice()].concat();
127+
assert_bytes_eq(&aad_buffer, &test_vec.aad);
128+
129+
let mut data = Vec::from(&test_vec.cipher_text[header.size()..]);
130+
131+
let decrypted = cipher_suite
132+
.decrypt(&mut data, &secret, &aad_buffer, header.frame_count())
133+
.unwrap();
134+
135+
assert_bytes_eq(decrypted, &test_vec.plain_text);
136+
}
158137

159-
#[cfg(feature = "openssl")]
160-
mod aes_ctr {
161-
use crate::CipherSuiteVariant;
162-
163-
use super::{decrypt_test_vector, encrypt_test_vector};
164-
165-
#[test]
166-
fn should_encrypt_test_vectors_aes_ctr_64_hmac_sha256_64() {
167-
encrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_64);
168-
}
169-
170-
#[test]
171-
fn should_decrypt_test_vectors_aes_ctr_64_hmac_sha256_64() {
172-
decrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_64);
173-
}
174-
175-
#[test]
176-
fn should_encrypt_test_vectors_aes_ctr_64_hmac_sha256_32() {
177-
encrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_32);
178-
}
179-
180-
#[test]
181-
fn should_decrypt_test_vectors_aes_ctr_64_hmac_sha256_32() {
182-
decrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_32);
183-
}
184-
185-
#[test]
186-
// AesCtr128HmacSha256_80 is not available in the test vectors
187-
#[ignore]
188-
fn should_encrypt_test_vectors_aes_ctr_64_hmac_sha256_80() {
189-
encrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_32);
190-
}
191-
192-
#[test]
193-
// AesCtr128HmacSha256_80 is not available in the test vectors
194-
#[ignore]
195-
fn should_decrypt_test_vectors_aes_ctr_64_hmac_sha256_80() {
196-
decrypt_test_vector(CipherSuiteVariant::AesCtr128HmacSha256_32);
197-
}
138+
fn prepare_secret(cipher_suite: &CipherSuite, test_vec: &SframeTest) -> Secret {
139+
if cipher_suite.is_ctr_mode() {
140+
// the test vectors do not provide the auth key, so we have to expand here
141+
Secret::expand_from(cipher_suite, &test_vec.key_material).unwrap()
142+
} else {
143+
Secret {
144+
key: test_vec.sframe_key.clone(),
145+
salt: test_vec.sframe_salt.clone(),
146+
auth: None,
198147
}
199148
}
200149
}

src/crypto/key_expansion.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,46 +23,46 @@ pub const SFRAME_HDKF_SUB_AUTH_EXPAND_INFO: &[u8] = b"auth";
2323

2424
#[cfg(test)]
2525
mod test {
26+
use super::KeyExpansion;
2627
use crate::crypto::cipher_suite::CipherSuite;
2728
use crate::crypto::secret::Secret;
28-
use crate::test_vectors::get_test_vector;
29-
29+
use crate::test_vectors::get_sframe_test_vector;
3030
use crate::{crypto::cipher_suite::CipherSuiteVariant, util::test::assert_bytes_eq};
3131

32-
use super::KeyExpansion;
32+
mod aes_gcm {
33+
use super::*;
3334

34-
fn derive_correct_base_keys(variant: CipherSuiteVariant) {
35-
let test_vector = get_test_vector(&variant.to_string());
36-
let secret =
37-
Secret::expand_from(&CipherSuite::from(variant), &test_vector.key_material).unwrap();
35+
use test_case::test_case;
3836

39-
assert_bytes_eq(&secret.key, &test_vector.key);
40-
assert_bytes_eq(&secret.salt, &test_vector.salt);
41-
}
37+
#[test_case(CipherSuiteVariant::AesGcm128Sha256; "AesGcm128Sha256")]
38+
#[test_case(CipherSuiteVariant::AesGcm256Sha512; "AesGcm256Sha512")]
39+
fn derive_correct_base_keys(variant: CipherSuiteVariant) {
40+
let test_vec = get_sframe_test_vector(&variant.to_string());
41+
let secret =
42+
Secret::expand_from(&CipherSuite::from(variant), &test_vec.key_material).unwrap();
4243

43-
#[test]
44-
fn derive_correct_keys_aes_gcm_128_sha256() {
45-
derive_correct_base_keys(CipherSuiteVariant::AesGcm128Sha256);
46-
}
47-
48-
#[test]
49-
fn derive_correct_keys_aes_gcm_256_sha512() {
50-
derive_correct_base_keys(CipherSuiteVariant::AesGcm256Sha512);
44+
assert_bytes_eq(&secret.key, &test_vec.sframe_key);
45+
assert_bytes_eq(&secret.salt, &test_vec.sframe_salt);
46+
}
5147
}
5248

5349
#[cfg(feature = "openssl")]
5450
mod aes_ctr {
5551
use super::*;
52+
use crate::test_vectors::get_aes_ctr_test_vector;
53+
54+
use test_case::test_case;
5655

56+
#[test_case(CipherSuiteVariant::AesCtr128HmacSha256_80; "AesCtr128HmacSha256_80")]
57+
#[test_case(CipherSuiteVariant::AesCtr128HmacSha256_64; "AesCtr128HmacSha256_64")]
58+
#[test_case(CipherSuiteVariant::AesCtr128HmacSha256_32; "AesCtr128HmacSha256_32")]
5759
fn derive_correct_sub_keys(variant: CipherSuiteVariant) {
58-
let test_vector = get_test_vector(&variant.to_string());
60+
let test_vec = get_aes_ctr_test_vector(&variant.to_string());
5961
let cipher_suite = CipherSuite::from(variant);
60-
let secret = Secret::expand_from(&cipher_suite, &test_vector.key_material).unwrap();
62+
let secret = Secret::expand_from(&cipher_suite, &test_vec.key_material).unwrap();
6163

62-
assert_bytes_eq(&secret.salt, &test_vector.salt);
63-
// the subkeys stored in secret.key and secret.auth are not included in the test vectors
64-
assert_eq!(secret.auth.unwrap().len(), cipher_suite.hash_len);
65-
assert_eq!(secret.key.len(), cipher_suite.key_len);
64+
assert_bytes_eq(&secret.auth.unwrap(), &test_vec.auth_key);
65+
assert_bytes_eq(&secret.key, &test_vec.enc_key);
6666
}
6767

6868
#[test]

0 commit comments

Comments
 (0)