whisper: mostly golint comments, few remain

This commit is contained in:
Kiel barry 2018-06-04 18:23:00 -07:00
parent 580b598525
commit af53954fcd
16 changed files with 60 additions and 21 deletions

View file

@ -29,6 +29,8 @@ import (
"github.com/syndtr/goleveldb/leveldb/util" "github.com/syndtr/goleveldb/leveldb/util"
) )
// WMailServer stores the leveldb instance containing an archive of messages
// as well as the whisper instance.
type WMailServer struct { type WMailServer struct {
db *leveldb.DB db *leveldb.DB
w *whisper.Whisper w *whisper.Whisper
@ -42,6 +44,7 @@ type DBKey struct {
raw []byte raw []byte
} }
// NewDbKey creates a new DBKey with a new raw hash based on the current time.
func NewDbKey(t uint32, h common.Hash) *DBKey { func NewDbKey(t uint32, h common.Hash) *DBKey {
const sz = common.HashLength + 4 const sz = common.HashLength + 4
var k DBKey var k DBKey
@ -53,6 +56,7 @@ func NewDbKey(t uint32, h common.Hash) *DBKey {
return &k return &k
} }
// Init assigns initial values for the WMailServer.
func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, pow float64) error { func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, pow float64) error {
var err error var err error
if len(path) == 0 { if len(path) == 0 {
@ -82,12 +86,14 @@ func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, p
return nil return nil
} }
// Close shutdowns the connection to the levelDB instance of s
func (s *WMailServer) Close() { func (s *WMailServer) Close() {
if s.db != nil { if s.db != nil {
s.db.Close() s.db.Close()
} }
} }
// Archive maps the message in bytes to a new raw key hash.
func (s *WMailServer) Archive(env *whisper.Envelope) { func (s *WMailServer) Archive(env *whisper.Envelope) {
key := NewDbKey(env.Expiry-env.TTL, env.Hash()) key := NewDbKey(env.Expiry-env.TTL, env.Hash())
rawEnvelope, err := rlp.EncodeToBytes(env) rawEnvelope, err := rlp.EncodeToBytes(env)
@ -101,6 +107,7 @@ func (s *WMailServer) Archive(env *whisper.Envelope) {
} }
} }
// DeliverMail will send a message via the p2p protocol.
func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) { func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) {
if peer == nil { if peer == nil {
log.Error("Whisper peer is nil") log.Error("Whisper peer is nil")
@ -177,15 +184,16 @@ func (s *WMailServer) validateRequest(peerID []byte, request *whisper.Envelope)
var bloom []byte var bloom []byte
payloadSize := len(decrypted.Payload) payloadSize := len(decrypted.Payload)
if payloadSize < 8 { switch {
case (payloadSize < 8):
log.Warn(fmt.Sprintf("Undersized p2p request")) log.Warn(fmt.Sprintf("Undersized p2p request"))
return false, 0, 0, nil return false, 0, 0, nil
} else if payloadSize == 8 { case (payloadSize == 8):
bloom = whisper.MakeFullNodeBloom() bloom = whisper.MakeFullNodeBloom()
} else if payloadSize < 8+whisper.BloomFilterSize { case (payloadSize < 8+whisper.BloomFilterSize):
log.Warn(fmt.Sprintf("Undersized bloom filter in p2p request")) log.Warn(fmt.Sprintf("Undersized bloom filter in p2p request"))
return false, 0, 0, nil return false, 0, 0, nil
} else { default:
bloom = decrypted.Payload[8 : 8+whisper.BloomFilterSize] bloom = decrypted.Payload[8 : 8+whisper.BloomFilterSize]
} }

View file

@ -32,6 +32,7 @@ import (
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
) )
// Variables that specify custom error messages.
var ( var (
ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key") ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key")
ErrInvalidSymmetricKey = errors.New("invalid symmetric key") ErrInvalidSymmetricKey = errors.New("invalid symmetric key")

View file

@ -16,11 +16,13 @@
package whisperv5 package whisperv5
// Config is used to map unambiguously to values in the doc.go file.
type Config struct { type Config struct {
MaxMessageSize uint32 `toml:",omitempty"` MaxMessageSize uint32 `toml:",omitempty"`
MinimumAcceptedPOW float64 `toml:",omitempty"` MinimumAcceptedPOW float64 `toml:",omitempty"`
} }
// DefaultConfig values are set by the doc.go file within this package.
var DefaultConfig = Config{ var DefaultConfig = Config{
MaxMessageSize: DefaultMaxMessageSize, MaxMessageSize: DefaultMaxMessageSize,
MinimumAcceptedPOW: DefaultMinimumPoW, MinimumAcceptedPOW: DefaultMinimumPoW,

View file

@ -34,6 +34,7 @@ import (
"time" "time"
) )
// Constants here define the configuration for the current release.
const ( const (
EnvelopeVersion = uint64(0) EnvelopeVersion = uint64(0)
ProtocolVersion = uint64(5) ProtocolVersion = uint64(5)
@ -53,7 +54,7 @@ const (
signatureLength = 65 signatureLength = 65
aesKeyLength = 32 aesKeyLength = 32
AESNonceLength = 12 AESNonceLength = 12
keyIdSize = 32 keyIDSize = 32
MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message. MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message.
DefaultMaxMessageSize = uint32(1024 * 1024) DefaultMaxMessageSize = uint32(1024 * 1024)

View file

@ -82,14 +82,17 @@ func NewEnvelope(ttl uint32, topic TopicType, aesNonce []byte, msg *sentMessage)
return &env return &env
} }
// IsSymmetric confirms the AESNonce has length greater than 0.
func (e *Envelope) IsSymmetric() bool { func (e *Envelope) IsSymmetric() bool {
return len(e.AESNonce) > 0 return len(e.AESNonce) > 0
} }
// isAsymmetric confirms the AESNonce does not have a length greater than 0.
func (e *Envelope) isAsymmetric() bool { func (e *Envelope) isAsymmetric() bool {
return !e.IsSymmetric() return !e.IsSymmetric()
} }
//Ver converts the version to 64-bit unsigned integer.
func (e *Envelope) Ver() uint64 { func (e *Envelope) Ver() uint64 {
return bytesToUintLittleEndian(e.Version) return bytesToUintLittleEndian(e.Version)
} }
@ -223,7 +226,7 @@ func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
if msg != nil { if msg != nil {
msg.Dst = &watcher.KeyAsym.PublicKey msg.Dst = &watcher.KeyAsym.PublicKey
} }
} else if e.IsSymmetric() { } else {
msg, _ = e.OpenSymmetric(watcher.KeySym) msg, _ = e.OpenSymmetric(watcher.KeySym)
if msg != nil { if msg != nil {
msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym) msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)

View file

@ -45,6 +45,7 @@ type Filters struct {
mutex sync.RWMutex mutex sync.RWMutex
} }
// NewFilters initiliazes the Filterse struct with w.
func NewFilters(w *Whisper) *Filters { func NewFilters(w *Whisper) *Filters {
return &Filters{ return &Filters{
watchers: make(map[string]*Filter), watchers: make(map[string]*Filter),
@ -52,6 +53,8 @@ func NewFilters(w *Whisper) *Filters {
} }
} }
// Install hashes the Topic's key and sets the watcher to a random ID
// inside fs.watchers.
func (fs *Filters) Install(watcher *Filter) (string, error) { func (fs *Filters) Install(watcher *Filter) (string, error) {
if watcher.Messages == nil { if watcher.Messages == nil {
watcher.Messages = make(map[common.Hash]*ReceivedMessage) watcher.Messages = make(map[common.Hash]*ReceivedMessage)
@ -77,6 +80,7 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
return id, err return id, err
} }
// Uninstall deletes values associated with id from fs.watchers, if one exists.
func (fs *Filters) Uninstall(id string) bool { func (fs *Filters) Uninstall(id string) bool {
fs.mutex.Lock() fs.mutex.Lock()
defer fs.mutex.Unlock() defer fs.mutex.Unlock()
@ -87,12 +91,15 @@ func (fs *Filters) Uninstall(id string) bool {
return false return false
} }
// Get returns the watcher with the associated id.
func (fs *Filters) Get(id string) *Filter { func (fs *Filters) Get(id string) *Filter {
fs.mutex.RLock() fs.mutex.RLock()
defer fs.mutex.RUnlock() defer fs.mutex.RUnlock()
return fs.watchers[id] return fs.watchers[id]
} }
// NotifyWatchers validates that messages are allowed to be read before
// mapping the msg to fs Messages map.
func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) { func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
var msg *ReceivedMessage var msg *ReceivedMessage
@ -136,9 +143,8 @@ func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage {
msg := env.Open(f) msg := env.Open(f)
if msg != nil { if msg != nil {
return msg return msg
} else {
log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
} }
log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
} else { } else {
log.Trace("processing envelope: does not match", "hash", env.Hash().Hex()) log.Trace("processing envelope: does not match", "hash", env.Hash().Hex())
} }
@ -153,6 +159,8 @@ func (f *Filter) expectsSymmetricEncryption() bool {
return f.KeySym != nil return f.KeySym != nil
} }
// Trigger will assign the msg to Filter's Messages map if the
// EnvelopeHash has not already been used to set a msg.
func (f *Filter) Trigger(msg *ReceivedMessage) { func (f *Filter) Trigger(msg *ReceivedMessage) {
f.mutex.Lock() f.mutex.Lock()
defer f.mutex.Unlock() defer f.mutex.Unlock()
@ -162,6 +170,7 @@ func (f *Filter) Trigger(msg *ReceivedMessage) {
} }
} }
// Retrieve will return a slice of all messages the Filter stores.
func (f *Filter) Retrieve() (all []*ReceivedMessage) { func (f *Filter) Retrieve() (all []*ReceivedMessage) {
f.mutex.Lock() f.mutex.Lock()
defer f.mutex.Unlock() defer f.mutex.Unlock()
@ -201,6 +210,7 @@ func (f *Filter) MatchEnvelope(envelope *Envelope) bool {
return false return false
} }
// MatchTopic checks whether param topic exists in the f receiver.
func (f *Filter) MatchTopic(topic TopicType) bool { func (f *Filter) MatchTopic(topic TopicType) bool {
if len(f.Topics) == 0 { if len(f.Topics) == 0 {
// any topic matches // any topic matches
@ -232,6 +242,8 @@ func matchSingleTopic(topic TopicType, bt []byte) bool {
return true return true
} }
// IsPubKeyEqual checks the format of the given public keys a and b,
// and compares where each sits on an elliptical curve.
func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool { func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool {
if !ValidatePublicKey(a) { if !ValidatePublicKey(a) {
return false return false

View file

@ -109,7 +109,7 @@ func TestInstallFilters(t *testing.T) {
t.Fatalf("seed %d: failed to install filter: %s", seed, err) t.Fatalf("seed %d: failed to install filter: %s", seed, err)
} }
tst[i].id = j tst[i].id = j
if len(j) != keyIdSize*2 { if len(j) != keyIDSize*2 {
t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j)) t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j))
} }
} }

View file

@ -10,6 +10,7 @@ import (
var _ = (*criteriaOverride)(nil) var _ = (*criteriaOverride)(nil)
// MarshalJSON implements the json.Marshaller interface.
func (c Criteria) MarshalJSON() ([]byte, error) { func (c Criteria) MarshalJSON() ([]byte, error) {
type Criteria struct { type Criteria struct {
SymKeyID string `json:"symKeyID"` SymKeyID string `json:"symKeyID"`
@ -29,6 +30,7 @@ func (c Criteria) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc) return json.Marshal(&enc)
} }
// UnmarshalJSON implements json.Unmarshaler interface and maps input to C.
func (c *Criteria) UnmarshalJSON(input []byte) error { func (c *Criteria) UnmarshalJSON(input []byte) error {
type Criteria struct { type Criteria struct {
SymKeyID *string `json:"symKeyID"` SymKeyID *string `json:"symKeyID"`

View file

@ -10,6 +10,7 @@ import (
var _ = (*messageOverride)(nil) var _ = (*messageOverride)(nil)
// MarshalJSON implements the json.Marshaller interface.
func (m Message) MarshalJSON() ([]byte, error) { func (m Message) MarshalJSON() ([]byte, error) {
type Message struct { type Message struct {
Sig hexutil.Bytes `json:"sig,omitempty"` Sig hexutil.Bytes `json:"sig,omitempty"`
@ -35,6 +36,7 @@ func (m Message) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc) return json.Marshal(&enc)
} }
// UnmarshalJSON implements json.Unmarshaler interface and maps input to m.
func (m *Message) UnmarshalJSON(input []byte) error { func (m *Message) UnmarshalJSON(input []byte) error {
type Message struct { type Message struct {
Sig *hexutil.Bytes `json:"sig,omitempty"` Sig *hexutil.Bytes `json:"sig,omitempty"`

View file

@ -10,6 +10,7 @@ import (
var _ = (*newMessageOverride)(nil) var _ = (*newMessageOverride)(nil)
// MarshalJSON implements the json.Marshaller interface.
func (n NewMessage) MarshalJSON() ([]byte, error) { func (n NewMessage) MarshalJSON() ([]byte, error) {
type NewMessage struct { type NewMessage struct {
SymKeyID string `json:"symKeyID"` SymKeyID string `json:"symKeyID"`
@ -37,6 +38,7 @@ func (n NewMessage) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc) return json.Marshal(&enc)
} }
// UnmarshalJSON implements json.Unmarshaler interface and maps input to n.
func (n *NewMessage) UnmarshalJSON(input []byte) error { func (n *NewMessage) UnmarshalJSON(input []byte) error {
type NewMessage struct { type NewMessage struct {
SymKeyID *string `json:"symKeyID"` SymKeyID *string `json:"symKeyID"`

View file

@ -156,18 +156,18 @@ func (peer *Peer) broadcast() error {
err := p2p.Send(peer.ws, messagesCode, envelope) err := p2p.Send(peer.ws, messagesCode, envelope)
if err != nil { if err != nil {
return err return err
} else { }
peer.mark(envelope) peer.mark(envelope)
cnt++ cnt++
} }
} }
}
if cnt > 0 { if cnt > 0 {
log.Trace("broadcast", "num. messages", cnt) log.Trace("broadcast", "num. messages", cnt)
} }
return nil return nil
} }
// ID returns the peers peer.ID in a byte slice.
func (peer *Peer) ID() []byte { func (peer *Peer) ID() []byte {
id := peer.peer.ID() id := peer.peer.ID()
return id[:] return id[:]

View file

@ -79,13 +79,13 @@ type TestNode struct {
shh *Whisper shh *Whisper
id *ecdsa.PrivateKey id *ecdsa.PrivateKey
server *p2p.Server server *p2p.Server
filerId string filerID string
} }
var result TestData var result TestData
var nodes [NumNodes]*TestNode var nodes [NumNodes]*TestNode
var sharedKey = []byte("some arbitrary data here") var sharedKey = []byte("some arbitrary data here")
var sharedTopic TopicType = TopicType{0xF, 0x1, 0x2, 0} var sharedTopic = TopicType{0xF, 0x1, 0x2, 0}
var expectedMessage = []byte("per rectum ad astra") var expectedMessage = []byte("per rectum ad astra")
// This test does the following: // This test does the following:
@ -120,7 +120,7 @@ func initialize(t *testing.T) {
topics = append(topics, sharedTopic) topics = append(topics, sharedTopic)
f := Filter{KeySym: sharedKey} f := Filter{KeySym: sharedKey}
f.Topics = [][]byte{topics[0][:]} f.Topics = [][]byte{topics[0][:]}
node.filerId, err = node.shh.Subscribe(&f) node.filerID, err = node.shh.Subscribe(&f)
if err != nil { if err != nil {
t.Fatalf("failed to install the filter: %s.", err) t.Fatalf("failed to install the filter: %s.", err)
} }
@ -133,9 +133,9 @@ func initialize(t *testing.T) {
name := common.MakeName("whisper-go", "2.0") name := common.MakeName("whisper-go", "2.0")
var peers []*discover.Node var peers []*discover.Node
if i > 0 { if i > 0 {
peerNodeId := nodes[i-1].id peerNodeID := nodes[i-1].id
peerPort := uint16(port - 1) peerPort := uint16(port - 1)
peerNode := discover.PubkeyID(&peerNodeId.PublicKey) peerNode := discover.PubkeyID(&peerNodeID.PublicKey)
peer := discover.NewNode(peerNode, ip, peerPort, peerPort) peer := discover.NewNode(peerNode, ip, peerPort, peerPort)
peers = append(peers, peer) peers = append(peers, peer)
} }
@ -167,7 +167,7 @@ func stopServers() {
for i := 0; i < NumNodes; i++ { for i := 0; i < NumNodes; i++ {
n := nodes[i] n := nodes[i]
if n != nil { if n != nil {
n.shh.Unsubscribe(n.filerId) n.shh.Unsubscribe(n.filerID)
n.shh.Stop() n.shh.Stop()
n.server.Stop() n.server.Stop()
} }
@ -186,9 +186,9 @@ func checkPropagation(t *testing.T) {
time.Sleep(cycle * time.Millisecond) time.Sleep(cycle * time.Millisecond)
for i := 0; i < NumNodes; i++ { for i := 0; i < NumNodes; i++ {
f := nodes[i].shh.GetFilter(nodes[i].filerId) f := nodes[i].shh.GetFilter(nodes[i].filerID)
if f == nil { if f == nil {
t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerId, i) t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerID, i)
} }
mail := f.Retrieve() mail := f.Retrieve()

View file

@ -28,6 +28,7 @@ import (
// SHA3 hash of some arbitrary data given by the original author of the message. // SHA3 hash of some arbitrary data given by the original author of the message.
type TopicType [TopicLength]byte type TopicType [TopicLength]byte
// BytesToTopic will return passed parameters as a TopicType.
func BytesToTopic(b []byte) (t TopicType) { func BytesToTopic(b []byte) (t TopicType) {
sz := TopicLength sz := TopicLength
if x := len(b); x < TopicLength { if x := len(b); x < TopicLength {

View file

@ -37,6 +37,7 @@ import (
set "gopkg.in/fatih/set.v0" set "gopkg.in/fatih/set.v0"
) )
// Statistics is used to store useful information regarding whisper node usage.
type Statistics struct { type Statistics struct {
messagesCleared int messagesCleared int
memoryCleared int memoryCleared int
@ -121,6 +122,7 @@ func New(cfg *Config) *Whisper {
return whisper return whisper
} }
// MinPow returns the minimal PoW required by this node.
func (w *Whisper) MinPow() float64 { func (w *Whisper) MinPow() float64 {
val, _ := w.settings.Load(minPowIdx) val, _ := w.settings.Load(minPowIdx)
return val.(float64) return val.(float64)
@ -842,7 +844,7 @@ func deriveKeyMaterial(key []byte, version uint64) (derivedKey []byte, err error
// GenerateRandomID generates a random string, which is then returned to be used as a key id // GenerateRandomID generates a random string, which is then returned to be used as a key id
func GenerateRandomID() (id string, err error) { func GenerateRandomID() (id string, err error) {
buf := make([]byte, keyIdSize) buf := make([]byte, keyIDSize)
_, err = crand.Read(buf) _, err = crand.Read(buf)
if err != nil { if err != nil {
return "", err return "", err

View file

@ -242,6 +242,8 @@ func (peer *Peer) setBloomFilter(bloom []byte) {
} }
} }
// MakeFullNodeBloom returns a bloom object with all entries
// representing a single byte with the value of 255.
func MakeFullNodeBloom() []byte { func MakeFullNodeBloom() []byte {
bloom := make([]byte, BloomFilterSize) bloom := make([]byte, BloomFilterSize)
for i := 0; i < BloomFilterSize; i++ { for i := 0; i < BloomFilterSize; i++ {

View file

@ -1025,6 +1025,7 @@ func isFullNode(bloom []byte) bool {
return true return true
} }
// BloomFilterMatch compares the values of filter and sample, returning a boolean.
func BloomFilterMatch(filter, sample []byte) bool { func BloomFilterMatch(filter, sample []byte) bool {
if filter == nil { if filter == nil {
return true return true