github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/stdlibs/crypto/chacha20/chacha/chacha_test.gno (about) 1 // Copyright (c) 2016 Andreas Auernhammer. All rights reserved. 2 // Use of this source code is governed by a license that can be 3 // found in the LICENSE file. 4 5 package chacha 6 7 import ( 8 "bytes" 9 "crypto/cipher" 10 "encoding/hex" 11 "testing" 12 ) 13 14 func toHex(bits []byte) string { 15 return hex.EncodeToString(bits) 16 } 17 18 func fromHex(bits string) []byte { 19 b, err := hex.DecodeString(bits) 20 if err != nil { 21 panic(err) 22 } 23 return b 24 } 25 26 func TestHChaCha20(t *testing.T) { 27 defer func(sse2, ssse3, avx, avx2 bool) { 28 useSSE2, useSSSE3, useAVX, useAVX2 = sse2, ssse3, avx, avx2 29 }(useSSE2, useSSSE3, useAVX, useAVX2) 30 31 if useAVX2 { 32 t.Log("AVX2 version") 33 testHChaCha20(t) 34 useAVX2 = false 35 } 36 if useAVX { 37 t.Log("AVX version") 38 testHChaCha20(t) 39 useAVX = false 40 } 41 if useSSSE3 { 42 t.Log("SSSE3 version") 43 testHChaCha20(t) 44 useSSSE3 = false 45 } 46 if useSSE2 { 47 t.Log("SSE2 version") 48 testHChaCha20(t) 49 useSSE2 = false 50 } 51 t.Log("generic version") 52 testHChaCha20(t) 53 } 54 55 func TestVectors(t *testing.T) { 56 defer func(sse2, ssse3, avx, avx2 bool) { 57 useSSE2, useSSSE3, useAVX, useAVX2 = sse2, ssse3, avx, avx2 58 }(useSSE2, useSSSE3, useAVX, useAVX2) 59 60 if useAVX2 { 61 t.Log("AVX2 version") 62 testVectors(t) 63 useAVX2 = false 64 } 65 if useAVX { 66 t.Log("AVX version") 67 testVectors(t) 68 useAVX = false 69 } 70 if useSSSE3 { 71 t.Log("SSSE3 version") 72 testVectors(t) 73 useSSSE3 = false 74 } 75 if useSSE2 { 76 t.Log("SSE2 version") 77 testVectors(t) 78 useSSE2 = false 79 } 80 t.Log("generic version") 81 testVectors(t) 82 } 83 84 var overflowTests = []struct { 85 NonceSize int 86 Counter uint64 87 PlaintextSize int 88 }{ 89 {NonceSize: NonceSize, Counter: ^uint64(0), PlaintextSize: 65}, 90 {NonceSize: NonceSize, Counter: ^uint64(1), PlaintextSize: 129}, 91 {NonceSize: INonceSize, Counter: uint64(^uint32(0)), PlaintextSize: 65}, 92 {NonceSize: INonceSize, Counter: uint64(^uint32(1)), PlaintextSize: 129}, 93 {NonceSize: XNonceSize, Counter: ^uint64(0), PlaintextSize: 65}, 94 {NonceSize: XNonceSize, Counter: ^uint64(1), PlaintextSize: 129}, 95 } 96 97 func TestOverflow(t *testing.T) { 98 var key [32]byte 99 for i, test := range overflowTests { 100 stream, err := NewCipher(make([]byte, test.NonceSize), key[:], 20) 101 if err != nil { 102 t.Errorf("Test %d: Failed to create cipher.Stream: %v", i, err) 103 continue 104 } 105 stream.SetCounter(test.Counter) 106 testOverflow(i, make([]byte, test.PlaintextSize), stream, t) 107 } 108 } 109 110 func testOverflow(i int, plaintext []byte, stream cipher.Stream, t *testing.T) { 111 defer func() { 112 if err := recover(); err == nil { 113 t.Errorf("Test %d: expected test to panic but it succeeded", i) 114 } 115 }() 116 stream.XORKeyStream(plaintext, plaintext) 117 } 118 119 func TestIncremental(t *testing.T) { 120 defer func(sse2, ssse3, avx, avx2 bool) { 121 useSSE2, useSSSE3, useAVX, useAVX2 = sse2, ssse3, avx, avx2 122 }(useSSE2, useSSSE3, useAVX, useAVX2) 123 124 if useAVX2 { 125 t.Log("AVX2 version") 126 testIncremental(t, 5, 2049) 127 useAVX2 = false 128 } 129 if useAVX { 130 t.Log("AVX version") 131 testIncremental(t, 5, 2049) 132 useAVX = false 133 } 134 if useSSSE3 { 135 t.Log("SSSE3 version") 136 testIncremental(t, 5, 2049) 137 useSSSE3 = false 138 } 139 if useSSE2 { 140 t.Log("SSE2 version") 141 testIncremental(t, 5, 2049) 142 } 143 } 144 145 func testHChaCha20(t *testing.T) { 146 for i, v := range hChaCha20Vectors { 147 var key [32]byte 148 var nonce [16]byte 149 copy(key[:], v.key) 150 copy(nonce[:], v.nonce) 151 152 hChaCha20(&key, &nonce, &key) 153 if !bytes.Equal(key[:], v.keystream) { 154 t.Errorf("Test %d: keystream mismatch:\n \t got: %s\n \t want: %s", i, toHex(key[:]), toHex(v.keystream)) 155 } 156 } 157 } 158 159 func testVectors(t *testing.T) { 160 for i, v := range vectors { 161 if len(v.plaintext) == 0 { 162 v.plaintext = make([]byte, len(v.ciphertext)) 163 } 164 165 dst := make([]byte, len(v.ciphertext)) 166 167 XORKeyStream(dst, v.plaintext, v.nonce, v.key, v.rounds) 168 if !bytes.Equal(dst, v.ciphertext) { 169 t.Errorf("Test %d: ciphertext mismatch:\n \t got: %s\n \t want: %s", i, toHex(dst), toHex(v.ciphertext)) 170 } 171 172 c, err := NewCipher(v.nonce, v.key, v.rounds) 173 if err != nil { 174 t.Fatal(err) 175 } 176 c.XORKeyStream(dst[:1], v.plaintext[:1]) 177 c.XORKeyStream(dst[1:], v.plaintext[1:]) 178 if !bytes.Equal(dst, v.ciphertext) { 179 t.Errorf("Test %d: ciphertext mismatch:\n \t got: %s\n \t want: %s", i, toHex(dst), toHex(v.ciphertext)) 180 } 181 } 182 } 183 184 func testIncremental(t *testing.T, iter int, size int) { 185 sse2, ssse3, avx, avx2 := useSSE2, useSSSE3, useAVX, useAVX2 186 msg, ref, stream := make([]byte, size), make([]byte, size), make([]byte, size) 187 188 for i := 0; i < iter; i++ { 189 var key [32]byte 190 var nonce []byte 191 switch i % 3 { 192 case 0: 193 nonce = make([]byte, 8) 194 case 1: 195 nonce = make([]byte, 12) 196 case 2: 197 nonce = make([]byte, 24) 198 } 199 200 for j := range key { 201 key[j] = byte(len(nonce) + i) 202 } 203 for j := range nonce { 204 nonce[j] = byte(i) 205 } 206 207 for j := 0; j <= len(msg); j++ { 208 useSSE2, useSSSE3, useAVX, useAVX2 = false, false, false, false 209 XORKeyStream(ref[:j], msg[:j], nonce, key[:], 20) 210 211 useSSE2, useSSSE3, useAVX, useAVX2 = sse2, ssse3, avx, avx2 212 XORKeyStream(stream[:j], msg[:j], nonce, key[:], 20) 213 214 if !bytes.Equal(ref[:j], stream[:j]) { 215 t.Fatalf("Iteration %d failed:\n Message length: %d\n\n got: %s\nwant: %s", i, j, toHex(stream[:j]), toHex(ref[:j])) 216 } 217 218 useSSE2, useSSSE3, useAVX, useAVX2 = false, false, false, false 219 c, _ := NewCipher(nonce, key[:], 20) 220 c.XORKeyStream(stream[:j], msg[:j]) 221 222 useSSE2, useSSSE3, useAVX, useAVX2 = sse2, ssse3, avx, avx2 223 c, _ = NewCipher(nonce, key[:], 20) 224 c.XORKeyStream(stream[:j], msg[:j]) 225 226 if !bytes.Equal(ref[:j], stream[:j]) { 227 t.Fatalf("Iteration %d failed:\n Message length: %d\n\n got: %s\nwant: %s", i, j, toHex(stream[:j]), toHex(ref[:j])) 228 } 229 } 230 copy(msg, stream) 231 } 232 } 233 234 var hChaCha20Vectors = []struct { 235 key, nonce, keystream []byte 236 }{ 237 { 238 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 239 fromHex("000000000000000000000000000000000000000000000000"), 240 fromHex("1140704c328d1d5d0e30086cdf209dbd6a43b8f41518a11cc387b669b2ee6586"), 241 }, 242 { 243 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 244 fromHex("000000000000000000000000000000000000000000000000"), 245 fromHex("7d266a7fd808cae4c02a0a70dcbfbcc250dae65ce3eae7fc210f54cc8f77df86"), 246 }, 247 { 248 fromHex("0000000000000000000000000000000000000000000000000000000000000001"), 249 fromHex("000000000000000000000000000000000000000000000002"), 250 fromHex("e0c77ff931bb9163a5460c02ac281c2b53d792b1c43fea817e9ad275ae546963"), 251 }, 252 { 253 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 254 fromHex("000102030405060708090a0b0c0d0e0f1011121314151617"), 255 fromHex("51e3ff45a895675c4b33b46c64f4a9ace110d34df6a2ceab486372bacbd3eff6"), 256 }, 257 } 258 259 var vectors = []struct { 260 key, nonce, plaintext, ciphertext []byte 261 rounds int 262 }{ 263 { 264 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 265 fromHex("000000000000000000000000"), 266 nil, 267 fromHex("76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586"), 268 20, 269 }, 270 { 271 fromHex("0000000000000000000000000000000000000000000000000000000000000001"), 272 fromHex("000000000000000000000002"), 273 fromHex("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + 274 "416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69" + 275 "636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073" + 276 "746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572" + 277 "656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e" + 278 "747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e696361" + 279 "74696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f"), 280 fromHex("ecfa254f845f647473d3cb140da9e87606cb33066c447b87bc2666dde3fbb739a371c9ec7abcb4cfa9211f7d90f64c2d07f89e5cf9b93e330a6e4c08af5ba6d5" + 281 "a3fbf07df3fa2fde4f376ca23e82737041605d9f4f4f57bd8cff2c1d4b7955ec2a97948bd3722915c8f3d337f7d370050e9e96d647b7c39f56e031ca5eb6250d" + 282 "4042e02785ececfa4b4bb5e8ead0440e20b6e8db09d881a7c6132f420e52795042bdfa7773d8a9051447b3291ce1411c680465552aa6c405b7764d5e87bea85a" + 283 "d00f8449ed8f72d0d662ab052691ca66424bc86d2df80ea41f43abf937d3259dc4b2d0dfb48a6c9139ddd7f76966e928e635553ba76c5c879d7b35d49eb2e62b" + 284 "0871cdac638939e25e8a1e0ef9d5280fa8ca328b351c3c765989cbcf3daa8b6ccc3aaf9f3979c92b3720fc88dc95ed84a1be059c6499b9fda236e7e818b04b0b" + 285 "c39c1e876b193bfe5569753f88128cc08aaa9b63d1a16f80ef2554d7189c411f5869ca52c5b83fa36ff216b9c1d30062bebcfd2dc5bce0911934fda79a86f6e6" + 286 "98ced759c3ff9b6477338f3da4f9cd8514ea9982ccafb341b2384dd902f3d1ab7ac61dd29c6f21ba5b862f3730e37cfdc4fd806c22f221"), 287 20, 288 }, 289 { 290 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 291 fromHex("000000000000000000000000"), 292 nil, 293 fromHex("e29edae0466dea17f2576ce95025dd2db2d34fc81b5153f1b70a87f315a35286"), 294 20, 295 }, 296 { 297 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 298 fromHex("000000000000000000000000"), 299 nil, 300 fromHex("e29edae0466dea17f2576ce95025dd2db2d34fc81b5153f1b70a87f315a35286fb56db91e8dbf0a93faaa25777aad63450dae65ce3eae7fc210f54cc8f77df8662f8" + 301 "955228b2358d61d8c5ccf63a6c40203be5fb4541c39c52861de70b8a1416ddd3fe9a818bae8f0e8ff2288cede0459fbb00032fd85fef972fcb586c228d"), 302 20, 303 }, 304 { 305 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 306 fromHex("0000000000000000"), 307 nil, 308 fromHex("76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee65869f07" + 309 "e7be5551387a98ba977c732d080dcb0f29a048e3656912c6533e32ee7aed29b721769ce64e43d57133b074d839d531ed1f28510afb45ace10a1f4b794d6f2d09a0e663266ce1ae7ed1081968a0758e7" + 310 "18e997bd362c6b0c34634a9a0b35d012737681f7b5d0f281e3afde458bc1e73d2d313c9cf94c05ff3716240a248f21320a058d7b3566bd520daaa3ed2bf0ac5b8b120fb852773c3639734b45c91a42d" + 311 "d4cb83f8840d2eedb158131062ac3f1f2cf8ff6dcd1856e86a1e6c3167167ee5a688742b47c5adfb59d4df76fd1db1e51ee03b1ca9f82aca173edb8b7293474ebe980f904d10c916442b4783a0e9848" + 312 "60cb6c957b39c38ed8f51cffaa68a4de01025a39c504546b9dc1406a7eb28151e5150d7b204baa719d4f091021217db5cf1b5c84c4fa71a879610a1a695ac527c5b56774a6b8a21aae88685868e094c" + 313 "f29ef4090af7a90cc07e8817aa528763797d3c332b67ca4bc110642c2151ec47ee84cb8c42d85f10e2a8cb18c3b7335f26e8c39a12b1bcc1707177b7613873"), 314 20, 315 }, 316 { 317 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 318 fromHex("0100000000000000"), 319 nil, 320 fromHex("ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd138e50d32111e4caf237ee53ca8ad6426194a88545ddc497a0b466e7d6bbdb0041b2f586b5305" + 321 "e5e44aff19b235936144675efbe4409eb7e8e5f1430f5f5836aeb49bb5328b017c4b9dc11f8a03863fa803dc71d5726b2b6b31aa32708afe5af1d6b690584d58792b271e5fdb92c486051c48b79a4d4" + 322 "8a109bb2d0477956e74c25e93c3c2db34bf779470464a033b8394517a5cf3576a6618c8551a456628b253ef0117c90cd46d8177a2a06d16e20e05c05f889bf87e95d6ee8a03807d1cd53d586872b125" + 323 "9d0647da7b7aae80af9b3aad41ad5a8141d2e156c9dd52a3bd2ae165bd7d6a2a4e2cf6938b8b390828ff20dc8fd60e2cd17fe368e35b467a70654ba93cfa62760a9d2f26da7818d4d863808e1add5ff" + 324 "db76d41efd524ded4246e03caa008950c91dedfc9a8e68173fe481c4d3d3c215fdf3af22aeab0097b835a84faabbbce094c6181a193ffeda067271ff7c10cce76542241116283842e31e922430211dc" + 325 "b38e556158fc2daaec367b705b75f782f8bc2c2c5e33a375390c3052f7e3446feb105fb47820f1d2539811c5b49bb76dc15f2d20a7e2c200b573db9f653ed7"), 326 20, 327 }, 328 { 329 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 330 fromHex("0001020304050607"), 331 nil, 332 fromHex("f798a189f195e66982105ffb640bb7757f579da31602fc93ec01ac56f85ac3c134a4547b733b46413042c9440049176905d3be59ea1c53f15916155c2be8241a3800" + 333 "8b9a26bc35941e2444177c8ade6689de95264986d95889fb60e84629c9bd9a5acb1cc118be563eb9b3a4a472f82e09a7e778492b562ef7130e88dfe031c79db9d4f7c7a899151b9a475032b63fc3852" + 334 "45fe054e3dd5a97a5f576fe064025d3ce042c566ab2c507b138db853e3d6959660996546cc9c4a6eafdc777c040d70eaf46f76dad3979e5c5360c3317166a1c894c94a371876a94df7628fe4eaaf2cc" + 335 "b27d5aaae0ad7ad0f9d4b6ad3b54098746d4524d38407a6deb3ab78fab78c94213668bbbd394c5de93b853178addd6b97f9fa1ec3e56c00c9ddff0a44a204241175a4cab0f961ba53ede9bdf960b94f" + 336 "9829b1f3414726429b362c5b538e391520f489b7ed8d20ae3fd49e9e259e44397514d618c96c4846be3c680bdc11c71dcbbe29ccf80d62a0938fa549391e6ea57ecbe2606790ec15d2224ae307c1442" + 337 "26b7c4e8c2f97d2a1d67852d29beba110edd445197012062a393a9c92803ad3b4f31d7bc6033ccf7932cfed3f019044d25905916777286f82f9a4cc1ffe430"), 338 20, 339 }, 340 { 341 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 342 fromHex("000000000000000000000000"), 343 nil, 344 fromHex("9bf49a6a0755f953811fce125f2683d50429c3bb49e074147e0089a52eae155f0564f879d27ae3c02ce82834acfa8c793a629f2ca0de6919610be82f411326be0bd588" + 345 "41203e74fe86fc71338ce0173dc628ebb719bdcbcc151585214cc089b442258dcda14cf111c602b8971b8cc843e91e46ca905151c02744a6b017e69316b20cd67c4bdecc538e8be990c1b6425d68bfd3a" + 346 "6fe97693e4846351596cca8abf59fddd0b7f52dcc0c60a448cbf9511610b0a742f1e4d238a7a45cae054ec2"), 347 12, 348 }, 349 { 350 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 351 fromHex("000000000000000000000000"), 352 nil, 353 fromHex("789cc357f0b6cda5395f08c8538f1226d08eb3e16ebd6b6db6cc9ca77d81d900bb9d21f6ef0b720550d161f1a80fab0468e48c086daad356edce3a3f988d8e"), 354 12, 355 }, 356 { 357 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 358 fromHex("0001020304050607"), 359 nil, 360 fromHex("6898eb04f3d151985e28e882f35daf28d2a1689f79081ffb08cdc48edbbd3dcd683c764f3dd7302293928ca3d4ef4194e6e22f41a72204a14b89115d06ca29fb0b9f6e" + 361 "ba3da6793a928afe76cdf62a5d5b0898bb9bb2348612189fdb825e5aa7559c9ec79ff80d05079fad81e9bc2521b2ebcb179cebeade91f20ff3e13192d60de2ee983ec07047e7827594773c28448d89e9b" + 362 "96bb0f8665b1a56f85abebd584a446e17d5a6fb847a1dbf341ece5124ff5f80d4a57fb7edf65a2907939b2f3c9654ccbfa2e5225edc8d799bf7ce296d6c8f9234cec0bd7b91b3d2ddc27f93ff8591ddb3" + 363 "62b54fab111a7da9d5b4187661ed0e691f7aa5959fb83112427a95bbeb"), 364 12, 365 }, 366 { 367 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 368 fromHex("0001020304050607"), 369 nil, 370 fromHex("40e1aaea1c843baa28b18eb728fec05dce47b0e824bf9a5d3f1bb1aad13b37fbbf0b0e146732c16380efeab70a1b6edff9acedc876b70d98b61f192290537973"), 371 8, 372 }, 373 { 374 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 375 fromHex("000000000000000000000000000000000000000000000000"), 376 nil, 377 fromHex("bcd02a18bf3f01d19292de30a7a8fdaca4b65e50a6002cc72cd6d2f7c91ac3d5728f83e0aad2bfcf9abd2d2db58faedd65015dd83fc09b131e271043019e8e0f789e96" + 378 "89e5208d7fd9e1f3c5b5341f48ef18a13e418998addadd97a3693a987f8e82ecd5c1433bfed1af49750c0f1ff29c4174a05b119aa3a9e8333812e0c0fea49e1ee0134a70a9d49c24e0cbd8fc3ba27e97c" + 379 "3322ad487f778f8dc6a122fa59cbe33e7"), 380 20, 381 }, 382 { 383 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 384 fromHex("000000000000000000000000000000000000000000000000"), 385 nil, 386 fromHex("ccfe8a9e93431bd582f07b3eb0f4a7afc22ef39337ddd84f0d3545b318a315a32b3abb96de0fc6acde48b248fe8a80e6fa72bfcdf9d8d2656b991676476f052d937308" + 387 "0e30d8c0e217126a3c64402e1d9404ba9d6b8ce4ad5ac9693f3660638c26ea2cd1b4a8d3348c1e179ead353ee72fee558e9994c51a27195e287d00ec2f8cfef8866d1f98714f40cbe4e18cebabf3cd1fd" + 388 "3bb65506e5dce1ad09f438bffe2c96d7f2f0827c8c3f2ca59dbaa393785c6b8da7c69c8a4a63ffd113dcc93de8f52dbcfaed5e4cbcc1dc310b1352868fab7b14d930a9f7a7d47bed0eaf5b151f6dac8bd" + 389 "45510698bdc205d70b944ea5450888dd3ec753da9708bf06c0714822dda74f285c361abd0cd1071324c253dc421905edca36e8808bffef091e7dbdecebdad98cf70b7cede72e9c3c4108e5b32ffae0f42" + 390 "151a8196939d8e3b8384be1"), 391 20, 392 }, 393 { 394 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 395 fromHex("000102030405060708090a0b0c0d0e0f1011121314151617"), 396 nil, 397 fromHex("e53a61cef151e81401067de33adfc02e90ab205361b49b539fda7f0e63b1bc7d68fbee56c9c20c39960e595f3ea76c979804d08cfa728e66cb5f766b840ec61f9ec20f" + 398 "7f90d28dae334426cecb52a8e84b4728a5fdd61deb7f1a3fb63dadf5595e06b6e441670964d595ae59cf21536271bae2594774fb19079b933d8fe744f4"), 399 20, 400 }, 401 { 402 fromHex("FF00000000000000000000000000000000000000000000000000000000000000"), 403 fromHex("000000000000000000000000"), 404 nil, 405 fromHex("4fe0956ef81829ff96ef093f03c15dc0eaf4e6905eff9777a5db78348915689ed64204e8fce664cb71ea4016185d15e05be4329e02fcd472707508ef62fd89565ffa632effdb" + 406 "bf08394aa437d8ff093e6cea49b61672cf294474927a8150e06cec9fdec0f5cf26f257fe335a8d7dd6d208e6df6f0a83bb1b0b5c574edc2c9a604e4310acb970815a9819c91a5137794d1ee71ede3e5d59f27e76" + 407 "84d287d704fe3945de0a9b66be3d86e66980263602aeb600efaef243b1adf4c701dbf8f57427dee71dacd703d25317ffc7a67e7881ad13f0bf096d3b0486eec71fef5e0efb5964d14eb2cea0336e34ed4444cc2b" + 408 "bdbd8ef5ba89a0a5e9e35a2e23b38d3f9136f42aefb25c2e7eae0b42c1d1ada5618c5299aedd469ce4f9353ccbae3f89110922b669b8d1b62e72aaf893b83ca264707efbefdcf22ef2333b01f18a849653b52925" + 409 "63c37314bf34289b0636a2f8c24bc97fec554a9c31ec2cb4e30ba70fa965a17561e56739be138d86a4777f866ca24ba24f70913230e1b3ea34a9a90eea1b6a3a81b93286bb582a53e78557845a654775a18efb77" + 410 "eee098d2680bc4ceb866874f31c7fadd70262cca6039833522de03cb2527dc5cfc7072db48b6011b852d705c7b24ffedf52facf352ab2512c625811db7965edc87d08f7f27e02665c9a6a42968e4c58cd86aa847" + 411 "69658153b62f208b2dcfbcb364d63e6671cf60698640"), 412 20, 413 }, 414 { 415 fromHex("0120000000000000000000000000007000000000000000000000000000000DEF"), 416 fromHex("000000000000000000000000"), 417 nil, 418 fromHex("ba6bce79c4f79c815b7fec53840ff0549ff5496378aa1f6ba481a48a5b9b8dbea8b820eccbc4eca37e1050fc53510a746037d2707f81e9683ec3f495b02ad0f848d7f9bf67bc" + 419 "6299be525d1bf3bfd9953caa12cc4e1d5a6969e6fcd5d3c3e3d9f2e735cd7808755ddda7b22a3ae6040e7f8d05d62661a97d84dad694c69637aea3ae0af9f73303ffce3ae6161281d7a3c7e50a5706d766b34ddd" + 420 "eab6974fdab10b3f48fb31f26df72e54c616edf1afc019f240c059a7c003677008227f49b021bc23c9c51d6f85ad136a4aa4950d9692f7094d344d88c05868691eb620d39bd8154986c971a8c9552ff0015fd78a" + 421 "6bdd33df94b0056786a1e0ceb9cc9a38a31fbba224c1fb82bf6af376f67e94337a730301a6365d49b0dd56328e0269cbdfb5bcbccf1c7c3f4922ec1310aa2ef8136be788a55190453d3d3153b1b960a16f79365a" + 422 "0bc7d6d2d5cda9f0993dbb815ee72f83b9d2ed296598fb21d91c29d1acf4ff0a549784a1d6a4f0935ee18efbf41fdc98d81c449544e9701d92648c06e5f416833b90d15fd4c04fc720a5ec6c6fc8b3d85a66826a" + 423 "5e6817e21c4c4c0d7151b128236c41397ad4c6549e827c42269659973c153db70ffc33951b19ff21428091cea3836f72f88082508bae1839b59fa9c2556bdf373419d3cf29a8fad4d1787d829ad884f9927228fc" + 424 "0b8bb7f1a067e7bdbf06c3885154f76f5be0cde8c7c59442b72b0e3f0341afe644e7eb4c29a467288aebc893e17b446c63da7551b8b59ebdd0cbcd65bc79a969bd3397f83d149840de731df4c09a833d5bd9feda" + 425 "e1cd78a09b233b020de86ab71b9fd425adf84e502cef7c62015eade66ca91b0a90306894b53c7c5147e524d7b919ccdd0731e4eef8fe476b6eed38c91b611cd1777b9acf6eee0a11eaff16ae872db92a5d133fe7" + 426 "bed999882da283893dd1e96f530be3cd36bf38c16deed2cd77651b6e0d3628de3cb86a78f1d07f6fc79434da5f73888be617b84595acef154f66b95ade1a3e120421a9dac6eec1e5b60139da3d604a03d4a9b7a3" + 427 "0810a9c7d551aa8df08e11544486ad33000bfe410e8e6f35cb9d22806a5fcacefc6a1257d373d426243576fad9b20ad5ba84befc1a47c79d7bd2923b5776d3df86c8ed98b700d317502849ec8c02ecb8513a7a32" + 428 "e2db15e75a814f12cfc20429ae06cae2021406b4f174ce56dca65f7994a3b2722e764520a52f87d0a887fc771dbfbf381b4f750dc074fedec1a43a4df37a5a2c148f89d9630ebbd1be1858bed10207cdacae9a0a" + 429 "b92df58de53de4718f929a83474fbcf9969f1d28a5b257cacd56f0ff0bc425c93d8c91ac833c2cfefb97d82fe6236f3ec3c29e0112a6cac5abfec733db41265f8ff486e7d7fa0b3d9766357377f089056c9408d8" + 430 "2f09f18700236cc1058ea1c273e287d07d521fdbb5e28d41cc1d95999eccee"), 431 20, 432 }, 433 }