1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2023 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, version 3 of the License.
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program. If not, see <http://www.gnu.org/licenses/>.
25 "go.cypherpunks.ru/gogost/v5/gost28147"
28 func TestHashInterface(t *testing.T) {
33 func TestVectors(t *testing.T) {
36 t.Run("empty", func(t *testing.T) {
37 if !bytes.Equal(h.Sum(nil), []byte{
38 0xce, 0x85, 0xb9, 0x9c, 0xc4, 0x67, 0x52, 0xff,
39 0xfe, 0xe3, 0x5c, 0xab, 0x9a, 0x7b, 0x02, 0x78,
40 0xab, 0xb4, 0xc2, 0xd2, 0x05, 0x5c, 0xff, 0x68,
41 0x5a, 0xf4, 0x91, 0x2c, 0x49, 0x49, 0x0f, 0x8d,
47 t.Run("a", func(t *testing.T) {
50 if !bytes.Equal(h.Sum(nil), []byte{
51 0xd4, 0x2c, 0x53, 0x9e, 0x36, 0x7c, 0x66, 0xe9,
52 0xc8, 0x8a, 0x80, 0x1f, 0x66, 0x49, 0x34, 0x9c,
53 0x21, 0x87, 0x1b, 0x43, 0x44, 0xc6, 0xa5, 0x73,
54 0xf8, 0x49, 0xfd, 0xce, 0x62, 0xf3, 0x14, 0xdd,
60 t.Run("abc", func(t *testing.T) {
62 h.Write([]byte("abc"))
63 if !bytes.Equal(h.Sum(nil), []byte{
64 0xf3, 0x13, 0x43, 0x48, 0xc4, 0x4f, 0xb1, 0xb2,
65 0xa2, 0x77, 0x72, 0x9e, 0x22, 0x85, 0xeb, 0xb5,
66 0xcb, 0x5e, 0x0f, 0x29, 0xc9, 0x75, 0xbc, 0x75,
67 0x3b, 0x70, 0x49, 0x7c, 0x06, 0xa4, 0xd5, 0x1d,
73 t.Run("message digest", func(t *testing.T) {
75 h.Write([]byte("message digest"))
76 if !bytes.Equal(h.Sum(nil), []byte{
77 0xad, 0x44, 0x34, 0xec, 0xb1, 0x8f, 0x2c, 0x99,
78 0xb6, 0x0c, 0xbe, 0x59, 0xec, 0x3d, 0x24, 0x69,
79 0x58, 0x2b, 0x65, 0x27, 0x3f, 0x48, 0xde, 0x72,
80 0xdb, 0x2f, 0xde, 0x16, 0xa4, 0x88, 0x9a, 0x4d,
86 t.Run("128U", func(t *testing.T) {
88 for i := 0; i < 128; i++ {
91 if !bytes.Equal(h.Sum(nil), []byte{
92 0x53, 0xa3, 0xa3, 0xed, 0x25, 0x18, 0x0c, 0xef,
93 0x0c, 0x1d, 0x85, 0xa0, 0x74, 0x27, 0x3e, 0x55,
94 0x1c, 0x25, 0x66, 0x0a, 0x87, 0x06, 0x2a, 0x52,
95 0xd9, 0x26, 0xa9, 0xe8, 0xfe, 0x57, 0x33, 0xa4,
101 t.Run("lazy dog", func(t *testing.T) {
103 h.Write([]byte("The quick brown fox jumps over the lazy dog"))
104 if !bytes.Equal(h.Sum(nil), []byte{
105 0x77, 0xb7, 0xfa, 0x41, 0x0c, 0x9a, 0xc5, 0x8a,
106 0x25, 0xf4, 0x9b, 0xca, 0x7d, 0x04, 0x68, 0xc9,
107 0x29, 0x65, 0x29, 0x31, 0x5e, 0xac, 0xa7, 0x6b,
108 0xd1, 0xa1, 0x0f, 0x37, 0x6d, 0x1f, 0x42, 0x94,
114 t.Run("lazy cog", func(t *testing.T) {
116 h.Write([]byte("The quick brown fox jumps over the lazy cog"))
117 if !bytes.Equal(h.Sum(nil), []byte{
118 0xa3, 0xeb, 0xc4, 0xda, 0xaa, 0xb7, 0x8b, 0x0b,
119 0xe1, 0x31, 0xda, 0xb5, 0x73, 0x7a, 0x7f, 0x67,
120 0xe6, 0x02, 0x67, 0x0d, 0x54, 0x35, 0x21, 0x31,
121 0x91, 0x50, 0xd2, 0xe1, 0x4e, 0xee, 0xc4, 0x45,
127 t.Run("32", func(t *testing.T) {
129 h.Write([]byte("This is message, length=32 bytes"))
130 if !bytes.Equal(h.Sum(nil), []byte{
131 0xb1, 0xc4, 0x66, 0xd3, 0x75, 0x19, 0xb8, 0x2e,
132 0x83, 0x19, 0x81, 0x9f, 0xf3, 0x25, 0x95, 0xe0,
133 0x47, 0xa2, 0x8c, 0xb6, 0xf8, 0x3e, 0xff, 0x1c,
134 0x69, 0x16, 0xa8, 0x15, 0xa6, 0x37, 0xff, 0xfa,
140 t.Run("50", func(t *testing.T) {
142 h.Write([]byte("Suppose the original message has length = 50 bytes"))
143 if !bytes.Equal(h.Sum(nil), []byte{
144 0x47, 0x1a, 0xba, 0x57, 0xa6, 0x0a, 0x77, 0x0d,
145 0x3a, 0x76, 0x13, 0x06, 0x35, 0xc1, 0xfb, 0xea,
146 0x4e, 0xf1, 0x4d, 0xe5, 0x1f, 0x78, 0xb4, 0xae,
147 0x57, 0xdd, 0x89, 0x3b, 0x62, 0xf5, 0x52, 0x08,
154 func TestVectorsCryptoPro(t *testing.T) {
155 h := New(&gost28147.SboxIdGostR341194CryptoProParamSet)
157 t.Run("empty", func(t *testing.T) {
158 if !bytes.Equal(h.Sum(nil), []byte{
159 0x98, 0x1e, 0x5f, 0x3c, 0xa3, 0x0c, 0x84, 0x14,
160 0x87, 0x83, 0x0f, 0x84, 0xfb, 0x43, 0x3e, 0x13,
161 0xac, 0x11, 0x01, 0x56, 0x9b, 0x9c, 0x13, 0x58,
162 0x4a, 0xc4, 0x83, 0x23, 0x4c, 0xd6, 0x56, 0xc0,
168 t.Run("a", func(t *testing.T) {
171 if !bytes.Equal(h.Sum(nil), []byte{
172 0xe7, 0x4c, 0x52, 0xdd, 0x28, 0x21, 0x83, 0xbf,
173 0x37, 0xaf, 0x00, 0x79, 0xc9, 0xf7, 0x80, 0x55,
174 0x71, 0x5a, 0x10, 0x3f, 0x17, 0xe3, 0x13, 0x3c,
175 0xef, 0xf1, 0xaa, 0xcf, 0x2f, 0x40, 0x30, 0x11,
181 t.Run("abc", func(t *testing.T) {
183 h.Write([]byte("abc"))
184 if !bytes.Equal(h.Sum(nil), []byte{
185 0xb2, 0x85, 0x05, 0x6d, 0xbf, 0x18, 0xd7, 0x39,
186 0x2d, 0x76, 0x77, 0x36, 0x95, 0x24, 0xdd, 0x14,
187 0x74, 0x74, 0x59, 0xed, 0x81, 0x43, 0x99, 0x7e,
188 0x16, 0x3b, 0x29, 0x86, 0xf9, 0x2f, 0xd4, 0x2c,
194 t.Run("message digest", func(t *testing.T) {
196 h.Write([]byte("message digest"))
197 if !bytes.Equal(h.Sum(nil), []byte{
198 0xbc, 0x60, 0x41, 0xdd, 0x2a, 0xa4, 0x01, 0xeb,
199 0xfa, 0x6e, 0x98, 0x86, 0x73, 0x41, 0x74, 0xfe,
200 0xbd, 0xb4, 0x72, 0x9a, 0xa9, 0x72, 0xd6, 0x0f,
201 0x54, 0x9a, 0xc3, 0x9b, 0x29, 0x72, 0x1b, 0xa0,
207 t.Run("lazy dog", func(t *testing.T) {
209 h.Write([]byte("The quick brown fox jumps over the lazy dog"))
210 if !bytes.Equal(h.Sum(nil), []byte{
211 0x90, 0x04, 0x29, 0x4a, 0x36, 0x1a, 0x50, 0x8c,
212 0x58, 0x6f, 0xe5, 0x3d, 0x1f, 0x1b, 0x02, 0x74,
213 0x67, 0x65, 0xe7, 0x1b, 0x76, 0x54, 0x72, 0x78,
214 0x6e, 0x47, 0x70, 0xd5, 0x65, 0x83, 0x0a, 0x76,
220 t.Run("32", func(t *testing.T) {
222 h.Write([]byte("This is message, length=32 bytes"))
223 if !bytes.Equal(h.Sum(nil), []byte{
224 0x2c, 0xef, 0xc2, 0xf7, 0xb7, 0xbd, 0xc5, 0x14,
225 0xe1, 0x8e, 0xa5, 0x7f, 0xa7, 0x4f, 0xf3, 0x57,
226 0xe7, 0xfa, 0x17, 0xd6, 0x52, 0xc7, 0x5f, 0x69,
227 0xcb, 0x1b, 0xe7, 0x89, 0x3e, 0xde, 0x48, 0xeb,
233 t.Run("50", func(t *testing.T) {
235 h.Write([]byte("Suppose the original message has length = 50 bytes"))
236 if !bytes.Equal(h.Sum(nil), []byte{
237 0xc3, 0x73, 0x0c, 0x5c, 0xbc, 0xca, 0xcf, 0x91,
238 0x5a, 0xc2, 0x92, 0x67, 0x6f, 0x21, 0xe8, 0xbd,
239 0x4e, 0xf7, 0x53, 0x31, 0xd9, 0x40, 0x5e, 0x5f,
240 0x1a, 0x61, 0xdc, 0x31, 0x30, 0xa6, 0x50, 0x11,
246 t.Run("128U", func(t *testing.T) {
248 for i := 0; i < 128; i++ {
251 if !bytes.Equal(h.Sum(nil), []byte{
252 0x1c, 0x4a, 0xc7, 0x61, 0x46, 0x91, 0xbb, 0xf4,
253 0x27, 0xfa, 0x23, 0x16, 0x21, 0x6b, 0xe8, 0xf1,
254 0x0d, 0x92, 0xed, 0xfd, 0x37, 0xcd, 0x10, 0x27,
255 0x51, 0x4c, 0x10, 0x08, 0xf6, 0x49, 0xc4, 0xe8,
262 func TestRandom(t *testing.T) {
263 h := New(SboxDefault)
264 f := func(data []byte) bool {
269 for _, c := range data {
273 return bytes.Equal(d1, d2)
275 if err := quick.Check(f, nil); err != nil {
280 func BenchmarkHash(b *testing.B) {
281 h := New(SboxDefault)
282 src := make([]byte, BlockSize+1)
285 for i := 0; i < b.N; i++ {