@@ -149,3 +149,110 @@ fn blake2sp_vectors() {
149
149
// count.
150
150
assert_eq ! ( 512 , test_num) ;
151
151
}
152
+
153
+ fn blake2x_test < F : Fn ( & [ u8 ] , & [ u8 ] , u64 ) -> Vec < u8 > , F2 : Fn ( & [ u8 ] , u64 , usize ) -> Vec < u8 > > ( h0_hasher : F , b2_hasher : F2 , variant_hash_length : usize , variant_name : & str ) {
154
+ let mut test_num = 0u64 ;
155
+ for case in TEST_CASES . iter ( ) {
156
+ if & case. hash == variant_name {
157
+ test_num += 1 ;
158
+
159
+ let input_bytes = hex:: decode ( & case. in_ ) . unwrap ( ) ;
160
+ let key = if !case. key . is_empty ( ) {
161
+ hex:: decode ( & case. key ) . unwrap ( )
162
+ } else {
163
+ vec ! [ ]
164
+ } ;
165
+
166
+ let output_length = case. out . len ( ) /2 ;
167
+ let encoded_output_length = ( ( ( output_length & ( ( 1 << 8 ) - 1 ) ) << 32 ) | ( ( output_length >> 8 ) << 40 ) ) as u64 ;
168
+ let h0 = h0_hasher ( & input_bytes, & key, encoded_output_length) ;
169
+
170
+ let num_hashes = ( output_length + variant_hash_length - 1 ) /variant_hash_length;
171
+ let mut buf = vec ! [ ] ;
172
+ for i in 0 ..num_hashes {
173
+ let hash_length = {
174
+ if i == ( num_hashes - 1 ) && ( output_length % variant_hash_length) != 0 {
175
+ output_length % variant_hash_length
176
+ } else {
177
+ variant_hash_length
178
+ }
179
+ } ;
180
+
181
+ let b2_out = b2_hasher ( & h0, ( i as u64 ) | encoded_output_length, hash_length) ;
182
+ buf. extend_from_slice ( & b2_out) ;
183
+ }
184
+ assert_eq ! ( case. out, hex:: encode( & buf[ ..output_length] ) ) ;
185
+ }
186
+ }
187
+
188
+ // Make sure we don't accidentally skip all the tests somehow. If the
189
+ // number of test vectors changes in the future, we'll need to update this
190
+ // count.
191
+ assert_eq ! ( 512 , test_num) ;
192
+ }
193
+
194
+ #[ test]
195
+ fn blake2xs_vectors ( ) {
196
+ let blake2xs_h0_hasher = |input_bytes : & [ u8 ] , key : & [ u8 ] , encoded_output_length : u64 | -> Vec < u8 > {
197
+ let mut params = blake2s_simd:: Params :: new ( ) ;
198
+ if key. len ( ) > 0 {
199
+ params. key ( key) ;
200
+ }
201
+ params
202
+ . hash_length ( 32 )
203
+ . node_offset ( encoded_output_length) ;
204
+ let mut state = params. to_state ( ) ;
205
+ state. update ( & input_bytes) ;
206
+ let h0 = state. finalize ( ) . as_ref ( ) . to_vec ( ) ;
207
+ h0
208
+ } ;
209
+ let blake2xs_b2_hasher = |input_bytes : & [ u8 ] , encoded_output_length : u64 , hash_length : usize | -> Vec < u8 > {
210
+ let mut params = blake2s_simd:: Params :: new ( ) ;
211
+ params
212
+ . hash_length ( hash_length)
213
+ . max_leaf_length ( 32 )
214
+ . inner_hash_length ( 32 )
215
+ . fanout ( 0 )
216
+ . max_depth ( 0 )
217
+ . node_offset ( encoded_output_length) ;
218
+ let mut state = params. to_state ( ) ;
219
+ state. update ( & input_bytes) ;
220
+ let b2_out = state. finalize ( ) . as_ref ( ) . to_vec ( ) ;
221
+ b2_out
222
+ } ;
223
+
224
+ blake2x_test ( blake2xs_h0_hasher, blake2xs_b2_hasher, 32 , "blake2xs" ) ;
225
+ }
226
+
227
+ #[ test]
228
+ fn blake2xb_vectors ( ) {
229
+ let blake2xb_h0_hasher = |input_bytes : & [ u8 ] , key : & [ u8 ] , encoded_output_length : u64 | -> Vec < u8 > {
230
+ let mut params = blake2b_simd:: Params :: new ( ) ;
231
+ if key. len ( ) > 0 {
232
+ params. key ( key) ;
233
+ }
234
+ params
235
+ . hash_length ( 64 )
236
+ . node_offset ( encoded_output_length) ;
237
+ let mut state = params. to_state ( ) ;
238
+ state. update ( & input_bytes) ;
239
+ let h0 = state. finalize ( ) . as_ref ( ) . to_vec ( ) ;
240
+ h0
241
+ } ;
242
+ let blake2xb_b2_hasher = |input_bytes : & [ u8 ] , encoded_output_length : u64 , hash_length : usize | -> Vec < u8 > {
243
+ let mut params = blake2b_simd:: Params :: new ( ) ;
244
+ params
245
+ . hash_length ( hash_length)
246
+ . max_leaf_length ( 64 )
247
+ . inner_hash_length ( 64 )
248
+ . fanout ( 0 )
249
+ . max_depth ( 0 )
250
+ . node_offset ( encoded_output_length) ;
251
+ let mut state = params. to_state ( ) ;
252
+ state. update ( & input_bytes) ;
253
+ let b2_out = state. finalize ( ) . as_ref ( ) . to_vec ( ) ;
254
+ b2_out
255
+ } ;
256
+
257
+ blake2x_test ( blake2xb_h0_hasher, blake2xb_b2_hasher, 64 , "blake2xb" ) ;
258
+ }
0 commit comments