diff --git a/whisper/whisperv5/message.go b/whisper/whisperv5/message.go index 680d1f8a22..f3812b1d8a 100644 --- a/whisper/whisperv5/message.go +++ b/whisper/whisperv5/message.go @@ -130,7 +130,7 @@ func (msg *SentMessage) appendPadding(params *MessageParams) { panic("please fix the padding algorithm before releasing new version") } buf := make([]byte, padSize) - randomize(buf[1:]) // change to: err = mrand.Read(buf[1:]) + randomize(buf[1:]) buf[0] = byte(padSize) if params.Padding != nil { copy(buf[1:], params.Padding) @@ -208,7 +208,10 @@ func (msg *SentMessage) encryptSymmetric(key []byte) (salt []byte, nonce []byte, _, err = crand.Read(nonce) if err != nil { return nil, nil, err + } else if !validateSymmetricKey(nonce) { + return nil, nil, errors.New("crypto/rand failed to generate nonce") } + msg.Raw = aesgcm.Seal(nil, nonce, msg.Raw, nil) return salt, nonce, nil } diff --git a/whisper/whisperv5/whisper.go b/whisper/whisperv5/whisper.go index 049079ba8a..3402c7bf66 100644 --- a/whisper/whisperv5/whisper.go +++ b/whisper/whisperv5/whisper.go @@ -22,6 +22,7 @@ import ( crand "crypto/rand" "crypto/sha256" "fmt" + mrand "math/rand" "sync" "time" @@ -82,6 +83,9 @@ func NewWhisper(server MailServer) *Whisper { Run: whisper.HandlePeer, } + seed := time.Now().Unix() + mrand.Seed(seed) + return whisper } @@ -177,12 +181,23 @@ func (w *Whisper) GetIdentity(pubKey string) *ecdsa.PrivateKey { } func (w *Whisper) GenerateSymKey(name string) error { - buf := make([]byte, aesKeyLength*2) - _, err := crand.Read(buf) // todo: check how safe is this function + const size = aesKeyLength * 2 + buf := make([]byte, size) + buf2 := make([]byte, size) + _, err := crand.Read(buf) if err != nil { return err } else if !validateSymmetricKey(buf) { - return fmt.Errorf("crypto/rand failed to generate random data") + return fmt.Errorf("error in GenerateSymKey: crypto/rand failed to generate random data") + } + + randomize(buf2) + if !validateSymmetricKey(buf2) { + return fmt.Errorf("error in GenerateSymKey: math/rand failed to generate random data") + } + + for i := 0; i < size; i++ { + buf[i] ^= buf2[i] } key := buf[:aesKeyLength]