@@ -34,167 +34,116 @@ pub trait AeadDecrypt {
34
34
#[ cfg( test) ]
35
35
mod test {
36
36
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
+ }
67
74
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) ;
108
83
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) ;
112
85
113
- let secret = prepare_secret ( & cipher_suite , test_vector ) ;
86
+ let mut data_buffer = test_vec . plain_text . clone ( ) ;
114
87
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) ;
122
93
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 ( ) ;
126
95
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 ( ) ;
130
99
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 ( ) ;
138
105
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
+ }
143
109
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) ;
148
118
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) ;
153
125
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
+ }
158
137
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 ,
198
147
}
199
148
}
200
149
}
0 commit comments