/
scrypt.go
52 lines (43 loc) · 1.02 KB
/
scrypt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package scrypt
import (
"crypto/rand"
"golang.org/x/crypto/scrypt"
)
type Scrypt struct {
SaltLen int `json:"saltlen,omitempty" toml:"saltlen"`
N int `json:"n,omitempty" toml:"n"`
R int `json:"r,omitempty" toml:"r"`
P int `json:"p,omitempty" toml:"p"`
}
const (
defaultSaltLen = 16
defaultN = 131072 // 2^17
defaultR = 8
defaultP = 1
)
func New() *Scrypt {
return &Scrypt{
SaltLen: defaultSaltLen,
N: defaultN,
R: defaultR,
P: defaultP,
}
}
func (s *Scrypt) DeriveKeyWithSalt(password, salt []byte, keyLen int) ([]byte, error) {
key, err := scrypt.Key(password, salt, s.N, s.R, s.P, keyLen)
if err != nil {
return nil, err
}
return key, nil
}
func (s *Scrypt) DeriveKey(password []byte, keyLen int) ([]byte, []byte, error) {
salt := make([]byte, s.SaltLen)
if _, err := rand.Read(salt); err != nil {
return nil, nil, err
}
key, err := s.DeriveKeyWithSalt(password, salt, keyLen)
if err != nil {
return nil, nil, err
}
return key, salt, nil
}