Skip to content

Commit 9410da7

Browse files
committed
Convert scrypt C code to Go
1 parent 79182db commit 9410da7

File tree

2 files changed

+115
-95
lines changed

2 files changed

+115
-95
lines changed

ltcutil/scrypt/scrypt.c

-91
This file was deleted.

ltcutil/scrypt/scrypt.go

+115-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,127 @@
11
package scrypt
22

3-
// void scrypt_aux(unsigned char*);
4-
import "C"
5-
63
import (
74
"crypto/sha256"
5+
"math/bits"
6+
"unsafe"
87

98
"golang.org/x/crypto/pbkdf2"
109
)
1110

1211
func Scrypt(x []byte) []byte {
1312
X := pbkdf2.Key(x, x, 1, 128, sha256.New)
14-
C.scrypt_aux((*C.uchar)(&X[0]))
13+
scrypt((*[32]uint32)(unsafe.Pointer(&X[0])))
1514
return pbkdf2.Key(x, X, 1, 32, sha256.New)
1615
}
16+
17+
func scrypt(X *[32]uint32) {
18+
var (
19+
V [1024][32]uint32
20+
A = (*[16]uint32)(X[:16])
21+
B = (*[16]uint32)(X[16:])
22+
)
23+
24+
for i := 0; i < len(V); i++ {
25+
V[i] = *X
26+
salsa8(A, B)
27+
salsa8(B, A)
28+
}
29+
30+
for i := 0; i < len(V); i++ {
31+
j := X[16] % uint32(len(V))
32+
for k := 0; k < len(X); k++ {
33+
X[k] ^= V[j][k]
34+
}
35+
salsa8(A, B)
36+
salsa8(B, A)
37+
}
38+
}
39+
40+
func rotl(x uint32, k int) uint32 {
41+
return uint32(bits.RotateLeft64(uint64(x), k))
42+
}
43+
44+
func salsa8(A, B *[16]uint32) {
45+
A[0] ^= B[0]
46+
A[1] ^= B[1]
47+
A[2] ^= B[2]
48+
A[3] ^= B[3]
49+
A[4] ^= B[4]
50+
A[5] ^= B[5]
51+
A[6] ^= B[6]
52+
A[7] ^= B[7]
53+
A[8] ^= B[8]
54+
A[9] ^= B[9]
55+
A[10] ^= B[10]
56+
A[11] ^= B[11]
57+
A[12] ^= B[12]
58+
A[13] ^= B[13]
59+
A[14] ^= B[14]
60+
A[15] ^= B[15]
61+
62+
x00, x01, x02, x03 := A[0], A[1], A[2], A[3]
63+
x04, x05, x06, x07 := A[4], A[5], A[6], A[7]
64+
x08, x09, x10, x11 := A[8], A[9], A[10], A[11]
65+
x12, x13, x14, x15 := A[12], A[13], A[14], A[15]
66+
67+
for i := 0; i < 4; i++ {
68+
// Columns
69+
x04 ^= rotl(x00+x12, 7)
70+
x09 ^= rotl(x05+x01, 7)
71+
x14 ^= rotl(x10+x06, 7)
72+
x03 ^= rotl(x15+x11, 7)
73+
74+
x08 ^= rotl(x04+x00, 9)
75+
x13 ^= rotl(x09+x05, 9)
76+
x02 ^= rotl(x14+x10, 9)
77+
x07 ^= rotl(x03+x15, 9)
78+
79+
x12 ^= rotl(x08+x04, 13)
80+
x01 ^= rotl(x13+x09, 13)
81+
x06 ^= rotl(x02+x14, 13)
82+
x11 ^= rotl(x07+x03, 13)
83+
84+
x00 ^= rotl(x12+x08, 18)
85+
x05 ^= rotl(x01+x13, 18)
86+
x10 ^= rotl(x06+x02, 18)
87+
x15 ^= rotl(x11+x07, 18)
88+
89+
// Rows
90+
x01 ^= rotl(x00+x03, 7)
91+
x06 ^= rotl(x05+x04, 7)
92+
x11 ^= rotl(x10+x09, 7)
93+
x12 ^= rotl(x15+x14, 7)
94+
95+
x02 ^= rotl(x01+x00, 9)
96+
x07 ^= rotl(x06+x05, 9)
97+
x08 ^= rotl(x11+x10, 9)
98+
x13 ^= rotl(x12+x15, 9)
99+
100+
x03 ^= rotl(x02+x01, 13)
101+
x04 ^= rotl(x07+x06, 13)
102+
x09 ^= rotl(x08+x11, 13)
103+
x14 ^= rotl(x13+x12, 13)
104+
105+
x00 ^= rotl(x03+x02, 18)
106+
x05 ^= rotl(x04+x07, 18)
107+
x10 ^= rotl(x09+x08, 18)
108+
x15 ^= rotl(x14+x13, 18)
109+
}
110+
111+
A[0] += x00
112+
A[1] += x01
113+
A[2] += x02
114+
A[3] += x03
115+
A[4] += x04
116+
A[5] += x05
117+
A[6] += x06
118+
A[7] += x07
119+
A[8] += x08
120+
A[9] += x09
121+
A[10] += x10
122+
A[11] += x11
123+
A[12] += x12
124+
A[13] += x13
125+
A[14] += x14
126+
A[15] += x15
127+
}

0 commit comments

Comments
 (0)