mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
whisper: encryption updated
This commit is contained in:
parent
827a835427
commit
d1fd4ec042
1 changed files with 20 additions and 10 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue