1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2019 Sergey Matveev <stargrave@stargrave.org>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
27 func TestCTRGCL3Vector(t *testing.T) {
28 sbox := &SboxIdGost2814789TestParamSet
30 0x04, 0x75, 0xf6, 0xe0, 0x50, 0x38, 0xfb, 0xfa,
31 0xd2, 0xc7, 0xc3, 0x90, 0xed, 0xb3, 0xca, 0x3d,
32 0x15, 0x47, 0x12, 0x42, 0x91, 0xae, 0x1e, 0x8a,
33 0x2f, 0x79, 0xcd, 0x9e, 0xd2, 0xbc, 0xef, 0xbd,
36 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
37 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
38 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
39 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
40 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
41 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
42 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
43 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,
44 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
45 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,
46 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
47 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,
48 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
49 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,
50 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
51 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
52 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
53 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,
54 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
55 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,
56 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
57 0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
58 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,
59 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
60 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,
61 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,
62 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,
63 0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,
64 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
65 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
66 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
67 0xff, 0xfe, 0xfd, 0xfc, 0xfb,
70 0x4a, 0x5e, 0x37, 0x6c, 0xa1, 0x12, 0xd3, 0x55,
71 0x09, 0x13, 0x1a, 0x21, 0xac, 0xfb, 0xb2, 0x1e,
72 0x8c, 0x24, 0x9b, 0x57, 0x20, 0x68, 0x46, 0xd5,
73 0x23, 0x2a, 0x26, 0x35, 0x12, 0x56, 0x5c, 0x69,
74 0x2a, 0x2f, 0xd1, 0xab, 0xbd, 0x45, 0xdc, 0x3a,
75 0x1a, 0xa4, 0x57, 0x64, 0xd5, 0xe4, 0x69, 0x6d,
76 0xb4, 0x8b, 0xf1, 0x54, 0x78, 0x3b, 0x10, 0x8f,
77 0x7a, 0x4b, 0x32, 0xe0, 0xe8, 0x4c, 0xbf, 0x03,
78 0x24, 0x37, 0x95, 0x6a, 0x55, 0xa8, 0xce, 0x6f,
79 0x95, 0x62, 0x12, 0xf6, 0x79, 0xe6, 0xf0, 0x1b,
80 0x86, 0xef, 0x36, 0x36, 0x05, 0xd8, 0x6f, 0x10,
81 0xa1, 0x41, 0x05, 0x07, 0xf8, 0xfa, 0xa4, 0x0b,
82 0x17, 0x2c, 0x71, 0xbc, 0x8b, 0xcb, 0xcf, 0x3d,
83 0x74, 0x18, 0x32, 0x0b, 0x1c, 0xd2, 0x9e, 0x75,
84 0xba, 0x3e, 0x61, 0xe1, 0x61, 0x96, 0xd0, 0xee,
85 0x8f, 0xf2, 0x9a, 0x5e, 0xb7, 0x7a, 0x15, 0xaa,
86 0x4e, 0x1e, 0x77, 0x7c, 0x99, 0xe1, 0x41, 0x13,
87 0xf4, 0x60, 0x39, 0x46, 0x4c, 0x35, 0xde, 0x95,
88 0xcc, 0x4f, 0xd5, 0xaf, 0xd1, 0x4d, 0x84, 0x1a,
89 0x45, 0xc7, 0x2a, 0xf2, 0x2c, 0xc0, 0xb7, 0x94,
90 0xa3, 0x08, 0xb9, 0x12, 0x96, 0xb5, 0x97, 0x99,
91 0x3a, 0xb7, 0x0c, 0x14, 0x56, 0xb9, 0xcb, 0x49,
92 0x44, 0xa9, 0x93, 0xa9, 0xfb, 0x19, 0x10, 0x8c,
93 0x6a, 0x68, 0xe8, 0x7b, 0x06, 0x57, 0xf0, 0xef,
94 0x88, 0x44, 0xa6, 0xd2, 0x98, 0xbe, 0xd4, 0x07,
95 0x41, 0x37, 0x45, 0xa6, 0x71, 0x36, 0x76, 0x69,
96 0x4b, 0x75, 0x15, 0x33, 0x90, 0x29, 0x6e, 0x33,
97 0xcb, 0x96, 0x39, 0x78, 0x19, 0x2e, 0x96, 0xf3,
98 0x49, 0x4c, 0x89, 0x3d, 0xa1, 0x86, 0x82, 0x00,
99 0xce, 0xbd, 0x54, 0x29, 0x65, 0x00, 0x1d, 0x16,
100 0x13, 0xc3, 0xfe, 0x1f, 0x8c, 0x55, 0x63, 0x09,
101 0x1f, 0xcd, 0xd4, 0x28, 0xca,
103 iv := []byte{0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}
104 c := NewCipher(key, sbox)
106 tmp := make([]byte, len(plaintext))
107 ctr.XORKeyStream(tmp, plaintext)
108 if bytes.Compare(tmp, ciphertext) != 0 {
109 t.Fatal("encryption failed")
112 ctr.XORKeyStream(tmp, tmp)
113 if bytes.Compare(tmp, plaintext) != 0 {
114 t.Fatal("decryption failed")
118 func TestCTRGCL2Vector(t *testing.T) {
119 sbox := &SboxIdGost2814789TestParamSet
121 0xfc, 0x7a, 0xd2, 0x88, 0x6f, 0x45, 0x5b, 0x50,
122 0xd2, 0x90, 0x08, 0xfa, 0x62, 0x2b, 0x57, 0xd5,
123 0xc6, 0x5b, 0x3c, 0x63, 0x72, 0x02, 0x02, 0x57,
124 0x99, 0xca, 0xdf, 0x07, 0x68, 0x51, 0x9e, 0x8a,
127 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
128 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
129 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
130 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
131 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
132 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
133 0xff, 0xfe, 0xfd, 0xfc, 0xfb,
135 ciphertext := []byte{
136 0xd0, 0xbe, 0x60, 0x1a, 0x2c, 0xf1, 0x90, 0x26,
137 0x9b, 0x7b, 0x23, 0xb4, 0xd2, 0xcc, 0xe1, 0x15,
138 0xf6, 0x05, 0x57, 0x28, 0x88, 0x75, 0xeb, 0x1e,
139 0xd3, 0x62, 0xdc, 0xda, 0x9b, 0x62, 0xee, 0x9a,
140 0x57, 0x87, 0x8a, 0xf1, 0x82, 0x37, 0x9c, 0x7f,
141 0x13, 0xcc, 0x55, 0x38, 0xb5, 0x63, 0x32, 0xc5,
142 0x23, 0xa4, 0xcb, 0x7d, 0x51,
145 c := NewCipher(key, sbox)
146 ctr := c.NewCTR(iv[:])
147 tmp := make([]byte, len(plaintext))
148 ctr.XORKeyStream(tmp, plaintext)
149 if bytes.Compare(tmp, ciphertext) != 0 {
150 t.Fatal("encryption failed")
152 ctr = c.NewCTR(iv[:])
153 ctr.XORKeyStream(tmp, tmp)
154 if bytes.Compare(tmp, plaintext) != 0 {
155 t.Fatal("decryption failed")
159 func TestCTRRandom(t *testing.T) {
160 f := func(key [KeySize]byte, iv [BlockSize]byte, pt []byte) bool {
164 c := NewCipher(key[:], SboxDefault)
165 tmp := make([]byte, len(pt))
166 ctr := c.NewCTR(iv[:])
167 ctr.XORKeyStream(tmp, pt[:])
168 ctr = c.NewCTR(iv[:])
169 ctr.XORKeyStream(tmp, tmp)
170 return bytes.Compare(tmp, pt) == 0
172 if err := quick.Check(f, nil); err != nil {
176 func TestCTRInterface(t *testing.T) {
177 var key [KeySize]byte
179 c := NewCipher(key[:], SboxDefault)
180 var _ cipher.Stream = c.NewCTR(iv[:])
183 func BenchmarkCTR(b *testing.B) {
184 key := make([]byte, KeySize)
185 iv := make([]byte, BlockSize)
188 dst := make([]byte, BlockSize)
189 src := make([]byte, BlockSize)
191 c := NewCipher(key, SboxDefault)
194 for i := 0; i < b.N; i++ {
195 ctr.XORKeyStream(dst, src)