whisper: encryption updated

This commit is contained in:
Vlad 2016-10-27 13:47:14 +02:00
parent 827a835427
commit d1fd4ec042

View file

@ -177,21 +177,30 @@ func (w *Whisper) GetIdentity(pubKey string) *ecdsa.PrivateKey {
} }
func (w *Whisper) GenerateSymKey(name string) error { func (w *Whisper) GenerateSymKey(name string) error {
if w.HasSymKey(name) { buf := make([]byte, aesKeyLength*2)
return fmt.Errorf("Key with name [%s] already exists", name) _, err := crand.Read(buf) // todo: check how safe is this function
}
key := make([]byte, aesKeyLength)
_, err := crand.Read(key) // todo: check how safe is this function
if err != nil { if err != nil {
return err return err
} else if !validateSymmetricKey(key) { } else if !validateSymmetricKey(buf) {
return fmt.Errorf("crypto/rand failed to generate valid key") return fmt.Errorf("crypto/rand failed to generate random data")
}
key := buf[:aesKeyLength]
salt := buf[aesKeyLength:]
derived, err := DeriveOneTimeKey(key, salt, EnvelopeVersion)
if err != nil {
return err
} else if !validateSymmetricKey(derived) {
return fmt.Errorf("failed to derive valid key")
} }
w.keyMu.Lock() w.keyMu.Lock()
defer w.keyMu.Unlock() defer w.keyMu.Unlock()
w.symKeys[name] = key
if w.symKeys[name] != nil {
return fmt.Errorf("Key with name [%s] already exists", name)
}
w.symKeys[name] = derived
return nil return nil
} }
@ -561,7 +570,8 @@ func BytesToIntBigEndian(b []byte) (res uint64) {
// pbkdf2 is used for security, in case people use password instead of randomly generated keys. // pbkdf2 is used for security, in case people use password instead of randomly generated keys.
func deriveKeyMaterial(key []byte, version uint64) (derivedKey []byte, err error) { func deriveKeyMaterial(key []byte, version uint64) (derivedKey []byte, err error) {
if version == 0 { if version == 0 {
// todo: review: kdf should run no less than 1 sec, because it's a once in a session experience // kdf should run no less than 0.1 seconds on average compute,
// because it's a once in a session experience
derivedKey := pbkdf2.Key(key, nil, 65356, aesKeyLength, sha256.New) derivedKey := pbkdf2.Key(key, nil, 65356, aesKeyLength, sha256.New)
return derivedKey, nil return derivedKey, nil
} else { } else {