diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index 7f6173090a..9b634ecd43 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -493,6 +493,10 @@ func sendMsg(payload []byte) common.Hash { } msg := whisper.NewSentMessage(¶ms) + if msg == nil { + fmt.Printf("failed to create new message (OS level error)") + os.Exit(0) + } envelope, err := msg.Wrap(¶ms) if err != nil { fmt.Printf("failed to seal message: %v \n", err) @@ -622,6 +626,10 @@ func requestExpiredMessagesLoop() { params.WorkTime = 5 msg := whisper.NewSentMessage(¶ms) + if msg == nil { + fmt.Printf("failed to create new message (OS level error)") + os.Exit(0) + } env, err := msg.Wrap(¶ms) if err != nil { utils.Fatalf("Wrap failed: %s", err) diff --git a/whisper/whisperv5/api.go b/whisper/whisperv5/api.go index 6bc065b192..4d96507a8e 100644 --- a/whisper/whisperv5/api.go +++ b/whisper/whisperv5/api.go @@ -402,6 +402,11 @@ func (api *PublicWhisperAPI) Post(args PostArgs) error { // encrypt and send message := NewSentMessage(¶ms) + if message == nil { + info := "Post: failed create new message, probably due to failed rand function (OS level)" + log.Error(info) + return errors.New(info) + } envelope, err := message.Wrap(¶ms) if err != nil { log.Error(err.Error()) diff --git a/whisper/whisperv5/filter_test.go b/whisper/whisperv5/filter_test.go index 36cc887e3e..09a4961498 100644 --- a/whisper/whisperv5/filter_test.go +++ b/whisper/whisperv5/filter_test.go @@ -194,15 +194,9 @@ func TestMatchEnvelope(t *testing.T) { } // encrypt symmetrically -<<<<<<< d4e2ecd2e1164b6a5106b20d135742a35656838f i := mrand.Int() % 4 - fsym.Topics[i] = params.Topic - fasym.Topics[i] = params.Topic -======= - i := rand.Int() % 4 fsym.Topics[i] = params.Topic[:] fasym.Topics[i] = params.Topic[:] ->>>>>>> whisper: variable topic size allowed for a filter msg = NewSentMessage(params) env, err = msg.Wrap(params) if err != nil { diff --git a/whisper/whisperv5/message.go b/whisper/whisperv5/message.go index 6896681bcf..fa7d59d81e 100644 --- a/whisper/whisperv5/message.go +++ b/whisper/whisperv5/message.go @@ -102,14 +102,18 @@ func NewSentMessage(params *MessageParams) *SentMessage { msg := SentMessage{} msg.Raw = make([]byte, 1, len(params.Payload)+len(params.Payload)+signatureLength+padSizeLimitUpper) msg.Raw[0] = 0 // set all the flags to zero - msg.appendPadding(params) + err := msg.appendPadding(params) + if err != nil { + log.Error(fmt.Sprintf("NewSentMessage: %s", err)) + return nil + } msg.Raw = append(msg.Raw, params.Payload...) return &msg } // appendPadding appends the pseudorandom padding bytes and sets the padding flag. // The last byte contains the size of padding (thus, its size must not exceed 256). -func (msg *SentMessage) appendPadding(params *MessageParams) { +func (msg *SentMessage) appendPadding(params *MessageParams) error { total := len(params.Payload) + 1 if params.Src != nil { total += signatureLength @@ -128,7 +132,10 @@ func (msg *SentMessage) appendPadding(params *MessageParams) { panic("please fix the padding algorithm before releasing new version") } buf := make([]byte, padSize) - mrand.Read(buf[1:]) + _, err := mrand.Read(buf[1:]) + if err != nil { + return err + } buf[0] = byte(padSize) if params.Padding != nil { copy(buf[1:], params.Padding) @@ -136,6 +143,7 @@ func (msg *SentMessage) appendPadding(params *MessageParams) { msg.Raw = append(msg.Raw, buf...) msg.Raw[0] |= byte(0x1) // number of bytes indicating the padding size } + return nil } // sign calculates and sets the cryptographic signature for the message, diff --git a/whisper/whisperv5/whisper_test.go b/whisper/whisperv5/whisper_test.go index fba843b554..ab072d7b43 100644 --- a/whisper/whisperv5/whisper_test.go +++ b/whisper/whisperv5/whisper_test.go @@ -391,7 +391,7 @@ func TestWhisperSymKeyManagement(t *testing.T) { } randomKey = make([]byte, aesKeyLength+1) - randomize(randomKey) + mrand.Read(randomKey) id1, err = w.AddSymKeyDirect(randomKey) if err == nil { t.Fatalf("added the key with wrong size, seed %d.", seed)