diff options
Diffstat (limited to 'whisper/envelope.go')
| -rw-r--r-- | whisper/envelope.go | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/whisper/envelope.go b/whisper/envelope.go index 683e88128..d30397c98 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -1,14 +1,13 @@ package whisper import ( - "bytes" "crypto/ecdsa" "encoding/binary" "fmt" - "io" "time" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/rlp" ) @@ -27,22 +26,6 @@ type Envelope struct { hash Hash } -func NewEnvelopeFromReader(reader io.Reader) (*Envelope, error) { - var envelope Envelope - - buf := new(bytes.Buffer) - buf.ReadFrom(reader) - - h := H(crypto.Sha3(buf.Bytes())) - if err := rlp.Decode(buf, &envelope); err != nil { - return nil, err - } - - envelope.hash = h - - return &envelope, nil -} - func (self *Envelope) Hash() Hash { if self.hash == EmptyHash { self.hash = H(crypto.Sha3(ethutil.Encode(self))) @@ -73,10 +56,16 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { message.Flags = data[0] message.Signature = data[1:66] } - message.Payload = data[dataStart:] + + payload := data[dataStart:] if prv != nil { - message.Payload, err = crypto.Decrypt(prv, message.Payload) - if err != nil { + message.Payload, err = crypto.Decrypt(prv, payload) + switch err { + case nil: // OK + case ecies.ErrInvalidPublicKey: // Payload isn't encrypted + message.Payload = payload + return &message, err + default: return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) } } @@ -119,3 +108,27 @@ func (self *Envelope) withoutNonce() interface{} { func (self *Envelope) RlpData() interface{} { return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data, self.Nonce} } + +func (self *Envelope) DecodeRLP(s *rlp.Stream) error { + var extenv struct { + Expiry uint32 + Ttl uint32 + Topics [][]byte + Data []byte + Nonce uint32 + } + if err := s.Decode(&extenv); err != nil { + return err + } + + self.Expiry = extenv.Expiry + self.Ttl = extenv.Ttl + self.Topics = extenv.Topics + self.Data = extenv.Data + self.Nonce = extenv.Nonce + + // TODO We should use the stream directly here. + self.hash = H(crypto.Sha3(ethutil.Encode(self))) + + return nil +} |
