1
2
3
4
5 package scrypt
6
7 import (
8 "bytes"
9 "testing"
10 )
11
12 type testVector struct {
13 password string
14 salt string
15 N, r, p int
16 output []byte
17 }
18
19 var good = []testVector{
20 {
21 "password",
22 "salt",
23 2, 10, 10,
24 []byte{
25 0x48, 0x2c, 0x85, 0x8e, 0x22, 0x90, 0x55, 0xe6, 0x2f,
26 0x41, 0xe0, 0xec, 0x81, 0x9a, 0x5e, 0xe1, 0x8b, 0xdb,
27 0x87, 0x25, 0x1a, 0x53, 0x4f, 0x75, 0xac, 0xd9, 0x5a,
28 0xc5, 0xe5, 0xa, 0xa1, 0x5f,
29 },
30 },
31 {
32 "password",
33 "salt",
34 16, 100, 100,
35 []byte{
36 0x88, 0xbd, 0x5e, 0xdb, 0x52, 0xd1, 0xdd, 0x0, 0x18,
37 0x87, 0x72, 0xad, 0x36, 0x17, 0x12, 0x90, 0x22, 0x4e,
38 0x74, 0x82, 0x95, 0x25, 0xb1, 0x8d, 0x73, 0x23, 0xa5,
39 0x7f, 0x91, 0x96, 0x3c, 0x37,
40 },
41 },
42 {
43 "this is a long \000 password",
44 "and this is a long \000 salt",
45 16384, 8, 1,
46 []byte{
47 0xc3, 0xf1, 0x82, 0xee, 0x2d, 0xec, 0x84, 0x6e, 0x70,
48 0xa6, 0x94, 0x2f, 0xb5, 0x29, 0x98, 0x5a, 0x3a, 0x09,
49 0x76, 0x5e, 0xf0, 0x4c, 0x61, 0x29, 0x23, 0xb1, 0x7f,
50 0x18, 0x55, 0x5a, 0x37, 0x07, 0x6d, 0xeb, 0x2b, 0x98,
51 0x30, 0xd6, 0x9d, 0xe5, 0x49, 0x26, 0x51, 0xe4, 0x50,
52 0x6a, 0xe5, 0x77, 0x6d, 0x96, 0xd4, 0x0f, 0x67, 0xaa,
53 0xee, 0x37, 0xe1, 0x77, 0x7b, 0x8a, 0xd5, 0xc3, 0x11,
54 0x14, 0x32, 0xbb, 0x3b, 0x6f, 0x7e, 0x12, 0x64, 0x40,
55 0x18, 0x79, 0xe6, 0x41, 0xae,
56 },
57 },
58 {
59 "p",
60 "s",
61 2, 1, 1,
62 []byte{
63 0x48, 0xb0, 0xd2, 0xa8, 0xa3, 0x27, 0x26, 0x11, 0x98,
64 0x4c, 0x50, 0xeb, 0xd6, 0x30, 0xaf, 0x52,
65 },
66 },
67
68 {
69 "",
70 "",
71 16, 1, 1,
72 []byte{
73 0x77, 0xd6, 0x57, 0x62, 0x38, 0x65, 0x7b, 0x20, 0x3b,
74 0x19, 0xca, 0x42, 0xc1, 0x8a, 0x04, 0x97, 0xf1, 0x6b,
75 0x48, 0x44, 0xe3, 0x07, 0x4a, 0xe8, 0xdf, 0xdf, 0xfa,
76 0x3f, 0xed, 0xe2, 0x14, 0x42, 0xfc, 0xd0, 0x06, 0x9d,
77 0xed, 0x09, 0x48, 0xf8, 0x32, 0x6a, 0x75, 0x3a, 0x0f,
78 0xc8, 0x1f, 0x17, 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d,
79 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89,
80 0x06,
81 },
82 },
83 {
84 "password",
85 "NaCl",
86 1024, 8, 16,
87 []byte{
88 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78,
89 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 0x7c, 0x6a,
90 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 0xe7, 0x73, 0x76,
91 0x63, 0x4b, 0x37, 0x31, 0x62, 0x2e, 0xaf, 0x30, 0xd9,
92 0x2e, 0x22, 0xa3, 0x88, 0x6f, 0xf1, 0x09, 0x27, 0x9d,
93 0x98, 0x30, 0xda, 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83,
94 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06,
95 0x40,
96 },
97 },
98 {
99 "pleaseletmein", "SodiumChloride",
100 16384, 8, 1,
101 []byte{
102 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, 0x46,
103 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb, 0xfd, 0xa8,
104 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e, 0xa9, 0xb5, 0x43,
105 0xf6, 0x54, 0x5d, 0xa1, 0xf2, 0xd5, 0x43, 0x29, 0x55,
106 0x61, 0x3f, 0x0f, 0xcf, 0x62, 0xd4, 0x97, 0x05, 0x24,
107 0x2a, 0x9a, 0xf9, 0xe6, 0x1e, 0x85, 0xdc, 0x0d, 0x65,
108 0x1e, 0x40, 0xdf, 0xcf, 0x01, 0x7b, 0x45, 0x57, 0x58,
109 0x87,
110 },
111 },
112
129 }
130
131 var bad = []testVector{
132 {"p", "s", 0, 1, 1, nil},
133 {"p", "s", 1, 1, 1, nil},
134 {"p", "s", 7, 8, 1, nil},
135 {"p", "s", 16, maxInt / 2, maxInt / 2, nil},
136 }
137
138 func TestKey(t *testing.T) {
139 for i, v := range good {
140 k, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, len(v.output))
141 if err != nil {
142 t.Errorf("%d: got unexpected error: %s", i, err)
143 }
144 if !bytes.Equal(k, v.output) {
145 t.Errorf("%d: expected %x, got %x", i, v.output, k)
146 }
147 }
148 for i, v := range bad {
149 _, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, 32)
150 if err == nil {
151 t.Errorf("%d: expected error, got nil", i)
152 }
153 }
154 }
155
156 var sink []byte
157
158 func BenchmarkKey(b *testing.B) {
159 for i := 0; i < b.N; i++ {
160 sink, _ = Key([]byte("password"), []byte("salt"), 1<<15, 8, 1, 64)
161 }
162 }
163
View as plain text