Skip to main content

crypto/sha2/
sha256.rs

1#[cfg(target_arch = "x86_64")]
2use super::sha256_amd64;
3#[cfg(target_arch = "aarch64")]
4use super::sha256_arm64;
5use crate::{Hash, Hasher};
6
7pub(crate) const SHA256_K: [u32; 64] = [
8    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,
9    0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
10    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,
11    0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
12    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
13    0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
14    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,
15    0xc67178f2,
16];
17
18#[derive(Clone)]
19#[cfg_attr(feature = "zeroize", derive(zeroize::Zeroize, zeroize::ZeroizeOnDrop))]
20pub struct Sha256 {
21    state: [u32; 8],
22    buffer: [u8; 64],
23    buffer_len: usize,
24    total_len: u64,
25}
26
27impl Hasher for Sha256 {
28    const BLOCK_SIZE: usize = 64;
29    const OUTPUT_SIZE: usize = 32;
30
31    #[inline]
32    fn new() -> Self {
33        return Sha256 {
34            state: [
35                0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
36            ],
37            buffer: [0u8; 64],
38            buffer_len: 0,
39            total_len: 0,
40        };
41    }
42
43    #[inline]
44    fn update(&mut self, mut data: &[u8]) {
45        self.total_len = self.total_len.wrapping_add(data.len() as u64);
46
47        if self.buffer_len > 0 {
48            let to_fill = (64 - self.buffer_len).min(data.len());
49            self.buffer[self.buffer_len..self.buffer_len + to_fill].copy_from_slice(&data[..to_fill]);
50            self.buffer_len += to_fill;
51            data = &data[to_fill..];
52
53            if self.buffer_len == 64 {
54                process_block(&mut self.state, &self.buffer);
55                self.buffer_len = 0;
56            }
57        }
58
59        let mut chunks = data.chunks_exact(64);
60        for chunk in &mut chunks {
61            process_block(&mut self.state, chunk.try_into().unwrap());
62        }
63
64        let remainder = chunks.remainder();
65        if !remainder.is_empty() {
66            self.buffer[..remainder.len()].copy_from_slice(remainder);
67            self.buffer_len = remainder.len();
68        }
69    }
70
71    #[inline]
72    fn sum(mut self) -> Hash {
73        let bit_len = self.total_len.wrapping_mul(8);
74
75        let mut tail = [0u8; 128];
76        tail[..self.buffer_len].copy_from_slice(&self.buffer[..self.buffer_len]);
77        tail[self.buffer_len] = 0x80;
78
79        let padding_len = if self.buffer_len < 56 {
80            56 - self.buffer_len
81        } else {
82            120 - self.buffer_len
83        };
84
85        let length_offset = self.buffer_len + padding_len;
86        tail[length_offset..length_offset + 8].copy_from_slice(&bit_len.to_be_bytes());
87
88        let total_tail_len = length_offset + 8;
89        for chunk in tail[..total_tail_len].chunks_exact(64) {
90            process_block(&mut self.state, chunk.try_into().unwrap());
91        }
92
93        let mut hash = Hash::new();
94        for word in self.state.iter() {
95            hash.append(&word.to_be_bytes());
96        }
97
98        return hash;
99    }
100}
101
102#[inline]
103#[allow(unreachable_code)]
104fn process_block(state: &mut [u32; 8], block: &[u8; 64]) {
105    #[cfg(target_arch = "x86_64")]
106    {
107        if sha256_amd64::process_block_sha_ni(state, block) {
108            return;
109        }
110    }
111
112    #[cfg(target_arch = "aarch64")]
113    {
114        // SAFETY: aarch64 target in this repository assumes SHA2 instructions are present.
115        unsafe {
116            sha256_arm64::process_block(state, block);
117        }
118        return;
119    }
120
121    process_block_scalar(state, block);
122}
123
124#[inline]
125pub(crate) fn process_block_scalar(state: &mut [u32; 8], block: &[u8; 64]) {
126    let mut w = [0u32; 64];
127    let mut i = 0usize;
128    while i < 16 {
129        let offset = i * 4;
130        w[i] = u32::from_be_bytes([block[offset], block[offset + 1], block[offset + 2], block[offset + 3]]);
131        i += 1;
132    }
133
134    while i < 64 {
135        let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3);
136        let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10);
137        w[i] = w[i - 16].wrapping_add(s0).wrapping_add(w[i - 7]).wrapping_add(s1);
138        i += 1;
139    }
140
141    let mut a = state[0];
142    let mut b = state[1];
143    let mut c = state[2];
144    let mut d = state[3];
145    let mut e = state[4];
146    let mut f = state[5];
147    let mut g = state[6];
148    let mut h = state[7];
149
150    i = 0;
151    while i < 64 {
152        let s1 = e.rotate_right(6) ^ e.rotate_right(11) ^ e.rotate_right(25);
153        let ch = (e & f) ^ ((!e) & g);
154        let temp1 = h
155            .wrapping_add(s1)
156            .wrapping_add(ch)
157            .wrapping_add(SHA256_K[i])
158            .wrapping_add(w[i]);
159        let s0 = a.rotate_right(2) ^ a.rotate_right(13) ^ a.rotate_right(22);
160        let maj = (a & b) ^ (a & c) ^ (b & c);
161        let temp2 = s0.wrapping_add(maj);
162
163        h = g;
164        g = f;
165        f = e;
166        e = d.wrapping_add(temp1);
167        d = c;
168        c = b;
169        b = a;
170        a = temp1.wrapping_add(temp2);
171
172        i += 1;
173    }
174
175    state[0] = state[0].wrapping_add(a);
176    state[1] = state[1].wrapping_add(b);
177    state[2] = state[2].wrapping_add(c);
178    state[3] = state[3].wrapping_add(d);
179    state[4] = state[4].wrapping_add(e);
180    state[5] = state[5].wrapping_add(f);
181    state[6] = state[6].wrapping_add(g);
182    state[7] = state[7].wrapping_add(h);
183}
184
185#[cfg(test)]
186mod tests {
187    use super::Sha256;
188    use crate::Hasher;
189
190    fn vectors_sha256() -> Vec<(Vec<u8>, [u8; 32])> {
191        vec![
192            // RFC 6234 / common SHA-256 vectors
193            (
194                b"".to_vec(),
195                hex::decode_array::<32>(b"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").unwrap(),
196            ),
197            (
198                b"a".to_vec(),
199                hex::decode_array::<32>(b"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb").unwrap(),
200            ),
201            (
202                b"abc".to_vec(),
203                hex::decode_array::<32>(b"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad").unwrap(),
204            ),
205            (
206                b"message digest".to_vec(),
207                hex::decode_array::<32>(b"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650").unwrap(),
208            ),
209            (
210                b"abcdefghijklmnopqrstuvwxyz".to_vec(),
211                hex::decode_array::<32>(b"71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73").unwrap(),
212            ),
213            (
214                b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".to_vec(),
215                hex::decode_array::<32>(b"db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0").unwrap(),
216            ),
217            (
218                b"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
219                    .to_vec(),
220                hex::decode_array::<32>(b"f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e").unwrap(),
221            ),
222            // NIST FIPS 180-4
223            (
224                b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".to_vec(),
225                hex::decode_array::<32>(b"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1").unwrap(),
226            ),
227            (
228                b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
229                    .to_vec(),
230                hex::decode_array::<32>(b"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1").unwrap(),
231            ),
232            (vec![b'a'; 1_000_000], hex::decode_array::<32>(b"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0").unwrap()),
233        ]
234    }
235
236    #[test]
237    fn known_vectors_single_update() {
238        for (input, expected) in vectors_sha256() {
239            let mut hasher = Sha256::new();
240            hasher.update(&input);
241            let digest = hasher.sum();
242            assert_eq!(digest.as_ref(), expected);
243        }
244    }
245
246    #[test]
247    fn known_vectors_incremental() {
248        for (bytes, expected) in vectors_sha256() {
249            let mut hasher = Sha256::new();
250            for chunk in bytes.chunks(3) {
251                hasher.update(chunk);
252            }
253            let digest = hasher.sum();
254            assert_eq!(digest.as_ref(), expected);
255        }
256    }
257
258    #[test]
259    fn block_boundary_lengths() {
260        for len in [55usize, 56, 57, 63, 64, 65, 127, 128, 129] {
261            let input = vec![b'a'; len];
262
263            let mut whole = Sha256::new();
264            whole.update(&input);
265            let whole_sum = whole.sum();
266
267            let mut split = Sha256::new();
268            for chunk in input.chunks(7) {
269                split.update(chunk);
270            }
271            let split_sum = split.sum();
272
273            assert_eq!(whole_sum.as_ref(), split_sum.as_ref());
274        }
275    }
276
277    #[test]
278    fn sha256_generated_vectors() {
279        let test_cases: &[(&str, &str)] = &[
280            (
281                "dbb2f8949e06d7e52a47c0bfd9",
282                "d970ede60c8e58f10f71ddfb9f13227289fa333ab0ae17e19d11dadb6de98fcc",
283            ),
284            (
285                "eb409c57dc6e689dd976e50e1fd7844a4aee947a",
286                "ac87a9650f85ce14c09078f50a859e08cdd9c41e16936a730f80bb9c49f0de15",
287            ),
288            (
289                "a99a65b0b5099589c015514a1055039da1cac708f5738d2a31d3f1",
290                "ff92dc556cf1a29ff87e6ad46d36172a2458f1a4555bc9212002e347f766185c",
291            ),
292            (
293                "b38e7b70d3389e85efc420776bd99a57a7e85c9e4eb0103bf0482e3fb5693a3ed9a8",
294                "8e217e288cbf80827cc898b4cd3f7475aa3248b5c65f8039478b859c2d69a6ef",
295            ),
296            (
297                "c103e71990663615827ee4ba1ca5d0c73af7da8cd6c355f5467473d7fc776834b1137ebd383c374865",
298                "035ef24499be5b7332bb896dcf1dce2aa46a8d425225c2e0aea7e6a9546e5345",
299            ),
300            (
301                "291d76fcf8e4189cf96605131d4ad0d57ddb2e9c2c949f3524e1a978ba9f52cdf97af8bf5d80501123a8918984fa3595",
302                "8a00a6cf97930b04bc8918a502ba54cb82b318e857bc7c1b173690f98aa0d52c",
303            ),
304            (
305                "1a0e7e77bff8cee22a7299ac539ee995b2581bc0ec5f42ef438193a451be500c66bfabdfd7f95d8eb6e0d848f5d9eee32e540c86df9b88",
306                "75e8eb85e47df6f753cbe6e9bd723aed93bf5288ba1efbae3468bafbe632576d",
307            ),
308            (
309                "323cf4c5b0625e60df4584afebe30281b416cc9ca2e7ef36634f944592bb5b301d5cc75462ed8b47823bb03bb050bbe65361a22fc7a7e38f341001b3fda4",
310                "a7049c2e2a1660a610127d70db0fed64a996cbe36af99d5b284d6f194c8e7b66",
311            ),
312            ("32fa31e0", "457c5b9a13c0d7210fe893697db139706d5569d5083e3fea6d043cd31cc21d4e"),
313            (
314                "88c9a601a1f00b2f177b25",
315                "aba9ca72bddadc903826a2a640b0c157b2d7025e0e8b678f84c9526e1be65be0",
316            ),
317            (
318                "1e9ca9b4a9af371a9f6f87afd350c5f49a51",
319                "bde48e7df1d80281541e64237bf7ade697b1711e0a070efb5614551c11319595",
320            ),
321            (
322                "571d0711f702310f73eb2af372bb5a1328b353d50e1adafb2d",
323                "7df6171b59d7b300c482d803255ce736e857663ff0d6e89dd447cf906428de46",
324            ),
325            (
326                "673325f182b86d13f3daf22e7991d90a890aed1d5bca2bf822abf43ca0e6864e",
327                "4d3a318e9f268d62764fb946d7519a08b6d466f2ed2dbcf0e93ab9429531afa9",
328            ),
329            (
330                "e7e9b3b0fffb03f1ce4addff7ad7c6f090aa19e04d6552faf3619b47e85a8b0fcd6d1bec29c73b",
331                "5b9948841394b3ea75d2754a213976f44b9c7b026d95389236b8dcf84ab44d50",
332            ),
333            (
334                "4641fdf46c06739b7fef2a400a3bc281c661f6c9b344a184857654741692fec0d35237c357599b2d85939933eb4b",
335                "836b90af0b82843a7c84617b00a4281a25b3dde914a0aa04edddcead6d959ff6",
336            ),
337            (
338                "a2b8f795f70eddf5de8dc18d80c04a4775437046831ea4f2361951e4358e999d56313bb5049a2e81f0f6ce10b7039388ed0c99022d",
339                "e4d189da6415c2959cc2208fccc5087a4c178314ead690bfa10028b48e495c87",
340            ),
341            (
342                "849d2379438aba5c1fb9648835884f22e0e7b528c20da34d3496ac299cb93103187e19279f44f764afc89230bcdebe9ae604e2b255bb1691e26f2dd5",
343                "24867539b04a314bdcd277fcd12683b86438db87f0d80ce76f9e8c8bf3ee1d18",
344            ),
345            ("706c", "3485639faf1591f3c16f295198e9389db5b33c949587ec48663597d4e00299d5"),
346            (
347                "711f30005ffe3fb060",
348                "dd14fbd204ed8cc0fc19f9060da88e7b07b72c31fd9cd45f37e09ea78afc6453",
349            ),
350            (
351                "554b57fa7398cc9090550cad70744f26",
352                "397eced20be563d1500879df42b209f4399a49457d33bb2da37e76bd092aef4a",
353            ),
354            (
355                "7589be3754ec491acdd58325350a0b29d572075acec8ff",
356                "8425e59cccb3476ceed8c288d44675edc0ef404a768bd99e7da7ccef25fc9540",
357            ),
358            (
359                "f23fbdf8a9e1a849e89e0254c14a847a2605ce785f09db04d31aac7a8008",
360                "203d39fb4221cfc1ca2d1924e0edbbd9b863aa583a5e0d781001d03ecf9a61be",
361            ),
362            (
363                "7f5208aa41ab6c5971e460aa327280e1e91a980df90dfb3fae18d0eb28ffb905ccc02531e5",
364                "88b998d889acbd533abc7a3590b676786bb679fd32f57156f44ee0863f708bb4",
365            ),
366            (
367                "063a04b3e815aa11bb6c4b5b4df9f788b198e0801b4402e909ed4f338c4dc1bade29711f0d4cf25b84268df3",
368                "a9d0ce278f6e0165fca76749fbff6f870f549b91ed28b5765313d136785f29c4",
369            ),
370            (
371                "5bdf921b475edd977c60e8388315f2d084e4f649e030b322ea90ae8ce949de9bce6c6e6cde6dbaad4e0b9aa996588d326503d8",
372                "b3eb0c3cb67313f5f89b4cbb7a7b63cd274ae52646de2e9e36eb3afe58f8ec2d",
373            ),
374            (
375                "3d478d5ca25a1ac5bab4878ae5dc56b2fe62a70adc70580dcb8294e1f1dec95815f53901fe3a5f642aedafd760cfb538e26112fd21bb1a0c243f",
376                "c6c827a166cdc878d612d8d7bc72fe782699a1ae021ec773751f1749db36a3d2",
377            ),
378            ("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
379            (
380                "580998222001a7",
381                "847d0cda6be10daf0de8d42e765337f9c0c1e1e38e16666eee95f04bc825adaa",
382            ),
383            (
384                "ae5912da9f3383cc805de0200bc5",
385                "4513e9e89dab72e6ff1a8aed455b83c1fb7d4a242f660e89090ad58a67fc44f0",
386            ),
387            (
388                "879934026b61c35bc09f3c0381639f46e950de6dbc",
389                "ce44271e09c0bb5f86477ac33ce8e42fdc0c9393647fb56e8278cf464a3b8ddd",
390            ),
391            (
392                "d9e0eb60305ca7b4d27d39057990c80d0d5c0529e38c190cf04b8772",
393                "c93c1f6ff33a3af1ffeddcc3a8a72ee51c01f27fc05b952fc3f87348886da8ad",
394            ),
395            (
396                "d5462923ca756d93901ccce8036a5aa06908bc8bbe0ac0a42159a7e4ae9208ec8834e5",
397                "de5cb2c16cabf660fdf74189badd9ad34449f10f3632f6814191fa59ccd040c9",
398            ),
399            (
400                "fd1affdf2eedb633afc9fe518c695a620b96c9da85e155dff50ba3d97d6a5e7eb2382777f9adaa8a6fb0",
401                "0e8b47551049d322e12cbe2ff43d2ec08eda712fd11d550ab177d79f06e28163",
402            ),
403            (
404                "fef6cebfac94f9f46aa1074c90c1a3b7c0fd6c84b9ea326663838476572ba77af5602d8d8466ea47145f369360fc605937",
405                "e5dd1be8210962fd96df639a3ed871c655f8872459d71a7ee3500d4f3e027265",
406            ),
407            (
408                "85940f2c4c91cfdce0b67102e83bbefcfd9bff4f729a4e63c79c8879d9482cfb3d25c119f50729e33efc872a9fcf27fbb5b699ea58501ff0",
409                "56647edc2b78561ace7b915c1c6a887080122e66c758576026dd644bd9d224c1",
410            ),
411            (
412                "8ca87973006154380a6b46e8ddc6e1dc705a91c7387a39d02f56247c5773bab3b17a04c0cd8a022606aafecc2a77a166cbb3285f41153b9f7cfb9bd37ba00f",
413                "681c586ef676da893ade0f0ec1a47cda4e17a5a703a359a52bf1617bb7e49b1a",
414            ),
415            ("9da0ddcbe9", "9dfbef13f8e563e24105586ced11bcbf348828d1060063076eb60a61f5b8821e"),
416            (
417                "a053f3efd8a555cd31bdd1c9",
418                "d78ac3300609c6058529c95b48ace89921402ac4c26c9ad8154953db42c3ad4a",
419            ),
420            (
421                "7cec17557b48936681287eae21218e87e54ebc",
422                "ad709028414ad926baf415730d8929db0bfa5eb68793431c3e57f21a7f009824",
423            ),
424            (
425                "cc814421759c8d17ad0b10e2bc0b308b7166261c1a826b4cb7b0",
426                "f4869d34acf8b9082bea07247c10f070f3446b56833b3eaff9a920b8e9927c58",
427            ),
428            (
429                "06a31ebfb0cea09f006cd3e135738811207ac160c7e297336bd7cf6fb946ac0fae",
430                "24fc6b72ec49a3fc905857f0e7be0ff42959b8b2e5c03f4d8ffef777ead783d2",
431            ),
432            (
433                "64dc70622b2f68ec4a7d72dc1cb0cf79d6e0c882d8ca03e9dd458366e77d544c4c50fd8529899f7f",
434                "37bc45cae40d588350c46d2d207952790e6470b9c71b266ba4ad41f7e39018ce",
435            ),
436            (
437                "d71a18cbbe2fdd5802b43ae87b7177bda7ae028d5fecd008b56c377b96dbb549ed8b23753fd8348e9fcd0272899030",
438                "f26133db9ff33db54187f53ec5544e3ea76ae024f00c3503db8400f478416383",
439            ),
440            (
441                "3d5aa40a3e73873dca440596bbfaa3a8b3e9e8724753912160a50193aece85cfc11e8b721ac804e99670836fb29e3d55f4d6dadcae68",
442                "226beeb435de91d897d193b316d0f3da75269bd036f82f8186a63f5c2109ab5e",
443            ),
444            (
445                "f020eee1c66eac18213ad3228684458010382d2657d1d97e7d365cf824fc061c6ee0bcf1dcd82021f8e4263b38ed34e26a94e0a84b3496e97f83344337",
446                "db807626b7de2fd6bfb3818aec5d73d4edd3c906678ce22e761855a5dbf8736d",
447            ),
448            ("751e35", "ad3504020e937e5db906623dacfee45280fa567bf5289e3a098001ee318243fb"),
449            (
450                "be255e52c43f924dbc1e",
451                "151873926085e89410b8b2b3d91860cfeea6649ddbba24f4fca838d308a296bc",
452            ),
453            (
454                "a7218b8728033d7b84fb3f66c993644470",
455                "32c02065031fc87eb5bd4d85273d0b8f449abbfe878e83cc30aaf1d630e19369",
456            ),
457            (
458                "e7399eacdf0ec496f31db0015d9ed83bdf323492b461338f",
459                "4628e79c490462f9a4fd1b06a17c4962099eedf9d3b33721d298dbfd8fc76056",
460            ),
461            (
462                "698a62c23ebad896c63fe086f1254da31ee5e9620aeccaac2844867a5d12d2",
463                "963c033d0c157fffe862d2e75568a8656b5ec78c6c0ced4f81161710d8d8d89d",
464            ),
465            (
466                "750e8a21a40dbb56ac987157c0d5a05032b88ff297b8b88942a36fb864b30bc85b1ee7f5c98e",
467                "2f37d2062b8bd0d502aa2a9612bd4f249a42eb8bb7a15f77ef04d28019fe1f5b",
468            ),
469            (
470                "2f8b9a4713b2b2e49d24c24a4416d8f0f41674321fccee34a5be27a353c4294594faae22a7cacd0fae409b42ed",
471                "504f85a87594f936d718bdd7411c6d996789a0acf7c5a7853042dd8dc0a48f2e",
472            ),
473            (
474                "40506600ef19c2e690e7b88b924313aa0347209aac0622a8c81977f7b1d84e11d4eb4275bd4c5f2dd7a97a005031ad44646a5fe6",
475                "6840d915fc2d5b95d5961c9d5bff98393e80044673a1df15ca4cce7c151c62f4",
476            ),
477            (
478                "6f353f73229b906de7b2e5ad34bab368ae5b6c17a8c5fdca23d351a4486133217cb0b3845c756a88b7a6de95229dc6a96448cc7e47d51268dfb988",
479                "bfb5e2c05a8ebc431853bf475d24726c406eeb4af4a8087d55973f486ee16d13",
480            ),
481            ("c2", "c557e71380112b980eaf1145fa80621130dfbdfa1e375d87ae0018b7c60ac16b"),
482            (
483                "fc738c262e5eecc4",
484                "0ada1ed3e5fe2ad1858048a16294c8f0b55bfc7f15dafcb463dd672ebf04d40e",
485            ),
486            (
487                "1783c7c602ff98bdf4fbfcd8ea6b6c",
488                "863923efb0af98c325249db572d52a0673c5ffe9a9bf31e495b2d4fff93111b2",
489            ),
490            (
491                "d090c2618714675b1c8e2237fe53c9eabc4297bda47b",
492                "0aff4a9141824012c1f799763f92399030e741a31197b2e2363ba4f8818ca380",
493            ),
494            (
495                "f666261a4c3803e604686b42ce91d889ca66f052cff5255d53bfc717a7",
496                "0737fbf9fd63ccc2d3fa0a376d366aac16b7a07d5103121176a3690e6863eec5",
497            ),
498            (
499                "f516dfca4054522943c117295d803d6046c6dde4b9f0c7acc30ec012f15a1e909eebaf61",
500                "9c182d901054eae51342b9d17d41e82401bf4616c56fd5b3e3a5cd00122c6b98",
501            ),
502            (
503                "cb4f807652fd163a06b8f6e8fbe57b67c3169ac692984f5a6ebe5571e660d12f31eb4423b15a2753f90190",
504                "547ee5b2e4409893827e832bd1044df4cbe61bba2f5b5276a299ad5d382fc3e6",
505            ),
506            (
507                "9b1b00b57f3a6920b44dce6e6ef6d30d6dee0f7ee9b1395e6e38fbd25d7705a773254a0e85ccba89f342b62a2b0776fed802",
508                "95418971e7280dcce142b95e17beb8e0c788af90d4c5a2341724047f6996b6c2",
509            ),
510            (
511                "0c659f7173d1cea6762fa32525d231fb8d1e17ed7336d50481545bfac13d4d1fa66bf206cb20ce3d492672f9c6fc4ac3920f3761c3619c89a7",
512                "ee527f03467f2993243487bb463964013a1936133e5f43620c93c682cc7a0b5c",
513            ),
514            (
515                "0a6b79ac99ee746ffe5c04d224e1a4e58cf2b2060c542dca5ac6363906a9189900dba9098dcb8b7f2b22b4228aa37ad0d47f76e66c38eeb235e420ada105de22",
516                "0065a0d94a0d5947642f34fb5b257dcebaf6363a47e5fc65d08b95aa4cdc8084",
517            ),
518            (
519                "727a503090ed",
520                "0bb1c0507112fe197f0f3ce42a80dceab08d8fb993157cc525b511dc4da2d564",
521            ),
522            (
523                "cfc85371f2000f8892667f7159",
524                "f855e0ab39f9cfb1563aff454136e6ffa0aa90b0ee6129093547629e81b23f11",
525            ),
526            (
527                "686c063aff17b43ebba006ab04849773da2c4a0a",
528                "99df1c3f89ead9e0785f90f87e25b73d25f88dffaec34612a5ad7ea3cefd6a16",
529            ),
530            (
531                "281313ec576188f7562aeaa1442cb37fa696ec71b6729df4b1d758",
532                "e5f5eb5c5d945223e3a8b08181a3be61d71d5751b99898b434d1c7b4308553d2",
533            ),
534            (
535                "2a74e9bcf47a4028a434c7f2ebaf6a5fb52b6d5c2fa3029baaa2bce1344ffaa30a55",
536                "49882ca8651ca057448c7843911dd447559ed28e32db4bae7d4f26208df5d4cd",
537            ),
538            (
539                "387c347658c3cfb67f01db80393f7e4c0f1e50faec549ee800001f555deaf14ae400f839215820cd6e",
540                "8aa166327c0ec5cd298cd13d1bbd919b9437f200bbdc20fb60a20561b255a456",
541            ),
542            (
543                "c990c31bdd85a6653eb64d185bcd0b6ea91141b5ab72c3559cf060f9e74e96ecc8591d8de903a3150c163527a0c7901c",
544                "9d1ffed227d8ec8b044210082233ad7e1b912573263154ab90d06a8caad96967",
545            ),
546            (
547                "7d0b4c697cef32516b86d96752d6b3d00f3c7cb969f92939f3121867fded47ff176bbd15e3a99468fd15660ae9644bec3bbd5216b5c172",
548                "4206a229243815b3dcab4be3fd39d24f7deae3091c64ef9d313d3d1ee3eb3b86",
549            ),
550            (
551                "c57baa055c272b21b48f3a98469ca08dfa435272569072c828145755ffba8a8cf6d8d4071f40b5a8904cc0a4936f7f5e2195a329d2b933be2c1a0855aec2",
552                "3eb38115de1f4183359f673e697f7beb900504eada43f9043da7f753f00d913c",
553            ),
554            ("4203e2a0", "3ecd23bea7f5c52050b50e8aa0f163be47d90e840ce425be079962af9e9342dd"),
555            (
556                "6c33ae15f93da90a1745f2",
557                "fa18a66229996604db1c4158a3d12f9d1468ced5296ff72f014a073671c94299",
558            ),
559            (
560                "859c96d81af041bfa025efc4194eb105ee9a",
561                "13223ea266d386b45490be76dc17a85febe99b1518099d7a6c0e9a719f6458ff",
562            ),
563            (
564                "61f34a55b9bb38e01a29ed4b7c8ce1afbd65a9d855a0cab6c2",
565                "4dc44ba37b842e52f15bc8f7bac96c63dd2e621d53ffb8caa8cefa50fd10922d",
566            ),
567            (
568                "6a9ebf3c484afed269371969c7b613b3bae3e2c585f5cfc93a44ae5373c3ba83",
569                "0a851c6538bf83cebc61e0d2d7aab109ac4eee11dec47c84bc1ebcae9dacbbf7",
570            ),
571            (
572                "63686df9c41d7ebeb9210d3a80944acf5d6673c9f6cc593740216b84c044c2b69793de293e47da",
573                "f69be2fefd5b7f95d4cb4e503d93ccc4419bd3c84ac2b927344816703b4484e4",
574            ),
575            (
576                "b9a5fba3f9341de1768dd6547a325d71a880c624be17a382fc517a63d6bcd0ee7b7330187b27854acb3f78ff3a89",
577                "bf2e66ff5526f2ae18bcf337943731705cffcb09eef20be12c9bd6f0380190d3",
578            ),
579            (
580                "c4605fb3ae2f0e33bfebe0a4951688cb9893ee9f426a7ec4c611aafa450d37cf69c9febe3d8cbbe482c6721bf3dc4432a4a6bdb393",
581                "4c1ea15b2589e83a6dda16f9c1763282c1d91553a7a2eca4d35c571c15702a86",
582            ),
583            (
584                "f087d2bc3d0162117a7182d585e6ed63d2c961173cb6e6c3fdcbf12718919bae013af573fe0e384c9d72fd0d7f3ef119b2131e02badba24cdd1e8937",
585                "e8ef5e5c59de4f77c9dadfceb5a0b3d1b169b2acb2270136a2e2334b4b975861",
586            ),
587            ("4354", "15cbe5f066da796145940479d571424695e3077a1de270cb04972942d5b16260"),
588            (
589                "74cf5301bc2bde1401",
590                "49d43fd62391f63feaa6825132ee470929a01aae959f21362b889b95c007ccaa",
591            ),
592            (
593                "f8f985774a865fe4111c8d88f8185367",
594                "be9d1a07065d3520618977d94f4c676c98049e51e01a4edc9138d4d5eeb523ac",
595            ),
596            (
597                "8e9f9f37ddef9c44ce856fc04d4959f096783f9ff7c04b",
598                "393a745350c377d3344918ce1c162d1da134da88687d08271b1489d01b8c4072",
599            ),
600            (
601                "bb1378adc4c0bab282c0b69a8487e7281e80c8c904eec0245673d2e833ae",
602                "69ac9f99ccb55b225cc81e119ec91acf57d28466d559f16ca1216b1e419d7dea",
603            ),
604            (
605                "dd97b0f72c62161e917b28d8c18e8de8f5a28e4fc7b37d1fac9db3360365c81b35e0776f0f",
606                "6130cde3fabd59cfe79e9986d19e3827729b671427c544d4a049e656061cacad",
607            ),
608            (
609                "e2ab97041fdc9c4730aa0d37665b665c3248f3fee752a24e5fe76e378b567eb0fa671cea428f4986f0219e94",
610                "223b63957309d9f026c75af8da23d1e5559f7ae056ab3557560841a4e1539dca",
611            ),
612            (
613                "0110829a9a3ccdbf29d3d20b7730674de4f2cde57abf7926a637d1f9c8428d5f3c942e82632133c0d55a9168a927705218036d",
614                "e46d7427fe521fb12e214e633b02eb025d1530508a9cd6d6950e5d464109f7b8",
615            ),
616            (
617                "39d58c3424396a88020a796c09272c0f054402678c29eae43f1267b0a4ca47bbfc116ac53e7e954d35a8beb63e29ad102c79ce70388df23cc2a7",
618                "182c83a49991baf211977cdc44fc503495854332816bc5cda662f0eb5a64fdfd",
619            ),
620            ("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
621            (
622                "4d273643248639",
623                "57d19cff0c4837d002cadd02e77a9c94249b83a866b4c055147c77ecc4372caf",
624            ),
625            (
626                "8fe379b03218b8e775073b1dea88",
627                "998f139df347c8031da8f8723bb96e4bc2e32e2e2f0c7bf151ace1e2b0361c26",
628            ),
629            (
630                "2f550fa526ecb711207699b9b9710ebe361ab37bde",
631                "c8248a698192abd951b5f30bd9189ba7b45ca9bc4e75e8f54d9187627a71f85f",
632            ),
633            (
634                "b8578400bae02b7d0d87d54d25644e8bd6ed15c460ce9b28f97e6656",
635                "f91b8a8a0737c7aac7f2b9c08ed105ae8d19b9b461f6b80fab9aa603b7231cae",
636            ),
637            (
638                "3b83dad175f2a62fd3bc39c87cf8e075d801c7f2c7933a8540c338ef83c5272d408b07",
639                "6b3518f3444006b2b920892e5961d76751c322978ce9b3036a8c60c08dab8854",
640            ),
641            (
642                "49bb3f03a327cc2db0a1c50d58b28b842c7710b52bf747754110f910392315c72c1fd970e379fe6ecf91",
643                "07c1188569a12e8af52c94f5fa60f9561c0e68aae8c98be5d8fb8004c9cf05e3",
644            ),
645            (
646                "6a7c98181a19455dc38d1e0b8f20ecd843cb400b0992611208c468d0a11084e0405bf2692ffd0017a523532d95ef9b08cd",
647                "e7c58fda3c5abf794e7766cf50be3261a613e26599caa63c7165b9f1d59eb6ff",
648            ),
649            (
650                "c65d5a3f1b7702dcf940e1e57e898da814c7c03b422989e3d4bb0490f8fef30c66d67083f4f71431733350a0a00fffd2d2bc090daa281ebf",
651                "5c3eb1aaf475c87ce87b34da6e9525aacc4424c3bbf99b4096ab6dcc98c377bf",
652            ),
653            (
654                "4fa8cefd941963baae67a0d46375c75004764d29e97a9df8f8fdf6c767ecce24155b74e99ae4d000d77b185ed792e86270a81ea9d294d7b97d3d69485d49a8",
655                "5d69eb343ba79f527960323f338336d6866aaf9e32b08d6f2d54e1dd65c1fcdf",
656            ),
657            ("0b83f0bd70", "e8977f6f8459985d2d74b51ffad819d160159c71583d992f892ba39b996dff3f"),
658            (
659                "a9eebcf51d3cec3b3d4447f6",
660                "6315ad77e6addcc40c4ae196b1a882d0f401a3b4c7355972adfe8c4cedf062a8",
661            ),
662            (
663                "a2e7bf7cad909a786bc8836ea707995d0d9d53",
664                "dc9a2b2550ef3186f5a5429f3962b9593ab2dac7402d3e540f9b0f27a995ad70",
665            ),
666            (
667                "e0dd2c06b7386245163f761bf7f38b353ede2a088c031defc2f4",
668                "c9448ea4eda98513ebd7d963d527389c3996bdbdf1da97057d4048028982c0c9",
669            ),
670            (
671                "b25db250f30b615054a58371757ef0ca529a02299a51863bb0eead0e853546dddf",
672                "d8b401174f9a53881fb9fbda98a242b039628600517c78f1001ca70bd8a1a4d4",
673            ),
674            (
675                "5832f1f6d58d288abea576e8806b37b11327e66829cb0bf79c1b7f76efe807f699c10e4865b79e54",
676                "dc10155bc8e00e4325de0225b8182be3cc16fe248b62a8a98492a5e24d544adc",
677            ),
678            (
679                "ea6197a0629b8e5e7f57cd1caad0a659fc2f36ef5708dc646e25f7f5a292e2e8313dbed385505be23455c27e6be3bd",
680                "4bc2d68a8379ced24db8dc5343bd298c1b192f24c7a8055ed0b323ee5ccea393",
681            ),
682            (
683                "bfda22201cdf552d520e8b8537e9962886a29a5f1371d0cb422550f74ef51f7c087eea9837297e5657d39d3fbfc37c76a77e973ea7b4",
684                "a690eb129e679856b2184e1e4d755178216db78d243f7ebe3dcf345185e4a8b8",
685            ),
686            (
687                "80bc01b14d26ba7d589117f7bedaa275b3754d7bf69e9d27b70531ab78018a8f2f95f4d315e3c755884e2179476d88ddc1ccfc4f1ae4384b44fa23bb2e",
688                "3d3a17895dc22a8159a9d399cc2add762507de19351394ff5051cc6eda65b74d",
689            ),
690            ("c47c47", "af5173ff5eac5d0fff9a6c3902f09ffd61d0aef25b13c185d69b80e10c30107a"),
691            (
692                "f080ac710806bcf64dee",
693                "9382a4f9037b4db318542b7be35a7a6dafb4722aa26c759436be2bbf4e292e60",
694            ),
695            (
696                "b242cea5f041f2994874b1a62b14905191",
697                "f9f03aa0c2d190f7f6500b61e65d993cc8e4af4d373629d7b7cfb6a55c59a5b0",
698            ),
699            (
700                "78f732d6c784f4ccacc3c00eda5cbe7a110f8e90ad8cc384",
701                "7ff1e2d49d0c4a2e5b90e51588587bbd70f79a90111863730228e097402f7e76",
702            ),
703            (
704                "37b0733b747263fb37ccb470f84487ccfe148ea38dd8367a456bd17b5a9dc9",
705                "98c9fa505f30b488137d98975717d54c21f8e2cc761eb6adfdb5fce12d24f105",
706            ),
707            (
708                "846ef672cf854d676c87de9bc446b0c76bfb05c9c0e99694b379f11cbf4b5cbe1c10b521bda6",
709                "678d4d60b36c470f7d049cdf95640adaaec2b2067a77c3aca3c988ae754914fc",
710            ),
711            (
712                "521deab44bee2a023555438d5ccbff75ec02f4042e19c67c9ef8e6f57327f0f9068eb858f2199bef6064977e2f",
713                "73a896a9a1c965ecc315f03a9aac58597f2956506e60b0a68fbac33315a2f61f",
714            ),
715            (
716                "fc7c3f61cab4c8144e52dabdf5a3e9ef72009da8c037c2314ed6e1ea9a43afad1a46ec1d8c9d1e4be653d0f4c13e9b17f8cd5c54",
717                "d8098c0ea0304d35ed726c26d4d725aba337095040c5397dd62cc9a70e3e1306",
718            ),
719            (
720                "71b24fa83c18c00278adc2e343066046a77728c98b7ba81449a7d0e8dea90444a8a75b490c27ef353f075bf0c0a11e41da4ab4cb13086bb5f87c8e",
721                "309302e6b96754e3ff59f0ffb90caf4ae90b6cb3e27940dec9454201189a3c97",
722            ),
723            ("97", "2a0ab732b4e9d85ef7dc25303b64ab527c25a4d77815ebb579f396ec6caccad3"),
724            (
725                "0d94a717f7cf5df9",
726                "4542447791a885e66fba323792c4118dafd8361d7863e9bd0ddd9bbaab9ffaba",
727            ),
728            (
729                "5cbdd132d2209012d2290f55e3fe1f",
730                "8ecb69236a2a9f6be56f38c84603be9b5b92fb1c25005e43259115d8454b9b67",
731            ),
732            (
733                "768eee8abea17656940551056c9713716d320a2a0cb9",
734                "94d6dfef5cc4dead654dc8a650e2e132b06aa114cbffdf23c68039947349259c",
735            ),
736            (
737                "47712e12afa327ad192c452a0da90bcda1ef906698bc1285316846cc22",
738                "b90bb75bd297b8f546c139b5a26fb46fd112316fa5a3fddfdcdd4556cfd2dff6",
739            ),
740            (
741                "126891727439acdc1161400642a80999de1f28da0c518b4af1278b8841b9c6d8b244180f",
742                "40757cfdff2c73e98735951518dc091dc34b68fff1d68ff251a3321863c37345",
743            ),
744            (
745                "54ecf2789b2e3eef1724b166367551e1e646afd9cce5767f8aabecc2f7fe6da69214ec57e211a7befc044b",
746                "3b887f5f9c0c5bc6ac4f52736eec4ded964e9dcd117e8f9baa85032cea9c4e8e",
747            ),
748            (
749                "7289d69a04babaa27fee66171cd1666b1628592204179673fd85327fcc397a6a8861ca7ad4c597cc09d2160c0877dd2b0cbd",
750                "19e74cf19a326d0740027c319556ff831e65aa015da82fcb48985356a5d061ef",
751            ),
752            (
753                "57a1a075a7ce49e36a5416941fc429ce21da61500f1c09cd834b488f5dd67a89a92e7a5e2a6e47324dfe2bc68d57a527cdd4a56a57425c4265",
754                "0dc99c7dd4fe4ab85a5d8a0b7515e9534b19f8cacf493e8884493cc21d07b3bc",
755            ),
756            (
757                "36e6464bef8d81cc1b98d3fbae1858991c549eb4d0fcb2c710255c8902ad4e7f01b14474fc76e0b5a6320c7dd6e794ac4b67326d55df6a86705312e3c9055510",
758                "b4e57163fecca83e5b9dd7894d900b4d8ea01b7725e643a55846ce50853de970",
759            ),
760            (
761                "d02319d15e87",
762                "f455d9f7064df368166187fe17b14a15a93e67ccbc99550faac44a457edc2263",
763            ),
764            (
765                "5be0a84201b7335640e6b07d3a",
766                "9b33df4d8f7bf36d4a136aba552c3771d77dbd0270d350e3530f7a67f3fdde0a",
767            ),
768            (
769                "b5e6806b44ba1dc2f80aa8d5476b5f872fd2dc91",
770                "8a68514081af10ef7918660e44fbcc1c8a21f9d718c050106069a4bb31ea480a",
771            ),
772            (
773                "d1d78b6a108cdf127d8c12fbd9a76452840db1273bce2a275889e5",
774                "165b4bd73e2b938f6dda923b9f85157cfbccb3c5e7f61a670a81f23ef361845c",
775            ),
776            (
777                "efc04ec547bd62dd5128244095048075a4e6467b8a6d18484d98578eb7d9cbda46ca",
778                "9737e6d521bea8658ede7bd14e0ea89ce9aae7857b83834da50ba058d2e9c49f",
779            ),
780            (
781                "ca1bf388d3c0c1f9e46da7e60431f295050178954b5755660e5ead3e6a199ae8bb7a5af372a8bab885",
782                "f9b756edf36fa0a30b908f33be029540bb6b3e3319e4b32156e2e99f083fcb3a",
783            ),
784            (
785                "ef341223e4345e5bd00b3e04515baec9d6b4572914c7b6870913894e8fe34cc0809d8805edc0d0ba95ec152f4bba9095",
786                "2684cae4aa25adfcd28a91bf112bdfedaf8fdbc523df703ea8e67ac4e78d729c",
787            ),
788            (
789                "d5303bd0c6f162e463f72a8b87d052f0ab87fafe2f68f1bcbdc40f469d4c2e540499c2f6b93659f368762d514e8a15d5c88b048e886550",
790                "59a040487ed1c3bcc3b99c65ef811cb891a7f0ac7ac37aa1ef042cd1520fae39",
791            ),
792            (
793                "46ddf95c5c68e60c4c20cf1dc2dbd750ec4260d377c378b23b986ee63ef8cfd7b86183c5b5e8089179f35b3222e2d7dd2ac9e9616c752b6d6b650916c20d",
794                "1991783569a87cba2f48aee5160f6c8426a41b08ede5871c02bdbf694d467a95",
795            ),
796            ("90790696", "686bb7bee35d9686a38cda6def0398019c81b62d6010a8466a09f76206d037a3"),
797            (
798                "97f4f9d2bec84b1ca2db58",
799                "c8b72bd84f580e94fa7ef8b4e88926d00a98b6f323fab835efbeb9808703548d",
800            ),
801            (
802                "0dc0faf6c699812409a61fa80032ab87c64e",
803                "f7c741567f52668613d4e161f2370e09eb31351f68f64ec682961b9f909585ee",
804            ),
805            (
806                "69897e5d95ad505cc1e6838480a42a1a06a21595909ce559ea",
807                "994211f718af7a3c3f3d7cde23f987bcf563317186ad9fe532c3ef54e159d276",
808            ),
809            (
810                "9e9b1922fb266f55edbe32353b43bbd949da8a5b23aaab14173d3d41763939f0",
811                "28e6c47557e78b2e1435e3e79677326ca5b45f28ef248f88bc955266288eaeec",
812            ),
813            (
814                "0ba96e765c820b51408ddbc627b550926a41ec3786017ccacb936fdbd5030cde92e0177b3f5e59",
815                "c60a584bbf1c94839dfd70d63f51dd6580a5dd30882556ae860265ad3083c744",
816            ),
817            (
818                "7efc4a939f794fde6fff976a4e36750219c006200a4b8b482d03cc14a5bc9aa6c2eae1a962bf808a95facb390f9f",
819                "abeb0f8170e3b34e89b300992c202adf65dff87ef55c2b1be845e71e73ce158d",
820            ),
821            (
822                "69754d540d5be93b0c6c418b024052cc756800e7d385d426a782b1984bd4ee66d3719fbb27a0a0eb117ca154ab7ad6db15f9a6e9a7",
823                "6e1d575d3feadc85cd654e209c846c8faa8eb34cc22b29bae2b767031b0e82fe",
824            ),
825            (
826                "a17e78e502ac381990a3f52cfe18f177c3fa180c9e1e6fbb203121c41f51651a4c07a9f4abacbd650d1fcfbe45d5499a141720a9a34601a534d46244",
827                "2d5f498459653442000ecf2a1502eacdb5ef84eca24e34d7c6f18e43f108b90b",
828            ),
829            ("0cc3", "7a0c18383cbee9a9f915458d171443cfd5e1cfddda45c2ae47116677a9ddb47e"),
830            (
831                "173b4e07d58da2b84a",
832                "0900b18a88fe00998f30576a53a2110f624c12472f1cfd71ec477bf298ebef74",
833            ),
834            (
835                "9989bc9276844ae2c38575e7a6f6459f",
836                "ab9d4711ae8e020e0e1d4c34df449aad016fa41db94ef3dd9008af8e5be33683",
837            ),
838            (
839                "e3adf34897d1d3505a6e20f80d92f298a2b8243b93d5cc",
840                "585270fa18f29a8da9bc55f443126e69dd7d19c559a24105a2b202905b7daa27",
841            ),
842            (
843                "1d884350dbda55b2c5305527ff323863193b49ed73ecc4eb93ebdda22d1b",
844                "bfe1ac59f75fae2dfe1209929ec0a2713e5ff03e3bf5953016f3fb838b80a675",
845            ),
846            (
847                "4e2e42e997b2419cb3a730dd86da3822f538b768f786c8a1baca7c37ffd263f2ec02ae3c49",
848                "9e81b9634d27eb93863898ae74a9da2fdae5f75419a1874957efddcabb41715b",
849            ),
850            (
851                "9645b681c6931964a75c2bd3a59e466341a8b07ef6dd6710eb6e4ded1da04a20be06bc4e9d7641981a62d1a4",
852                "e24b1e7e7ff96921f9e0a172a5bcc251e448b40efc74fbecb40e2bc0ed0bfb13",
853            ),
854            (
855                "1b7904a1c7f76e932f43fb076373ca0c0e190cc3c9916d1d334289bcf419c75f84e02aa0004b573b3aeb960513b7c11f8b32b3",
856                "76eb4962e3328fe51df5cdcbbcb95713623b18fa9a096e6cca83c3f5fb6fa556",
857            ),
858            (
859                "b7cb4e2223061892ee4a208da31df3692648cf332fa9a40d9446b1728c92281aaad42cb4154b9e413474bca529a5022159f88bd54a959a557f72",
860                "e46aed5f9ae3665e5c0cc69f54faa4cf4df902d282645cf5a1d9393c75ce3291",
861            ),
862            ("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
863            (
864                "c1e8f05d93f1b6",
865                "d3ecc667f1dba94a8d0fc596ebbb04034aefee3d61c4b0215aa039b83f33588a",
866            ),
867            (
868                "b6ec8a3cd88a39495426773f7b34",
869                "773743abcc2a19d291141de4f04e623b4304a25ecef1455d7da012bcddee5549",
870            ),
871            (
872                "29800cbf188a9429e9d7fc88ceb7c68f6cedf9142d",
873                "d997201cf5852ab4cbfe591c586146f110a40119756f84290759a295ec8f6dc8",
874            ),
875            (
876                "1f2e55c623584e94f7608d792dff5de4f51c6e855066c7d7d1d1f657",
877                "45762d28e49eae7c37e5eea3dfb659864f125a4738802d9b3eea33c9aad26e04",
878            ),
879            (
880                "fac1e027153bef48fb9ed604a6144530f1b487b55dfda9eb14ae9aa5a680b0711ffd63",
881                "8d84aa41a59959a42e689c7b016304dc864135b225b193c7fe3d458c5927bc50",
882            ),
883            (
884                "a64fb45e63075365d49e208870d5c06a0517f98e479bd038c95747c7c0f9c1e91797f30de1a8d886ba9a",
885                "6ec45e8f2da626bac4b8199900d7d5fa0a6212810eb03166630ec6a3316e245f",
886            ),
887            (
888                "4581cc09e67075fbe9976deefd849d6b3d54c60b1fbec60de47d72b52bf5fb3c25d9aea8a6249d0b818852071def0b4d4c",
889                "67b3a86c2598aaaaa332b1d440bd39541145e959e22a84998f7b6e1903f5b39b",
890            ),
891            (
892                "59be4229c61eef4449f8d4e6c53556207cd27969c26bf577821455c5458061cdfceab41777e760956d3081bc00459baa0c04d3c5018bd25d",
893                "8d4dd229acd5ae95d42f34be13a309f62ec6dcaa931bac296e65fb00aafbfaa4",
894            ),
895            (
896                "6afe929710a922129e6e23aad4a7ab65ab044fc8f87aeceb3fc5de08f81f75d93df9e72ac1698cea13252486275d2899e54758af97237a2c5bc7bf17d7fdd8",
897                "8b9a4cc1113bb0d91c3fbbf8f091ad1eb41454bf90c50cc9b474d32a3a90e727",
898            ),
899            ("d37df0536c", "f962631e447da006755f1aba864eb7e021cc605bb2a25154905a50f3fef363a3"),
900            (
901                "ef52c33f39a4c719727d7272",
902                "7da8623c68fe25495065e20e3c3edf0c46e4707173a2a8ded939b78e88cf6925",
903            ),
904            (
905                "3191eed0f9a0c4f40e82a701fc3b81f546e90f",
906                "4e6453eb13458cfb321d7ee73f56e4e7b5823939909db258ae1570411acb5dae",
907            ),
908            (
909                "4dd6ec69dad0424273718c2e1aa667135a8061a537c32e6ab387",
910                "3c5772110cfb2bdbc0643fde4121b24993b1201e54067a5547eaa0af0b1cd29b",
911            ),
912            (
913                "e278ec9b0e852a2ae50b0cb9c8429b9874eddd62a61bfd511b301e8e85bef0cd8f",
914                "ed98fefc09bcecbb51d6d72d0445fe103eaa342759521fb70559c437e9dfe1e2",
915            ),
916            (
917                "3d0ac03306981beea76dbaab8706fad915d305da68e22376c134e297f7c94a2e13477bd3375b2ae4",
918                "ffc5fceffcddb95f1239df82c7a5de0f98b84771e152161ee7f56d2772bae22f",
919            ),
920            (
921                "e9dd4d457b326c8e2be92b40bf09599414e079ef8d5067654ba9248bdf1ea2043f5bb00efdb5b791647d1a295146fe",
922                "1f1965e6dcc9dc0d741aa5b70b8ec9f8510027d8b740d941d5cbf80edb754b33",
923            ),
924            (
925                "a8d28a8f62d904e8aa59bc0e47984620fda6c8e59121dcddbf34606bbb703d1d67d60d82de8cab73c96441c0dd330c753208e06b6928",
926                "b36aa00e382d2e23b00dde72d3f981389e4928e326f73964eb74351f3fdd8fe0",
927            ),
928            (
929                "11f6d88f650b05c4c841783c327c2f02e067babf9d4aacdbec6a456b29b602eb24d65fec772cde7f149eaedb7c4c73ce28bf5a47d88d56009c4cee9e0b",
930                "995606c012e72e7462fb353e133932be5e3f72ac70e80e40bd9d02b8bfb97789",
931            ),
932            ("54b986", "f233d372a0fd0af4e1ad718e354e46f79c059083d5d0424777cf19cf7993ec90"),
933            (
934                "0010dadb4c7f7a08ca9d",
935                "af9b75e25668fb27953475e7e767e7dde962d4b1b0f57d6083fe02049f9d9b39",
936            ),
937            (
938                "059501003f8fb444fd4ddf9efd18bda772",
939                "4aa701ba48775c23e937b1f66f3a88b2d830dc1d2cace6b680822f167dc55591",
940            ),
941            (
942                "9cc48d737d834fb4c795bfc77e8b34df5974be0b30403813",
943                "77e324e53199462527d3596c3f2383a75f771926c73922362771dd648c55b7a6",
944            ),
945            (
946                "31f8e05f995ed7014b544b4d526e2a95a6a7ef7966fe39d911fc95ef05a9b9",
947                "09ac9726a19c8042dccffd1042a4e8e0ba29a1c7a34b11c1793a07ccc62cc1e5",
948            ),
949            (
950                "1772fb44f784cbe9e0c3d111c7ba5195bd3a7bee57307e9df8f82cfd87fb77435b1db92de834",
951                "be35194b054594f4619d9adfc76065be039921cfa609446da90b69601a345721",
952            ),
953            (
954                "dd51ab1e908829bbcdb7419653a324aed941e60dfe3968b83589949443f28cfb261cfb747eebae184bf3445dc7",
955                "8e2682590be42c9e6f88ec466746df1f16f64728b2ee675e0cb4e04d89f1bb5b",
956            ),
957            (
958                "eb118d656016e9317a3f117559f0c0f535955f988a3735e20d4c4bd7cea50f64e383407be95112c205fab9e3c76b357dd6987c01",
959                "15d42dff9a3108a7c962aca5b8062b247d096c2e68715095169bc37cadf450d1",
960            ),
961            (
962                "13248056eb202d8d36ed3a018858868c4d838e683355fb6c0993da165ae1c51d2418456ecd9fb63e4c26b06b0e343a55a8e6b35bf0e8ebe779b972",
963                "3a3d1fdfc18a1aa49b6a4648501620bf1dc3049bce5ccb78a905f6884658099c",
964            ),
965            ("37", "7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451"),
966            (
967                "600e1530fb67088e",
968                "92bae31cf8936990038dabb24801147fd21fbfa0f7a49e3d5eaccd1fe890c541",
969            ),
970            (
971                "c47b98cea0071b39ccd44b3532af2d",
972                "c7dfb6edf6074c6b62fa0849b68caffaa242f6d6939816049f2b0174b9a86d5c",
973            ),
974            (
975                "88d8f4d679e2aa0f173e8b1c71a6730683fe0616c714",
976                "1bc456e4b2333ffed9e4f96be28183491e0dcf8e3019238b93cab0f2ab3cbc02",
977            ),
978            (
979                "1278a675038b13fb2f985ee503e7483eaef9492fa3f357fb1888343140",
980                "e5cf3950c316f88a2a9cf558bbaf21d0284b9dd05ed08c4ba81644e64ef34993",
981            ),
982            (
983                "418972e3e21c249e1c2a787f8623ce286cd8ab52a702dccc0b299c2adb679574f038ca38",
984                "d7ed7d62efa7bbb0a42341209ed36bd71ff5ced67de71804b4b9982288e34564",
985            ),
986            (
987                "10009d665791399c229af01d001dc2277ee8dd43aeea64b20959dbe5c4e8e0b41279a528a81f5273afd1c8",
988                "457ee361787414b2c5b2a87410fd7281474e99e0da993f5358b6384cc9641d67",
989            ),
990            (
991                "1014b899a4932e80222c56788f2c3f265a9946a648d7277c7a4f11998a641d6198e3f3b1c83942e78b1711ca122094a3e299",
992                "43824b484bb322b595e7a8a5699d7d89beae57b335bb61ba782421c323ca3b1a",
993            ),
994            (
995                "facf4a41a8f6db07a8f973dd914665d753e7eda48c285cccce431f54f7650daaa1a8a868845fd032726e7cd7cbde7b0c88081fbf5169583a6f",
996                "3bcdbf3b403e2e1387cc057297703cc7bc3bed78623ee0f1d07ea2aab94b0230",
997            ),
998            (
999                "cdb68c8db229fc673d1679c2484195f2fd4bdaaae7ca5cf9ce50e0d71da14a09756af240f541768c1f67924ff795a39dae48fd79e7a345a1db9447f21c45edfd",
1000                "2f4703b92e9c476cd0b16c3de811751d3399f33cc21d680b145d793fa08e0ec9",
1001            ),
1002            (
1003                "eda9f5ed5056",
1004                "d7251555fca8f07bd568636a0a53feae825f8532d263c5c3b2a94eae9844eaf6",
1005            ),
1006            (
1007                "947013199e766a02adcf9e2a3f",
1008                "231d2c0d064cf449a2ff5d4b1333dd08be8cdc42fa90b24ea09f6fa809475a87",
1009            ),
1010            (
1011                "bc05f4f8921b919ae0ef0b73d8a09ad9a02d4df4",
1012                "7789267e3851332393a8907b31f4dafe26e9497e3f3c66acccffef8c46a79f02",
1013            ),
1014            (
1015                "6549e81717f96ed4a90e441e0333300da89f52386baa7fb33e0dee",
1016                "cdef0f8a70c89a8e78ea7ae9daf296823f521ea0db49ead190d3c8435edfcce2",
1017            ),
1018            (
1019                "14c590d78feecb87bc466d930e702867804423b4f19bc7c5fab694161ec12574e4e2",
1020                "3aaa05d05f5cb94b971ae35a652fed2b15469e8224a6897b61253da59f613861",
1021            ),
1022            (
1023                "fcabbcb6cd6ea5b33e445ed305f4386441134370338c946a5cc328b2cce2df404d07c271db5ef9bae3",
1024                "38463f6563d5df4627f573b51ca8894b19a26d508d871f0a4284f90e41200b14",
1025            ),
1026        ];
1027
1028        for &(input_hex, expected) in test_cases {
1029            let input = hex::decode(input_hex).unwrap();
1030            let mut h = Sha256::new();
1031            h.update(&input);
1032            let digest = h.sum();
1033            assert_eq!(
1034                digest.as_ref(),
1035                hex::decode_array::<32>(expected.as_bytes()).unwrap(),
1036                "mismatch for input \"{}\"",
1037                input_hex
1038            );
1039        }
1040    }
1041}