]> git.lizzy.rs Git - rust.git/blob - src/librustc_data_structures/sip128/tests.rs
Auto merge of #69351 - mati865:mingw-ultimate-fix, r=cramertj
[rust.git] / src / librustc_data_structures / sip128 / tests.rs
1 use super::*;
2
3 use std::hash::{Hash, Hasher};
4 use std::{mem, slice};
5
6 // Hash just the bytes of the slice, without length prefix
7 struct Bytes<'a>(&'a [u8]);
8
9 impl<'a> Hash for Bytes<'a> {
10     #[allow(unused_must_use)]
11     fn hash<H: Hasher>(&self, state: &mut H) {
12         for byte in self.0 {
13             state.write_u8(*byte);
14         }
15     }
16 }
17
18 fn hash_with<T: Hash>(mut st: SipHasher128, x: &T) -> (u64, u64) {
19     x.hash(&mut st);
20     st.finish128()
21 }
22
23 fn hash<T: Hash>(x: &T) -> (u64, u64) {
24     hash_with(SipHasher128::new_with_keys(0, 0), x)
25 }
26
27 const TEST_VECTOR: [[u8; 16]; 64] = [
28     [
29         0xa3, 0x81, 0x7f, 0x04, 0xba, 0x25, 0xa8, 0xe6, 0x6d, 0xf6, 0x72, 0x14, 0xc7, 0x55, 0x02,
30         0x93,
31     ],
32     [
33         0xda, 0x87, 0xc1, 0xd8, 0x6b, 0x99, 0xaf, 0x44, 0x34, 0x76, 0x59, 0x11, 0x9b, 0x22, 0xfc,
34         0x45,
35     ],
36     [
37         0x81, 0x77, 0x22, 0x8d, 0xa4, 0xa4, 0x5d, 0xc7, 0xfc, 0xa3, 0x8b, 0xde, 0xf6, 0x0a, 0xff,
38         0xe4,
39     ],
40     [
41         0x9c, 0x70, 0xb6, 0x0c, 0x52, 0x67, 0xa9, 0x4e, 0x5f, 0x33, 0xb6, 0xb0, 0x29, 0x85, 0xed,
42         0x51,
43     ],
44     [
45         0xf8, 0x81, 0x64, 0xc1, 0x2d, 0x9c, 0x8f, 0xaf, 0x7d, 0x0f, 0x6e, 0x7c, 0x7b, 0xcd, 0x55,
46         0x79,
47     ],
48     [
49         0x13, 0x68, 0x87, 0x59, 0x80, 0x77, 0x6f, 0x88, 0x54, 0x52, 0x7a, 0x07, 0x69, 0x0e, 0x96,
50         0x27,
51     ],
52     [
53         0x14, 0xee, 0xca, 0x33, 0x8b, 0x20, 0x86, 0x13, 0x48, 0x5e, 0xa0, 0x30, 0x8f, 0xd7, 0xa1,
54         0x5e,
55     ],
56     [
57         0xa1, 0xf1, 0xeb, 0xbe, 0xd8, 0xdb, 0xc1, 0x53, 0xc0, 0xb8, 0x4a, 0xa6, 0x1f, 0xf0, 0x82,
58         0x39,
59     ],
60     [
61         0x3b, 0x62, 0xa9, 0xba, 0x62, 0x58, 0xf5, 0x61, 0x0f, 0x83, 0xe2, 0x64, 0xf3, 0x14, 0x97,
62         0xb4,
63     ],
64     [
65         0x26, 0x44, 0x99, 0x06, 0x0a, 0xd9, 0xba, 0xab, 0xc4, 0x7f, 0x8b, 0x02, 0xbb, 0x6d, 0x71,
66         0xed,
67     ],
68     [
69         0x00, 0x11, 0x0d, 0xc3, 0x78, 0x14, 0x69, 0x56, 0xc9, 0x54, 0x47, 0xd3, 0xf3, 0xd0, 0xfb,
70         0xba,
71     ],
72     [
73         0x01, 0x51, 0xc5, 0x68, 0x38, 0x6b, 0x66, 0x77, 0xa2, 0xb4, 0xdc, 0x6f, 0x81, 0xe5, 0xdc,
74         0x18,
75     ],
76     [
77         0xd6, 0x26, 0xb2, 0x66, 0x90, 0x5e, 0xf3, 0x58, 0x82, 0x63, 0x4d, 0xf6, 0x85, 0x32, 0xc1,
78         0x25,
79     ],
80     [
81         0x98, 0x69, 0xe2, 0x47, 0xe9, 0xc0, 0x8b, 0x10, 0xd0, 0x29, 0x93, 0x4f, 0xc4, 0xb9, 0x52,
82         0xf7,
83     ],
84     [
85         0x31, 0xfc, 0xef, 0xac, 0x66, 0xd7, 0xde, 0x9c, 0x7e, 0xc7, 0x48, 0x5f, 0xe4, 0x49, 0x49,
86         0x02,
87     ],
88     [
89         0x54, 0x93, 0xe9, 0x99, 0x33, 0xb0, 0xa8, 0x11, 0x7e, 0x08, 0xec, 0x0f, 0x97, 0xcf, 0xc3,
90         0xd9,
91     ],
92     [
93         0x6e, 0xe2, 0xa4, 0xca, 0x67, 0xb0, 0x54, 0xbb, 0xfd, 0x33, 0x15, 0xbf, 0x85, 0x23, 0x05,
94         0x77,
95     ],
96     [
97         0x47, 0x3d, 0x06, 0xe8, 0x73, 0x8d, 0xb8, 0x98, 0x54, 0xc0, 0x66, 0xc4, 0x7a, 0xe4, 0x77,
98         0x40,
99     ],
100     [
101         0xa4, 0x26, 0xe5, 0xe4, 0x23, 0xbf, 0x48, 0x85, 0x29, 0x4d, 0xa4, 0x81, 0xfe, 0xae, 0xf7,
102         0x23,
103     ],
104     [
105         0x78, 0x01, 0x77, 0x31, 0xcf, 0x65, 0xfa, 0xb0, 0x74, 0xd5, 0x20, 0x89, 0x52, 0x51, 0x2e,
106         0xb1,
107     ],
108     [
109         0x9e, 0x25, 0xfc, 0x83, 0x3f, 0x22, 0x90, 0x73, 0x3e, 0x93, 0x44, 0xa5, 0xe8, 0x38, 0x39,
110         0xeb,
111     ],
112     [
113         0x56, 0x8e, 0x49, 0x5a, 0xbe, 0x52, 0x5a, 0x21, 0x8a, 0x22, 0x14, 0xcd, 0x3e, 0x07, 0x1d,
114         0x12,
115     ],
116     [
117         0x4a, 0x29, 0xb5, 0x45, 0x52, 0xd1, 0x6b, 0x9a, 0x46, 0x9c, 0x10, 0x52, 0x8e, 0xff, 0x0a,
118         0xae,
119     ],
120     [
121         0xc9, 0xd1, 0x84, 0xdd, 0xd5, 0xa9, 0xf5, 0xe0, 0xcf, 0x8c, 0xe2, 0x9a, 0x9a, 0xbf, 0x69,
122         0x1c,
123     ],
124     [
125         0x2d, 0xb4, 0x79, 0xae, 0x78, 0xbd, 0x50, 0xd8, 0x88, 0x2a, 0x8a, 0x17, 0x8a, 0x61, 0x32,
126         0xad,
127     ],
128     [
129         0x8e, 0xce, 0x5f, 0x04, 0x2d, 0x5e, 0x44, 0x7b, 0x50, 0x51, 0xb9, 0xea, 0xcb, 0x8d, 0x8f,
130         0x6f,
131     ],
132     [
133         0x9c, 0x0b, 0x53, 0xb4, 0xb3, 0xc3, 0x07, 0xe8, 0x7e, 0xae, 0xe0, 0x86, 0x78, 0x14, 0x1f,
134         0x66,
135     ],
136     [
137         0xab, 0xf2, 0x48, 0xaf, 0x69, 0xa6, 0xea, 0xe4, 0xbf, 0xd3, 0xeb, 0x2f, 0x12, 0x9e, 0xeb,
138         0x94,
139     ],
140     [
141         0x06, 0x64, 0xda, 0x16, 0x68, 0x57, 0x4b, 0x88, 0xb9, 0x35, 0xf3, 0x02, 0x73, 0x58, 0xae,
142         0xf4,
143     ],
144     [
145         0xaa, 0x4b, 0x9d, 0xc4, 0xbf, 0x33, 0x7d, 0xe9, 0x0c, 0xd4, 0xfd, 0x3c, 0x46, 0x7c, 0x6a,
146         0xb7,
147     ],
148     [
149         0xea, 0x5c, 0x7f, 0x47, 0x1f, 0xaf, 0x6b, 0xde, 0x2b, 0x1a, 0xd7, 0xd4, 0x68, 0x6d, 0x22,
150         0x87,
151     ],
152     [
153         0x29, 0x39, 0xb0, 0x18, 0x32, 0x23, 0xfa, 0xfc, 0x17, 0x23, 0xde, 0x4f, 0x52, 0xc4, 0x3d,
154         0x35,
155     ],
156     [
157         0x7c, 0x39, 0x56, 0xca, 0x5e, 0xea, 0xfc, 0x3e, 0x36, 0x3e, 0x9d, 0x55, 0x65, 0x46, 0xeb,
158         0x68,
159     ],
160     [
161         0x77, 0xc6, 0x07, 0x71, 0x46, 0xf0, 0x1c, 0x32, 0xb6, 0xb6, 0x9d, 0x5f, 0x4e, 0xa9, 0xff,
162         0xcf,
163     ],
164     [
165         0x37, 0xa6, 0x98, 0x6c, 0xb8, 0x84, 0x7e, 0xdf, 0x09, 0x25, 0xf0, 0xf1, 0x30, 0x9b, 0x54,
166         0xde,
167     ],
168     [
169         0xa7, 0x05, 0xf0, 0xe6, 0x9d, 0xa9, 0xa8, 0xf9, 0x07, 0x24, 0x1a, 0x2e, 0x92, 0x3c, 0x8c,
170         0xc8,
171     ],
172     [
173         0x3d, 0xc4, 0x7d, 0x1f, 0x29, 0xc4, 0x48, 0x46, 0x1e, 0x9e, 0x76, 0xed, 0x90, 0x4f, 0x67,
174         0x11,
175     ],
176     [
177         0x0d, 0x62, 0xbf, 0x01, 0xe6, 0xfc, 0x0e, 0x1a, 0x0d, 0x3c, 0x47, 0x51, 0xc5, 0xd3, 0x69,
178         0x2b,
179     ],
180     [
181         0x8c, 0x03, 0x46, 0x8b, 0xca, 0x7c, 0x66, 0x9e, 0xe4, 0xfd, 0x5e, 0x08, 0x4b, 0xbe, 0xe7,
182         0xb5,
183     ],
184     [
185         0x52, 0x8a, 0x5b, 0xb9, 0x3b, 0xaf, 0x2c, 0x9c, 0x44, 0x73, 0xcc, 0xe5, 0xd0, 0xd2, 0x2b,
186         0xd9,
187     ],
188     [
189         0xdf, 0x6a, 0x30, 0x1e, 0x95, 0xc9, 0x5d, 0xad, 0x97, 0xae, 0x0c, 0xc8, 0xc6, 0x91, 0x3b,
190         0xd8,
191     ],
192     [
193         0x80, 0x11, 0x89, 0x90, 0x2c, 0x85, 0x7f, 0x39, 0xe7, 0x35, 0x91, 0x28, 0x5e, 0x70, 0xb6,
194         0xdb,
195     ],
196     [
197         0xe6, 0x17, 0x34, 0x6a, 0xc9, 0xc2, 0x31, 0xbb, 0x36, 0x50, 0xae, 0x34, 0xcc, 0xca, 0x0c,
198         0x5b,
199     ],
200     [
201         0x27, 0xd9, 0x34, 0x37, 0xef, 0xb7, 0x21, 0xaa, 0x40, 0x18, 0x21, 0xdc, 0xec, 0x5a, 0xdf,
202         0x89,
203     ],
204     [
205         0x89, 0x23, 0x7d, 0x9d, 0xed, 0x9c, 0x5e, 0x78, 0xd8, 0xb1, 0xc9, 0xb1, 0x66, 0xcc, 0x73,
206         0x42,
207     ],
208     [
209         0x4a, 0x6d, 0x80, 0x91, 0xbf, 0x5e, 0x7d, 0x65, 0x11, 0x89, 0xfa, 0x94, 0xa2, 0x50, 0xb1,
210         0x4c,
211     ],
212     [
213         0x0e, 0x33, 0xf9, 0x60, 0x55, 0xe7, 0xae, 0x89, 0x3f, 0xfc, 0x0e, 0x3d, 0xcf, 0x49, 0x29,
214         0x02,
215     ],
216     [
217         0xe6, 0x1c, 0x43, 0x2b, 0x72, 0x0b, 0x19, 0xd1, 0x8e, 0xc8, 0xd8, 0x4b, 0xdc, 0x63, 0x15,
218         0x1b,
219     ],
220     [
221         0xf7, 0xe5, 0xae, 0xf5, 0x49, 0xf7, 0x82, 0xcf, 0x37, 0x90, 0x55, 0xa6, 0x08, 0x26, 0x9b,
222         0x16,
223     ],
224     [
225         0x43, 0x8d, 0x03, 0x0f, 0xd0, 0xb7, 0xa5, 0x4f, 0xa8, 0x37, 0xf2, 0xad, 0x20, 0x1a, 0x64,
226         0x03,
227     ],
228     [
229         0xa5, 0x90, 0xd3, 0xee, 0x4f, 0xbf, 0x04, 0xe3, 0x24, 0x7e, 0x0d, 0x27, 0xf2, 0x86, 0x42,
230         0x3f,
231     ],
232     [
233         0x5f, 0xe2, 0xc1, 0xa1, 0x72, 0xfe, 0x93, 0xc4, 0xb1, 0x5c, 0xd3, 0x7c, 0xae, 0xf9, 0xf5,
234         0x38,
235     ],
236     [
237         0x2c, 0x97, 0x32, 0x5c, 0xbd, 0x06, 0xb3, 0x6e, 0xb2, 0x13, 0x3d, 0xd0, 0x8b, 0x3a, 0x01,
238         0x7c,
239     ],
240     [
241         0x92, 0xc8, 0x14, 0x22, 0x7a, 0x6b, 0xca, 0x94, 0x9f, 0xf0, 0x65, 0x9f, 0x00, 0x2a, 0xd3,
242         0x9e,
243     ],
244     [
245         0xdc, 0xe8, 0x50, 0x11, 0x0b, 0xd8, 0x32, 0x8c, 0xfb, 0xd5, 0x08, 0x41, 0xd6, 0x91, 0x1d,
246         0x87,
247     ],
248     [
249         0x67, 0xf1, 0x49, 0x84, 0xc7, 0xda, 0x79, 0x12, 0x48, 0xe3, 0x2b, 0xb5, 0x92, 0x25, 0x83,
250         0xda,
251     ],
252     [
253         0x19, 0x38, 0xf2, 0xcf, 0x72, 0xd5, 0x4e, 0xe9, 0x7e, 0x94, 0x16, 0x6f, 0xa9, 0x1d, 0x2a,
254         0x36,
255     ],
256     [
257         0x74, 0x48, 0x1e, 0x96, 0x46, 0xed, 0x49, 0xfe, 0x0f, 0x62, 0x24, 0x30, 0x16, 0x04, 0x69,
258         0x8e,
259     ],
260     [
261         0x57, 0xfc, 0xa5, 0xde, 0x98, 0xa9, 0xd6, 0xd8, 0x00, 0x64, 0x38, 0xd0, 0x58, 0x3d, 0x8a,
262         0x1d,
263     ],
264     [
265         0x9f, 0xec, 0xde, 0x1c, 0xef, 0xdc, 0x1c, 0xbe, 0xd4, 0x76, 0x36, 0x74, 0xd9, 0x57, 0x53,
266         0x59,
267     ],
268     [
269         0xe3, 0x04, 0x0c, 0x00, 0xeb, 0x28, 0xf1, 0x53, 0x66, 0xca, 0x73, 0xcb, 0xd8, 0x72, 0xe7,
270         0x40,
271     ],
272     [
273         0x76, 0x97, 0x00, 0x9a, 0x6a, 0x83, 0x1d, 0xfe, 0xcc, 0xa9, 0x1c, 0x59, 0x93, 0x67, 0x0f,
274         0x7a,
275     ],
276     [
277         0x58, 0x53, 0x54, 0x23, 0x21, 0xf5, 0x67, 0xa0, 0x05, 0xd5, 0x47, 0xa4, 0xf0, 0x47, 0x59,
278         0xbd,
279     ],
280     [
281         0x51, 0x50, 0xd1, 0x77, 0x2f, 0x50, 0x83, 0x4a, 0x50, 0x3e, 0x06, 0x9a, 0x97, 0x3f, 0xbd,
282         0x7c,
283     ],
284 ];
285
286 // Test vector from reference implementation
287 #[test]
288 fn test_siphash_2_4_test_vector() {
289     let k0 = 0x_07_06_05_04_03_02_01_00;
290     let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08;
291
292     let mut input: Vec<u8> = Vec::new();
293
294     for i in 0..64 {
295         let out = hash_with(SipHasher128::new_with_keys(k0, k1), &Bytes(&input[..]));
296         let expected = (
297             ((TEST_VECTOR[i][0] as u64) << 0)
298                 | ((TEST_VECTOR[i][1] as u64) << 8)
299                 | ((TEST_VECTOR[i][2] as u64) << 16)
300                 | ((TEST_VECTOR[i][3] as u64) << 24)
301                 | ((TEST_VECTOR[i][4] as u64) << 32)
302                 | ((TEST_VECTOR[i][5] as u64) << 40)
303                 | ((TEST_VECTOR[i][6] as u64) << 48)
304                 | ((TEST_VECTOR[i][7] as u64) << 56),
305             ((TEST_VECTOR[i][8] as u64) << 0)
306                 | ((TEST_VECTOR[i][9] as u64) << 8)
307                 | ((TEST_VECTOR[i][10] as u64) << 16)
308                 | ((TEST_VECTOR[i][11] as u64) << 24)
309                 | ((TEST_VECTOR[i][12] as u64) << 32)
310                 | ((TEST_VECTOR[i][13] as u64) << 40)
311                 | ((TEST_VECTOR[i][14] as u64) << 48)
312                 | ((TEST_VECTOR[i][15] as u64) << 56),
313         );
314
315         assert_eq!(out, expected);
316         input.push(i as u8);
317     }
318 }
319
320 #[test]
321 #[cfg(target_arch = "arm")]
322 fn test_hash_usize() {
323     let val = 0xdeadbeef_deadbeef_u64;
324     assert!(hash(&(val as u64)) != hash(&(val as usize)));
325     assert_eq!(hash(&(val as u32)), hash(&(val as usize)));
326 }
327 #[test]
328 #[cfg(target_arch = "x86_64")]
329 fn test_hash_usize() {
330     let val = 0xdeadbeef_deadbeef_u64;
331     assert_eq!(hash(&(val as u64)), hash(&(val as usize)));
332     assert!(hash(&(val as u32)) != hash(&(val as usize)));
333 }
334 #[test]
335 #[cfg(target_arch = "x86")]
336 fn test_hash_usize() {
337     let val = 0xdeadbeef_deadbeef_u64;
338     assert!(hash(&(val as u64)) != hash(&(val as usize)));
339     assert_eq!(hash(&(val as u32)), hash(&(val as usize)));
340 }
341
342 #[test]
343 fn test_hash_idempotent() {
344     let val64 = 0xdeadbeef_deadbeef_u64;
345     assert_eq!(hash(&val64), hash(&val64));
346     let val32 = 0xdeadbeef_u32;
347     assert_eq!(hash(&val32), hash(&val32));
348 }
349
350 #[test]
351 fn test_hash_no_bytes_dropped_64() {
352     let val = 0xdeadbeef_deadbeef_u64;
353
354     assert!(hash(&val) != hash(&zero_byte(val, 0)));
355     assert!(hash(&val) != hash(&zero_byte(val, 1)));
356     assert!(hash(&val) != hash(&zero_byte(val, 2)));
357     assert!(hash(&val) != hash(&zero_byte(val, 3)));
358     assert!(hash(&val) != hash(&zero_byte(val, 4)));
359     assert!(hash(&val) != hash(&zero_byte(val, 5)));
360     assert!(hash(&val) != hash(&zero_byte(val, 6)));
361     assert!(hash(&val) != hash(&zero_byte(val, 7)));
362
363     fn zero_byte(val: u64, byte: usize) -> u64 {
364         assert!(byte < 8);
365         val & !(0xff << (byte * 8))
366     }
367 }
368
369 #[test]
370 fn test_hash_no_bytes_dropped_32() {
371     let val = 0xdeadbeef_u32;
372
373     assert!(hash(&val) != hash(&zero_byte(val, 0)));
374     assert!(hash(&val) != hash(&zero_byte(val, 1)));
375     assert!(hash(&val) != hash(&zero_byte(val, 2)));
376     assert!(hash(&val) != hash(&zero_byte(val, 3)));
377
378     fn zero_byte(val: u32, byte: usize) -> u32 {
379         assert!(byte < 4);
380         val & !(0xff << (byte * 8))
381     }
382 }
383
384 #[test]
385 fn test_hash_no_concat_alias() {
386     let s = ("aa", "bb");
387     let t = ("aabb", "");
388     let u = ("a", "abb");
389
390     assert!(s != t && t != u);
391     assert!(hash(&s) != hash(&t) && hash(&s) != hash(&u));
392
393     let u = [1, 0, 0, 0];
394     let v = (&u[..1], &u[1..3], &u[3..]);
395     let w = (&u[..], &u[4..4], &u[4..4]);
396
397     assert!(v != w);
398     assert!(hash(&v) != hash(&w));
399 }
400
401 #[test]
402 fn test_write_short_works() {
403     let test_usize = 0xd0c0b0a0usize;
404     let mut h1 = SipHasher128::new_with_keys(0, 0);
405     h1.write_usize(test_usize);
406     h1.write(b"bytes");
407     h1.write(b"string");
408     h1.write_u8(0xFFu8);
409     h1.write_u8(0x01u8);
410     let mut h2 = SipHasher128::new_with_keys(0, 0);
411     h2.write(unsafe {
412         slice::from_raw_parts(&test_usize as *const _ as *const u8, mem::size_of::<usize>())
413     });
414     h2.write(b"bytes");
415     h2.write(b"string");
416     h2.write(&[0xFFu8, 0x01u8]);
417     assert_eq!(h1.finish128(), h2.finish128());
418 }