|
1 | 1 | package scrypt
|
2 | 2 |
|
3 |
| -// void scrypt_aux(unsigned char*); |
4 |
| -import "C" |
5 |
| - |
6 | 3 | import (
|
7 | 4 | "crypto/sha256"
|
| 5 | + "math/bits" |
| 6 | + "unsafe" |
8 | 7 |
|
9 | 8 | "golang.org/x/crypto/pbkdf2"
|
10 | 9 | )
|
11 | 10 |
|
12 | 11 | func Scrypt(x []byte) []byte {
|
13 | 12 | 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]))) |
15 | 14 | return pbkdf2.Key(x, X, 1, 32, sha256.New)
|
16 | 15 | }
|
| 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