whisper: fix payload loss in case of plaintext decrypt
This commit is contained in:
parent
7f48eb8737
commit
87447f9f3f
|
@ -4,6 +4,9 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto/ecies"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestEnvelopeOpen(t *testing.T) {
|
func TestEnvelopeOpen(t *testing.T) {
|
||||||
|
@ -16,7 +19,7 @@ func TestEnvelopeOpen(t *testing.T) {
|
||||||
}
|
}
|
||||||
opened, err := envelope.Open(nil)
|
opened, err := envelope.Open(nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to open envelope: %v.", err)
|
t.Fatalf("failed to open envelope: %v", err)
|
||||||
}
|
}
|
||||||
if opened.Flags != message.Flags {
|
if opened.Flags != message.Flags {
|
||||||
t.Fatalf("flags mismatch: have %d, want %d", opened.Flags, message.Flags)
|
t.Fatalf("flags mismatch: have %d, want %d", opened.Flags, message.Flags)
|
||||||
|
@ -38,3 +41,102 @@ func TestEnvelopeOpen(t *testing.T) {
|
||||||
t.Fatalf("message hash mismatch: have 0x%x, want 0x%x", opened.Hash, envelope.Hash())
|
t.Fatalf("message hash mismatch: have 0x%x, want 0x%x", opened.Hash, envelope.Hash())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnvelopeAnonymousOpenUntargeted(t *testing.T) {
|
||||||
|
payload := []byte("hello envelope")
|
||||||
|
envelope, err := NewMessage(payload).Wrap(DefaultPoW, Options{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to wrap message: %v", err)
|
||||||
|
}
|
||||||
|
opened, err := envelope.Open(nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to open envelope: %v", err)
|
||||||
|
}
|
||||||
|
if opened.To != nil {
|
||||||
|
t.Fatalf("recipient mismatch: have 0x%x, want nil", opened.To)
|
||||||
|
}
|
||||||
|
if bytes.Compare(opened.Payload, payload) != 0 {
|
||||||
|
t.Fatalf("payload mismatch: have 0x%x, want 0x%x", opened.Payload, payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEnvelopeAnonymousOpenTargeted(t *testing.T) {
|
||||||
|
key, err := crypto.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to generate test identity: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := []byte("hello envelope")
|
||||||
|
envelope, err := NewMessage(payload).Wrap(DefaultPoW, Options{
|
||||||
|
To: &key.PublicKey,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to wrap message: %v", err)
|
||||||
|
}
|
||||||
|
opened, err := envelope.Open(nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to open envelope: %v", err)
|
||||||
|
}
|
||||||
|
if opened.To != nil {
|
||||||
|
t.Fatalf("recipient mismatch: have 0x%x, want nil", opened.To)
|
||||||
|
}
|
||||||
|
if bytes.Compare(opened.Payload, payload) == 0 {
|
||||||
|
t.Fatalf("payload match, should have been encrypted: 0x%x", opened.Payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEnvelopeIdentifiedOpenUntargeted(t *testing.T) {
|
||||||
|
key, err := crypto.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to generate test identity: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := []byte("hello envelope")
|
||||||
|
envelope, err := NewMessage(payload).Wrap(DefaultPoW, Options{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to wrap message: %v", err)
|
||||||
|
}
|
||||||
|
opened, err := envelope.Open(key)
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
t.Fatalf("envelope opened with bad key: %v", opened)
|
||||||
|
|
||||||
|
case ecies.ErrInvalidPublicKey:
|
||||||
|
// Ok, key mismatch but opened
|
||||||
|
|
||||||
|
default:
|
||||||
|
t.Fatalf("failed to open envelope: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if opened.To != nil {
|
||||||
|
t.Fatalf("recipient mismatch: have 0x%x, want nil", opened.To)
|
||||||
|
}
|
||||||
|
if bytes.Compare(opened.Payload, payload) != 0 {
|
||||||
|
t.Fatalf("payload mismatch: have 0x%x, want 0x%x", opened.Payload, payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEnvelopeIdentifiedOpenTargeted(t *testing.T) {
|
||||||
|
key, err := crypto.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to generate test identity: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := []byte("hello envelope")
|
||||||
|
envelope, err := NewMessage(payload).Wrap(DefaultPoW, Options{
|
||||||
|
To: &key.PublicKey,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to wrap message: %v", err)
|
||||||
|
}
|
||||||
|
opened, err := envelope.Open(key)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to open envelope: %v", err)
|
||||||
|
}
|
||||||
|
if opened.To != nil {
|
||||||
|
t.Fatalf("recipient mismatch: have 0x%x, want nil", opened.To)
|
||||||
|
}
|
||||||
|
if bytes.Compare(opened.Payload, payload) != 0 {
|
||||||
|
t.Fatalf("payload mismatch: have 0x%x, want 0x%x", opened.Payload, payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -120,9 +120,12 @@ func (self *Message) encrypt(key *ecdsa.PublicKey) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrypt decrypts an encrypted payload with a private key.
|
// decrypt decrypts an encrypted payload with a private key.
|
||||||
func (self *Message) decrypt(key *ecdsa.PrivateKey) (err error) {
|
func (self *Message) decrypt(key *ecdsa.PrivateKey) error {
|
||||||
self.Payload, err = crypto.Decrypt(key, self.Payload)
|
cleartext, err := crypto.Decrypt(key, self.Payload)
|
||||||
return
|
if err == nil {
|
||||||
|
self.Payload = cleartext
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// hash calculates the SHA3 checksum of the message flags and payload.
|
// hash calculates the SHA3 checksum of the message flags and payload.
|
||||||
|
|
Loading…
Reference in New Issue