whisper: fixed math/rand.Read() issue

This commit is contained in:
Vlad 2016-10-19 12:51:44 +02:00
parent e9d3ff3760
commit 641114ba28
4 changed files with 34 additions and 38 deletions

View file

@ -96,7 +96,7 @@ func (fs *Filters) NotifyWatchers(env *Envelope, messageCode uint64) {
}
fs.mutex.RUnlock() // we need to unlock before calling addDecryptedMessage
if msg != nil {
if msg != nil && fs.whisper != nil {
fs.whisper.addDecryptedMessage(msg)
}
}

View file

@ -16,25 +16,17 @@
package whisperv5
/*
import "testing"
var topicXxxxxxxxxxxTests = []struct {
topic TopicType
str string
}{
{topic: TopicType{0x00, 0x00, 0x00, 0x00}, str: "0x00000000"},
{topic: TopicType{0x00, 0x7f, 0x80, 0xff}, str: "0x007f80ff"},
{topic: TopicType{0xff, 0x80, 0x7f, 0x00}, str: "0xff807f00"},
{topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, str: "0xf26e7779"},
}
func TestXxxxxxxxxxxx(x *testing.T) {
for i, tst := range topicStringTests {
s := tst.topic.String()
if s != tst.str {
x.Errorf("failed test %d: have %s, want %s.", i, s, tst.str)
}
func TestFilters(x *testing.T) {
filters := NewFilters(nil)
f := Filter{}
filters.Install(f)
i := filters.Install(f)
if i == 0 {
x.Errorf("failed install")
return
}
// todo: test Install, Uninstall, Get
}
*/

View file

@ -130,7 +130,7 @@ func (msg *SentMessage) appendPadding(params *MessageParams) {
panic("please fix the padding algorithm before releasing new version")
}
buf := make([]byte, padSize)
mrand.Read(buf[1:])
randomize(buf[1:]) // change to: err = mrand.Read(buf[1:])
buf[0] = byte(padSize)
if params.Padding != nil {
copy(buf[1:], params.Padding)
@ -360,3 +360,19 @@ func (msg *ReceivedMessage) hash() []byte {
}
return crypto.Keccak256(msg.Raw)
}
// rand.Rand provides a Read method in Go 1.7 and later,
// but we can't use it yet.
func randomize(b []byte) {
cnt := 0
val := mrand.Int63()
for n := 0; n < len(b); n++ {
b[n] = byte(val)
val >>= 8
cnt++
if cnt >= 7 {
cnt = 0
val = mrand.Int63()
}
}
}

View file

@ -30,16 +30,13 @@ func copyFromBuf(dst []byte, src []byte, beg int) int {
return beg + len(dst)
}
func generateMessageParams() (*MessageParams, error) {
func generateMessageParams() (*MessageParams, err error) {
buf := make([]byte, 1024)
_, err := rand.Read(buf)
if err != nil {
return nil, err
}
randomize(buf)
sz := rand.Intn(400)
var p MessageParams
p.TTL = uint32(rand.Intn(1024))
sz := rand.Intn(400)
p.Payload = make([]byte, sz)
p.Padding = make([]byte, padSizeLimitUpper)
p.KeySym = make([]byte, aesKeyLength)
@ -49,7 +46,6 @@ func generateMessageParams() (*MessageParams, error) {
b = copyFromBuf(p.Padding, buf, b)
b = copyFromBuf(p.KeySym, buf, b)
p.Topic = BytesToTopic(buf[b:])
p.Src, err = crypto.GenerateKey()
if err != nil {
return nil, err
@ -184,16 +180,8 @@ func TestMessageSeal(x *testing.T) {
params.TTL = 1
aesnonce := make([]byte, 12)
salt := make([]byte, 12)
_, err = rand.Read(aesnonce)
if err != nil {
x.Errorf("failed generate aesnonce with seed %d: %s.", seed, err)
return
}
_, err = rand.Read(salt)
if err != nil {
x.Errorf("failed generate salt with seed %d: %s.", seed, err)
return
}
randomize(aesnonce)
randomize(salt)
env := NewEnvelope(params.TTL, params.Topic, salt, aesnonce, msg)
if err != nil {
@ -219,7 +207,7 @@ func TestMessageSeal(x *testing.T) {
env.Seal(params)
env.calculatePoW(0)
pow = env.PoW()
if pow < 1000 {
if pow < 2*target {
// this depends on deterministic choice of seed (1976726903)
x.Errorf("failed Wrap with seed %d: pow too small %f.", seed, pow)
return