mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
whisper: added TestEnvelopeOpen and bugfix
This commit is contained in:
parent
99b9dcb2f1
commit
e9d3ff3760
4 changed files with 107 additions and 17 deletions
|
|
@ -156,7 +156,6 @@ func (api *PublicWhisperAPI) NewFilter(args WhisperFilterArgs) (*rpc.HexNumber,
|
||||||
|
|
||||||
filter := whisperv5.Filter{
|
filter := whisperv5.Filter{
|
||||||
Src: crypto.ToECDSAPub(args.From),
|
Src: crypto.ToECDSAPub(args.From),
|
||||||
Dst: crypto.ToECDSAPub(args.To),
|
|
||||||
KeySym: api.whisper.GetSymKey(args.KeyName),
|
KeySym: api.whisper.GetSymKey(args.KeyName),
|
||||||
PoW: args.PoW,
|
PoW: args.PoW,
|
||||||
Messages: make(map[common.Hash]*whisperv5.ReceivedMessage),
|
Messages: make(map[common.Hash]*whisperv5.ReceivedMessage),
|
||||||
|
|
@ -196,12 +195,13 @@ func (api *PublicWhisperAPI) NewFilter(args WhisperFilterArgs) (*rpc.HexNumber,
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(args.To) > 0 {
|
if len(args.To) > 0 {
|
||||||
if !whisperv5.ValidatePublicKey(filter.Dst) {
|
dst := crypto.ToECDSAPub(args.To)
|
||||||
|
if !whisperv5.ValidatePublicKey(dst) {
|
||||||
info := "NewFilter: Invalid 'To' address"
|
info := "NewFilter: Invalid 'To' address"
|
||||||
glog.V(logger.Error).Infof(info)
|
glog.V(logger.Error).Infof(info)
|
||||||
return nil, errors.New(info)
|
return nil, errors.New(info)
|
||||||
}
|
}
|
||||||
filter.KeyAsym = api.whisper.GetIdentity(filter.Dst)
|
filter.KeyAsym = api.whisper.GetIdentity(dst)
|
||||||
if filter.KeyAsym == nil {
|
if filter.KeyAsym == nil {
|
||||||
info := "NewFilter: non-existent identity provided"
|
info := "NewFilter: non-existent identity provided"
|
||||||
glog.V(logger.Error).Infof(info)
|
glog.V(logger.Error).Infof(info)
|
||||||
|
|
@ -295,9 +295,6 @@ func (api *PublicWhisperAPI) Post(args PostArgs) error {
|
||||||
if params.KeySym == nil && filter.KeySym != nil {
|
if params.KeySym == nil && filter.KeySym != nil {
|
||||||
params.KeySym = filter.KeySym
|
params.KeySym = filter.KeySym
|
||||||
}
|
}
|
||||||
if params.Dst == nil && filter.Dst != nil {
|
|
||||||
params.Dst = filter.Dst
|
|
||||||
}
|
|
||||||
if params.Src == nil && filter.Src != nil {
|
if params.Src == nil && filter.Src != nil {
|
||||||
params.Src = filter.KeyAsym
|
params.Src = filter.KeyAsym
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -207,7 +207,7 @@ func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
|
||||||
if e.isAsymmetric() {
|
if e.isAsymmetric() {
|
||||||
msg, _ = e.OpenAsymmetric(watcher.KeyAsym)
|
msg, _ = e.OpenAsymmetric(watcher.KeyAsym)
|
||||||
if msg != nil {
|
if msg != nil {
|
||||||
msg.Dst = watcher.Dst
|
msg.Dst = &watcher.KeyAsym.PublicKey
|
||||||
}
|
}
|
||||||
} else if e.IsSymmetric() {
|
} else if e.IsSymmetric() {
|
||||||
msg, _ = e.OpenSymmetric(watcher.KeySym)
|
msg, _ = e.OpenSymmetric(watcher.KeySym)
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ import (
|
||||||
|
|
||||||
type Filter struct {
|
type Filter struct {
|
||||||
Src *ecdsa.PublicKey // Sender of the message
|
Src *ecdsa.PublicKey // Sender of the message
|
||||||
Dst *ecdsa.PublicKey // Recipient of the message
|
|
||||||
KeyAsym *ecdsa.PrivateKey // Private Key of recipient
|
KeyAsym *ecdsa.PrivateKey // Private Key of recipient
|
||||||
KeySym []byte // Key associated with the Topic
|
KeySym []byte // Key associated with the Topic
|
||||||
Topics []TopicType // Topics to filter messages with
|
Topics []TopicType // Topics to filter messages with
|
||||||
|
|
@ -142,7 +141,7 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
|
||||||
|
|
||||||
if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() {
|
if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() {
|
||||||
// if Dst match, ignore the topic
|
// if Dst match, ignore the topic
|
||||||
return isPubKeyEqual(f.Dst, msg.Dst)
|
return isPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst)
|
||||||
} else if f.expectsSymmetricEncryption() && msg.isSymmetricEncryption() {
|
} else if f.expectsSymmetricEncryption() && msg.isSymmetricEncryption() {
|
||||||
// check if that both the key and the topic match
|
// check if that both the key and the topic match
|
||||||
if f.SymKeyHash == msg.SymKeyHash {
|
if f.SymKeyHash == msg.SymKeyHash {
|
||||||
|
|
|
||||||
|
|
@ -30,16 +30,14 @@ func copyFromBuf(dst []byte, src []byte, beg int) int {
|
||||||
return beg + len(dst)
|
return beg + len(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateMessageParams(seed int64) (*MessageParams, error) {
|
func generateMessageParams() (*MessageParams, error) {
|
||||||
var err error
|
|
||||||
var p MessageParams
|
|
||||||
|
|
||||||
buf := make([]byte, 1024)
|
buf := make([]byte, 1024)
|
||||||
_, err = rand.Read(buf)
|
_, err := rand.Read(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var p MessageParams
|
||||||
p.TTL = uint32(rand.Intn(1024))
|
p.TTL = uint32(rand.Intn(1024))
|
||||||
sz := rand.Intn(400)
|
sz := rand.Intn(400)
|
||||||
p.Payload = make([]byte, sz)
|
p.Payload = make([]byte, sz)
|
||||||
|
|
@ -62,7 +60,7 @@ func generateMessageParams(seed int64) (*MessageParams, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func singleMessageTest(x *testing.T, seed int64, symmetric bool) {
|
func singleMessageTest(x *testing.T, seed int64, symmetric bool) {
|
||||||
params, err := generateMessageParams(seed)
|
params, err := generateMessageParams()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
return
|
return
|
||||||
|
|
@ -149,7 +147,7 @@ func TestMessageWrap(x *testing.T) {
|
||||||
rand.Seed(seed)
|
rand.Seed(seed)
|
||||||
target := 128.0
|
target := 128.0
|
||||||
|
|
||||||
params, err := generateMessageParams(seed)
|
params, err := generateMessageParams()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
return
|
return
|
||||||
|
|
@ -176,7 +174,7 @@ func TestMessageSeal(x *testing.T) {
|
||||||
seed := int64(1976726903)
|
seed := int64(1976726903)
|
||||||
rand.Seed(seed)
|
rand.Seed(seed)
|
||||||
|
|
||||||
params, err := generateMessageParams(seed)
|
params, err := generateMessageParams()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
return
|
return
|
||||||
|
|
@ -227,3 +225,99 @@ func TestMessageSeal(x *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnvelopeOpen(x *testing.T) {
|
||||||
|
seed := time.Now().Unix()
|
||||||
|
rand.Seed(seed)
|
||||||
|
var symmetric bool
|
||||||
|
|
||||||
|
for i := 0; i < 256; i++ {
|
||||||
|
singleEnvelopeOpenTest(x, seed, symmetric)
|
||||||
|
symmetric = !symmetric
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func singleEnvelopeOpenTest(x *testing.T, seed int64, symmetric bool) {
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
x.Errorf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
key, err := crypto.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
x.Errorf("failed GenerateKey with seed %d: %s.", seed, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !symmetric {
|
||||||
|
params.KeySym = nil
|
||||||
|
params.Dst = &key.PublicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
text := make([]byte, 0, 512)
|
||||||
|
steg := make([]byte, 0, 512)
|
||||||
|
raw := make([]byte, 0, 1024)
|
||||||
|
text = append(text, params.Payload...)
|
||||||
|
steg = append(steg, params.Padding...)
|
||||||
|
raw = append(raw, params.Padding...)
|
||||||
|
|
||||||
|
msg := NewSentMessage(params)
|
||||||
|
env, err := msg.Wrap(params)
|
||||||
|
if err != nil {
|
||||||
|
x.Errorf("failed Wrap with seed %d: %s.", seed, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f := Filter{KeyAsym: key, KeySym: params.KeySym}
|
||||||
|
decrypted := env.Open(&f)
|
||||||
|
if decrypted == nil {
|
||||||
|
x.Errorf("failed to open with seed %d.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !decrypted.Validate() {
|
||||||
|
x.Errorf("failed to validate with seed %d.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
padsz := len(decrypted.Padding)
|
||||||
|
if bytes.Compare(steg[:padsz], decrypted.Padding) != 0 {
|
||||||
|
x.Errorf("failed with seed %d: compare padding.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if bytes.Compare(text, decrypted.Payload) != 0 {
|
||||||
|
x.Errorf("failed with seed %d: compare payload.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !isMessageSigned(decrypted.Raw[0]) {
|
||||||
|
x.Errorf("failed with seed %d: unsigned.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(decrypted.Signature) != signatureLength {
|
||||||
|
x.Errorf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !isPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) {
|
||||||
|
x.Errorf("failed with seed %d: signature mismatch.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if decrypted.isAsymmetricEncryption() == symmetric {
|
||||||
|
x.Errorf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if decrypted.isSymmetricEncryption() != symmetric {
|
||||||
|
x.Errorf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !symmetric {
|
||||||
|
if decrypted.Dst == nil {
|
||||||
|
x.Errorf("failed with seed %d: dst is nil.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !isPubKeyEqual(decrypted.Dst, &key.PublicKey) {
|
||||||
|
x.Errorf("failed with seed %d: Dst.", seed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue