You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
62 lines
1.4 KiB
package pkcs8 |
|
|
|
import ( |
|
"encoding/asn1" |
|
|
|
"golang.org/x/crypto/scrypt" |
|
) |
|
|
|
var ( |
|
oidScrypt = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 11591, 4, 11} |
|
) |
|
|
|
func init() { |
|
RegisterKDF(oidScrypt, func() KDFParameters { |
|
return new(scryptParams) |
|
}) |
|
} |
|
|
|
type scryptParams struct { |
|
Salt []byte |
|
CostParameter int |
|
BlockSize int |
|
ParallelizationParameter int |
|
} |
|
|
|
func (p scryptParams) DeriveKey(password []byte, size int) (key []byte, err error) { |
|
return scrypt.Key(password, p.Salt, p.CostParameter, p.BlockSize, |
|
p.ParallelizationParameter, size) |
|
} |
|
|
|
// ScryptOpts contains options for the scrypt key derivation function. |
|
type ScryptOpts struct { |
|
SaltSize int |
|
CostParameter int |
|
BlockSize int |
|
ParallelizationParameter int |
|
} |
|
|
|
func (p ScryptOpts) DeriveKey(password, salt []byte, size int) ( |
|
key []byte, params KDFParameters, err error) { |
|
|
|
key, err = scrypt.Key(password, salt, p.CostParameter, p.BlockSize, |
|
p.ParallelizationParameter, size) |
|
if err != nil { |
|
return nil, nil, err |
|
} |
|
params = scryptParams{ |
|
BlockSize: p.BlockSize, |
|
CostParameter: p.CostParameter, |
|
ParallelizationParameter: p.ParallelizationParameter, |
|
Salt: salt, |
|
} |
|
return key, params, nil |
|
} |
|
|
|
func (p ScryptOpts) GetSaltSize() int { |
|
return p.SaltSize |
|
} |
|
|
|
func (p ScryptOpts) OID() asn1.ObjectIdentifier { |
|
return oidScrypt |
|
}
|
|
|