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  }