aboutsummaryrefslogtreecommitdiff
path: root/key
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-17 23:55:23 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-17 23:55:23 +0200
commitcd6f888802f217ca0cd0509a999696f6c4235c20 (patch)
tree3273a2b84af193e7024c3e721e6a58204dcb3460 /key
parent450a6898f5062d461d5c0932182e3140c6f16d9e (diff)
Refactor ask
Diffstat (limited to 'key')
-rw-r--r--key/key.go72
1 files changed, 60 insertions, 12 deletions
diff --git a/key/key.go b/key/key.go
index 54e4615..cb1e2b7 100644
--- a/key/key.go
+++ b/key/key.go
@@ -108,24 +108,72 @@ func Marshal(v interface{}) ([]byte, error) {
return buf.Bytes(), nil
}
-func NewKey() (*Pub, *Enc, error) {
- pub, sec, err := ed25519.GenerateKey(rand.Reader)
+func ParseSig(data []byte) (*Sig, error) {
+ var sig *Sig
+ if err := Unmarshal(data, sig); err != nil {
+ return nil, err
+ }
+ return sig, sig.Check()
+}
+
+func ParsePub(data []byte) (*Pub, error) {
+ var pub *Pub
+ if err := Unmarshal(data, pub); err != nil {
+ return nil, err
+ }
+ return pub, pub.Check()
+}
+
+func ParseEnc(data []byte, d KeyDeriver) (*Enc, error) {
+ var enc *Enc
+ if err := Unmarshal(data, enc); err != nil {
+ return nil, err
+ }
+ if d != nil && enc.KDFRounds > 0 {
+ xor, err := d.DeriveKey(enc.Salt[:], int(enc.KDFRounds), len(enc.Key))
+ if err != nil {
+ return nil, err
+ }
+ for i := range xor {
+ enc.Key[i] ^= xor[i]
+ }
+ }
+ return enc, enc.Check()
+}
+
+func NewKey(d KeyDeriver) (*Pub, *Enc, error) {
+ pubKey, encKey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
return nil, nil, err
}
- pubKey := &Pub{PKAlg: pkAlg}
- encKey := &Enc{PKAlg: pkAlg, KDFAlg: kdfAlg, KDFRounds: DefaultRounds}
+ pub := &Pub{PKAlg: pkAlg}
+ enc := &Enc{PKAlg: pkAlg, KDFAlg: kdfAlg}
- copy(pubKey.Key[:], pub)
- copy(encKey.Key[:], sec)
+ copy(pub.Key[:], pubKey)
+ copy(enc.Key[:], encKey)
- checkSum := sha512.Sum512(sec)
- copy(encKey.Checksum[:], checkSum[:len(encKey.Checksum)])
+ checkSum := sha512.Sum512(encKey)
+ copy(enc.Checksum[:], checkSum[:len(enc.Checksum)])
- rand.Read(encKey.Salt[:])
- rand.Read(encKey.KeyNum[:])
- pubKey.KeyNum = encKey.KeyNum
+ rand.Read(enc.Salt[:])
+ rand.Read(enc.KeyNum[:])
+ pub.KeyNum = enc.KeyNum
+
+ if d != nil {
+ xor, err := d.DeriveKey(enc.Salt[:], DefaultRounds, len(enc.Key))
+ if err != nil {
+ return nil, nil, err
+ }
+ for i := range xor {
+ enc.Key[i] ^= xor[i]
+ }
+ enc.KDFRounds = DefaultRounds
+ }
+
+ return pub, enc, nil
+}
- return pubKey, encKey, nil
+type KeyDeriver interface {
+ DeriveKey(salt []byte, rounds int, length int) ([]byte, error)
}