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 TestHashInterface(t *testing.T) {
32 func TestVectors(t *testing.T) {
36 t.Run("1", func(t *testing.T) {
38 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
39 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
40 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33,
41 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31,
42 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
43 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
44 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
45 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32,
48 if bytes.Compare(h512.Sum(nil), []byte{
49 0x1b, 0x54, 0xd0, 0x1a, 0x4a, 0xf5, 0xb9, 0xd5,
50 0xcc, 0x3d, 0x86, 0xd6, 0x8d, 0x28, 0x54, 0x62,
51 0xb1, 0x9a, 0xbc, 0x24, 0x75, 0x22, 0x2f, 0x35,
52 0xc0, 0x85, 0x12, 0x2b, 0xe4, 0xba, 0x1f, 0xfa,
53 0x00, 0xad, 0x30, 0xf8, 0x76, 0x7b, 0x3a, 0x82,
54 0x38, 0x4c, 0x65, 0x74, 0xf0, 0x24, 0xc3, 0x11,
55 0xe2, 0xa4, 0x81, 0x33, 0x2b, 0x08, 0xef, 0x7f,
56 0x41, 0x79, 0x78, 0x91, 0xc1, 0x64, 0x6f, 0x48,
61 if bytes.Compare(h256.Sum(nil), []byte{
62 0x9d, 0x15, 0x1e, 0xef, 0xd8, 0x59, 0x0b, 0x89,
63 0xda, 0xa6, 0xba, 0x6c, 0xb7, 0x4a, 0xf9, 0x27,
64 0x5d, 0xd0, 0x51, 0x02, 0x6b, 0xb1, 0x49, 0xa4,
65 0x52, 0xfd, 0x84, 0xe5, 0xe5, 0x7b, 0x55, 0x00,
71 t.Run("Се ветри", func(t *testing.T) {
72 // It is CP1251-encoded "Се ветри, Стрибожи внуци, веютъ с моря
73 // стрелами на храбрыя плъкы Игоревы" string
77 0xd1, 0xe5, 0x20, 0xe2, 0xe5, 0xf2, 0xf0, 0xe8,
78 0x2c, 0x20, 0xd1, 0xf2, 0xf0, 0xe8, 0xe1, 0xee,
79 0xe6, 0xe8, 0x20, 0xe2, 0xed, 0xf3, 0xf6, 0xe8,
80 0x2c, 0x20, 0xe2, 0xe5, 0xfe, 0xf2, 0xfa, 0x20,
81 0xf1, 0x20, 0xec, 0xee, 0xf0, 0xff, 0x20, 0xf1,
82 0xf2, 0xf0, 0xe5, 0xeb, 0xe0, 0xec, 0xe8, 0x20,
83 0xed, 0xe0, 0x20, 0xf5, 0xf0, 0xe0, 0xe1, 0xf0,
84 0xfb, 0xff, 0x20, 0xef, 0xeb, 0xfa, 0xea, 0xfb,
85 0x20, 0xc8, 0xe3, 0xee, 0xf0, 0xe5, 0xe2, 0xfb,
88 if bytes.Compare(h512.Sum(nil), []byte{
89 0x1e, 0x88, 0xe6, 0x22, 0x26, 0xbf, 0xca, 0x6f,
90 0x99, 0x94, 0xf1, 0xf2, 0xd5, 0x15, 0x69, 0xe0,
91 0xda, 0xf8, 0x47, 0x5a, 0x3b, 0x0f, 0xe6, 0x1a,
92 0x53, 0x00, 0xee, 0xe4, 0x6d, 0x96, 0x13, 0x76,
93 0x03, 0x5f, 0xe8, 0x35, 0x49, 0xad, 0xa2, 0xb8,
94 0x62, 0x0f, 0xcd, 0x7c, 0x49, 0x6c, 0xe5, 0xb3,
95 0x3f, 0x0c, 0xb9, 0xdd, 0xdc, 0x2b, 0x64, 0x60,
96 0x14, 0x3b, 0x03, 0xda, 0xba, 0xc9, 0xfb, 0x28,
101 if bytes.Compare(h256.Sum(nil), []byte{
102 0x9d, 0xd2, 0xfe, 0x4e, 0x90, 0x40, 0x9e, 0x5d,
103 0xa8, 0x7f, 0x53, 0x97, 0x6d, 0x74, 0x05, 0xb0,
104 0xc0, 0xca, 0xc6, 0x28, 0xfc, 0x66, 0x9a, 0x74,
105 0x1d, 0x50, 0x06, 0x3c, 0x55, 0x7e, 0x8f, 0x50,
111 t.Run("https://habr.com/ru/post/450024/", func(t *testing.T) {
114 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x3e, 0x00, 0x03, 0x00, 0xfe, 0xff, 0x09, 0x00,
118 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
120 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
122 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
128 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
129 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
130 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
131 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
134 if bytes.Compare(h256.Sum(nil), []byte{
135 0xc7, 0x66, 0x08, 0x55, 0x40, 0xca, 0xaa, 0x89,
136 0x53, 0xbf, 0xcf, 0x7a, 0x1b, 0xa2, 0x20, 0x61,
137 0x9c, 0xee, 0x50, 0xd6, 0x5d, 0xc2, 0x42, 0xf8,
138 0x2f, 0x23, 0xba, 0x4b, 0x18, 0x0b, 0x18, 0xe0,
145 func TestBlocksized(t *testing.T) {
147 m := make([]byte, BlockSize)
148 for i := 0; i < BlockSize; i++ {
152 if bytes.Compare(h.Sum(nil), []byte{
153 0x2a, 0xe5, 0x81, 0xf1, 0x8a, 0xe8, 0x5e, 0x35,
154 0x96, 0xc9, 0x36, 0xac, 0xbe, 0xf9, 0x10, 0xf2,
155 0xed, 0x70, 0xdc, 0xf9, 0x1e, 0xd5, 0xd2, 0x4b,
156 0x39, 0xa5, 0xaf, 0x65, 0x7b, 0xf8, 0x23, 0x2a,
157 0x30, 0x3d, 0x68, 0x60, 0x56, 0xc8, 0xc0, 0x0b,
158 0xf3, 0x0d, 0x42, 0xe1, 0x6c, 0xe2, 0x55, 0x42,
159 0x6f, 0xa8, 0xa1, 0x55, 0xdc, 0xb3, 0xeb, 0x82,
160 0x2d, 0x92, 0x58, 0x08, 0xf7, 0xc7, 0xe3, 0x45,
166 func TestBehaviour(t *testing.T) {
168 // Sum does not change the state
170 if bytes.Compare(h.Sum(nil), hsh1) != 0 {
173 // No data equals to no state changing
175 if bytes.Compare(h.Sum(nil), hsh1) != 0 {
180 if bytes.Compare(h.Sum(nil), hsh1) != 0 {
185 func TestRandom(t *testing.T) {
187 f := func(data []byte) bool {
192 for _, c := range data {
196 return bytes.Compare(d1, d2) == 0
198 if err := quick.Check(f, nil); err != nil {
203 func BenchmarkHash(b *testing.B) {
205 src := make([]byte, BlockSize+1)
208 for i := 0; i < b.N; i++ {