github.com/Team-Kujira/tendermint@v0.34.24-indexer/crypto/xchacha20poly1305/vector_test.go (about) 1 package xchacha20poly1305 2 3 import ( 4 "bytes" 5 "encoding/hex" 6 "testing" 7 ) 8 9 func toHex(bits []byte) string { 10 return hex.EncodeToString(bits) 11 } 12 13 func fromHex(bits string) []byte { 14 b, err := hex.DecodeString(bits) 15 if err != nil { 16 panic(err) 17 } 18 return b 19 } 20 21 func TestHChaCha20(t *testing.T) { 22 for i, v := range hChaCha20Vectors { 23 var key [32]byte 24 var nonce [16]byte 25 copy(key[:], v.key) 26 copy(nonce[:], v.nonce) 27 28 HChaCha20(&key, &nonce, &key) 29 if !bytes.Equal(key[:], v.keystream) { 30 t.Errorf("test %d: keystream mismatch:\n \t got: %s\n \t want: %s", i, toHex(key[:]), toHex(v.keystream)) 31 } 32 } 33 } 34 35 var hChaCha20Vectors = []struct { 36 key, nonce, keystream []byte 37 }{ 38 { 39 fromHex("0000000000000000000000000000000000000000000000000000000000000000"), 40 fromHex("000000000000000000000000000000000000000000000000"), 41 fromHex("1140704c328d1d5d0e30086cdf209dbd6a43b8f41518a11cc387b669b2ee6586"), 42 }, 43 { 44 fromHex("8000000000000000000000000000000000000000000000000000000000000000"), 45 fromHex("000000000000000000000000000000000000000000000000"), 46 fromHex("7d266a7fd808cae4c02a0a70dcbfbcc250dae65ce3eae7fc210f54cc8f77df86"), 47 }, 48 { 49 fromHex("0000000000000000000000000000000000000000000000000000000000000001"), 50 fromHex("000000000000000000000000000000000000000000000002"), 51 fromHex("e0c77ff931bb9163a5460c02ac281c2b53d792b1c43fea817e9ad275ae546963"), 52 }, 53 { 54 fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), 55 fromHex("000102030405060708090a0b0c0d0e0f1011121314151617"), 56 fromHex("51e3ff45a895675c4b33b46c64f4a9ace110d34df6a2ceab486372bacbd3eff6"), 57 }, 58 { 59 fromHex("24f11cce8a1b3d61e441561a696c1c1b7e173d084fd4812425435a8896a013dc"), 60 fromHex("d9660c5900ae19ddad28d6e06e45fe5e"), 61 fromHex("5966b3eec3bff1189f831f06afe4d4e3be97fa9235ec8c20d08acfbbb4e851e3"), 62 }, 63 } 64 65 func TestVectors(t *testing.T) { 66 for i, v := range vectors { 67 if len(v.plaintext) == 0 { 68 v.plaintext = make([]byte, len(v.ciphertext)) 69 } 70 71 var nonce [24]byte 72 copy(nonce[:], v.nonce) 73 74 aead, err := New(v.key) 75 if err != nil { 76 t.Error(err) 77 } 78 79 dst := aead.Seal(nil, nonce[:], v.plaintext, v.ad) 80 if !bytes.Equal(dst, v.ciphertext) { 81 t.Errorf("test %d: ciphertext mismatch:\n \t got: %s\n \t want: %s", i, toHex(dst), toHex(v.ciphertext)) 82 } 83 open, err := aead.Open(nil, nonce[:], dst, v.ad) 84 if err != nil { 85 t.Error(err) 86 } 87 if !bytes.Equal(open, v.plaintext) { 88 t.Errorf("test %d: plaintext mismatch:\n \t got: %s\n \t want: %s", i, string(open), string(v.plaintext)) 89 } 90 } 91 } 92 93 var vectors = []struct { 94 key, nonce, ad, plaintext, ciphertext []byte 95 }{ 96 { 97 []byte{ 98 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 99 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 100 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 101 }, 102 []byte{0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b}, 103 []byte{0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7}, 104 []byte( 105 "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.", 106 ), 107 []byte{ 108 0x45, 0x3c, 0x06, 0x93, 0xa7, 0x40, 0x7f, 0x04, 0xff, 0x4c, 0x56, 109 0xae, 0xdb, 0x17, 0xa3, 0xc0, 0xa1, 0xaf, 0xff, 0x01, 0x17, 0x49, 110 0x30, 0xfc, 0x22, 0x28, 0x7c, 0x33, 0xdb, 0xcf, 0x0a, 0xc8, 0xb8, 111 0x9a, 0xd9, 0x29, 0x53, 0x0a, 0x1b, 0xb3, 0xab, 0x5e, 0x69, 0xf2, 112 0x4c, 0x7f, 0x60, 0x70, 0xc8, 0xf8, 0x40, 0xc9, 0xab, 0xb4, 0xf6, 113 0x9f, 0xbf, 0xc8, 0xa7, 0xff, 0x51, 0x26, 0xfa, 0xee, 0xbb, 0xb5, 114 0x58, 0x05, 0xee, 0x9c, 0x1c, 0xf2, 0xce, 0x5a, 0x57, 0x26, 0x32, 115 0x87, 0xae, 0xc5, 0x78, 0x0f, 0x04, 0xec, 0x32, 0x4c, 0x35, 0x14, 116 0x12, 0x2c, 0xfc, 0x32, 0x31, 0xfc, 0x1a, 0x8b, 0x71, 0x8a, 0x62, 117 0x86, 0x37, 0x30, 0xa2, 0x70, 0x2b, 0xb7, 0x63, 0x66, 0x11, 0x6b, 118 0xed, 0x09, 0xe0, 0xfd, 0x5c, 0x6d, 0x84, 0xb6, 0xb0, 0xc1, 0xab, 119 0xaf, 0x24, 0x9d, 0x5d, 0xd0, 0xf7, 0xf5, 0xa7, 0xea, 120 }, 121 }, 122 }