From cd6f888802f217ca0cd0509a999696f6c4235c20 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 17 Jul 2017 23:55:23 +0200 Subject: Refactor ask --- key/key.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 12 deletions(-) (limited to 'key/key.go') 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) } -- cgit v1.2.3