1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2020 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/>.
16 package gost34112012256
22 "golang.org/x/crypto/hkdf"
25 func TestHKDF(t *testing.T) {
26 t.Run("1", func(t *testing.T) {
28 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
29 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
30 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
33 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
34 0x08, 0x09, 0x0a, 0x0b, 0x0c,
36 prk := hkdf.Extract(New, ikm, salt)
37 if bytes.Compare(prk, []byte{
38 0x94, 0x7d, 0x3d, 0x99, 0x2e, 0xdc, 0x44, 0xe3,
39 0x7b, 0x32, 0x72, 0x40, 0xf1, 0x5e, 0x62, 0x91,
40 0x3c, 0x0b, 0x91, 0xcc, 0x3e, 0x21, 0x43, 0xff,
41 0xe7, 0x72, 0x43, 0x6e, 0xc6, 0x3c, 0x99, 0xed,
43 t.Fatal("PRK differs")
45 info := []byte{0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9}
46 okm := make([]byte, 42)
47 if _, err := hkdf.Expand(New, prk, info).Read(okm); err != nil {
48 t.Fatal("HKDF-Expand failed")
50 if bytes.Compare(okm, []byte{
51 0x35, 0xf8, 0xf8, 0x03, 0x7a, 0xad, 0xf7, 0xaf,
52 0x3e, 0x4f, 0xc7, 0xbc, 0x8b, 0x93, 0xa9, 0x27,
53 0xd6, 0x85, 0xd4, 0x2f, 0x66, 0x28, 0xf9, 0xe6,
54 0x23, 0xc8, 0x5e, 0x19, 0x70, 0x09, 0x69, 0x2e,
55 0xae, 0xb1, 0x0b, 0x25, 0x26, 0x71, 0x2a, 0x7b,
58 t.Fatal("OKM differs")
61 t.Run("2", func(t *testing.T) {
63 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
64 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
65 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
66 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
67 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
68 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
69 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
70 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
71 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
72 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
75 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
76 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
77 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
78 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
79 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
80 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
81 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
82 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
83 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
84 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
86 prk := hkdf.Extract(New, ikm, salt)
87 if bytes.Compare(prk, []byte{
88 0xa2, 0xff, 0xcd, 0x64, 0x44, 0x45, 0xef, 0x94,
89 0x7e, 0x7e, 0xc9, 0xa8, 0x26, 0x89, 0x3d, 0x9a,
90 0x91, 0xfc, 0xe2, 0x65, 0xb0, 0xc2, 0xa9, 0x59,
91 0x6c, 0x59, 0xe1, 0x41, 0x53, 0x1d, 0x90, 0x77,
93 t.Fatal("PRK differs")
96 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
97 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
98 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
99 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
100 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
101 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
102 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
103 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
104 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
105 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
107 okm := make([]byte, 82)
108 if _, err := hkdf.Expand(New, prk, info).Read(okm); err != nil {
109 t.Fatal("HKDF-Expand failed")
111 if bytes.Compare(okm, []byte{
112 0x28, 0x8c, 0x27, 0xff, 0xda, 0xf6, 0x4b, 0xe8,
113 0x24, 0xde, 0x84, 0x93, 0x48, 0x9d, 0x03, 0x12,
114 0x28, 0x07, 0xe9, 0x24, 0xaa, 0x6a, 0x09, 0x27,
115 0x01, 0x16, 0x9d, 0x2f, 0x66, 0x38, 0xc9, 0xd5,
116 0xc2, 0xbf, 0x09, 0xdb, 0x9f, 0xbe, 0x0b, 0x32,
117 0x88, 0x59, 0x7b, 0x67, 0x1d, 0xaf, 0x17, 0xed,
118 0x3e, 0x7d, 0xa5, 0x89, 0xdf, 0x69, 0xcc, 0x1d,
119 0xdc, 0xd8, 0x26, 0x2c, 0x1c, 0x6b, 0xe1, 0x4b,
120 0xc0, 0xb8, 0x5c, 0x4c, 0x2b, 0x24, 0xb6, 0xd8,
121 0xb4, 0x38, 0x18, 0xa1, 0xa5, 0xb0, 0x67, 0x53,
124 t.Fatal("OKM differs")
127 t.Run("3", func(t *testing.T) {
129 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
130 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
131 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
134 prk := hkdf.Extract(New, ikm, salt)
135 if bytes.Compare(prk, []byte{
136 0x1f, 0xfc, 0x6d, 0x2b, 0xf9, 0x59, 0x4d, 0xfd,
137 0xf7, 0x75, 0xc2, 0xc1, 0x8f, 0xa3, 0xae, 0xcc,
138 0x92, 0xb6, 0xf9, 0xbc, 0x5c, 0xff, 0x0e, 0x08,
139 0x6f, 0x34, 0x0f, 0xab, 0x33, 0x6d, 0x86, 0x5f,
141 t.Fatal("PRK differs")
144 okm := make([]byte, 42)
145 if _, err := hkdf.Expand(New, prk, info).Read(okm); err != nil {
146 t.Fatal("HKDF-Expand failed")
148 if bytes.Compare(okm, []byte{
149 0x6a, 0xad, 0xb1, 0xa6, 0x48, 0x96, 0x2f, 0x0d,
150 0x96, 0x19, 0xcc, 0xdb, 0xf9, 0xd9, 0x2d, 0xc3,
151 0x54, 0x79, 0x73, 0x73, 0x3b, 0xc4, 0x06, 0x1d,
152 0x9f, 0xa5, 0x3e, 0xa8, 0x2a, 0x17, 0x35, 0xd7,
153 0xf3, 0xa4, 0x84, 0x6c, 0x76, 0xf9, 0x94, 0xb5,
156 t.Fatal("OKM differs")