Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
7a045af0
Commit
7a045af0
authored
Oct 06, 2017
by
Guillaume Ballet
Committed by
Felix Lange
Oct 06, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
whisper/whisperv5: set filter SymKeyHash on creation (#15165)
parent
36243c7e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
331 additions
and
17 deletions
+331
-17
api.go
whisper/whisperv5/api.go
+1
-1
config.go
whisper/whisperv5/config.go
+0
-2
filter.go
whisper/whisperv5/filter.go
+8
-4
filter_test.go
whisper/whisperv5/filter_test.go
+97
-10
whisper_test.go
whisper/whisperv5/whisper_test.go
+225
-0
No files found.
whisper/whisperv5/api.go
View file @
7a045af0
...
@@ -104,7 +104,7 @@ func (api *PublicWhisperAPI) Info(ctx context.Context) Info {
...
@@ -104,7 +104,7 @@ func (api *PublicWhisperAPI) Info(ctx context.Context) Info {
stats
:=
api
.
w
.
Stats
()
stats
:=
api
.
w
.
Stats
()
return
Info
{
return
Info
{
Memory
:
stats
.
memoryUsed
,
Memory
:
stats
.
memoryUsed
,
Messages
:
len
(
api
.
w
.
messageQueue
)
+
len
(
api
.
w
.
p2pMsgQueue
),
Messages
:
len
(
api
.
w
.
messageQueue
)
+
len
(
api
.
w
.
p2pMsgQueue
),
MinPow
:
api
.
w
.
MinPow
(),
MinPow
:
api
.
w
.
MinPow
(),
MaxMessageSize
:
api
.
w
.
MaxMessageSize
(),
MaxMessageSize
:
api
.
w
.
MaxMessageSize
(),
}
}
...
...
whisper/whisperv5/config.go
View file @
7a045af0
...
@@ -25,5 +25,3 @@ var DefaultConfig = Config{
...
@@ -25,5 +25,3 @@ var DefaultConfig = Config{
MaxMessageSize
:
DefaultMaxMessageSize
,
MaxMessageSize
:
DefaultMaxMessageSize
,
MinimumAcceptedPOW
:
DefaultMinimumPoW
,
MinimumAcceptedPOW
:
DefaultMinimumPoW
,
}
}
var
()
whisper/whisperv5/filter.go
View file @
7a045af0
...
@@ -22,6 +22,7 @@ import (
...
@@ -22,6 +22,7 @@ import (
"sync"
"sync"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
...
@@ -68,6 +69,10 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
...
@@ -68,6 +69,10 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
return
""
,
fmt
.
Errorf
(
"failed to generate unique ID"
)
return
""
,
fmt
.
Errorf
(
"failed to generate unique ID"
)
}
}
if
watcher
.
expectsSymmetricEncryption
()
{
watcher
.
SymKeyHash
=
crypto
.
Keccak256Hash
(
watcher
.
KeySym
)
}
fs
.
watchers
[
id
]
=
watcher
fs
.
watchers
[
id
]
=
watcher
return
id
,
err
return
id
,
err
}
}
...
@@ -119,7 +124,9 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
...
@@ -119,7 +124,9 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
if
match
&&
msg
!=
nil
{
if
match
&&
msg
!=
nil
{
log
.
Trace
(
"processing message: decrypted"
,
"hash"
,
env
.
Hash
()
.
Hex
())
log
.
Trace
(
"processing message: decrypted"
,
"hash"
,
env
.
Hash
()
.
Hex
())
watcher
.
Trigger
(
msg
)
if
watcher
.
Src
==
nil
||
IsPubKeyEqual
(
msg
.
Src
,
watcher
.
Src
)
{
watcher
.
Trigger
(
msg
)
}
}
}
}
}
}
}
...
@@ -172,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
...
@@ -172,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
if
f
.
PoW
>
0
&&
msg
.
PoW
<
f
.
PoW
{
if
f
.
PoW
>
0
&&
msg
.
PoW
<
f
.
PoW
{
return
false
return
false
}
}
if
f
.
Src
!=
nil
&&
!
IsPubKeyEqual
(
msg
.
Src
,
f
.
Src
)
{
return
false
}
if
f
.
expectsAsymmetricEncryption
()
&&
msg
.
isAsymmetricEncryption
()
{
if
f
.
expectsAsymmetricEncryption
()
&&
msg
.
isAsymmetricEncryption
()
{
return
IsPubKeyEqual
(
&
f
.
KeyAsym
.
PublicKey
,
msg
.
Dst
)
&&
f
.
MatchTopic
(
msg
.
Topic
)
return
IsPubKeyEqual
(
&
f
.
KeyAsym
.
PublicKey
,
msg
.
Dst
)
&&
f
.
MatchTopic
(
msg
.
Topic
)
...
...
whisper/whisperv5/filter_test.go
View file @
7a045af0
...
@@ -132,6 +132,103 @@ func TestInstallFilters(t *testing.T) {
...
@@ -132,6 +132,103 @@ func TestInstallFilters(t *testing.T) {
}
}
}
}
func
TestInstallSymKeyGeneratesHash
(
t
*
testing
.
T
)
{
InitSingleTest
()
w
:=
New
(
&
Config
{})
filters
:=
NewFilters
(
w
)
filter
,
_
:=
generateFilter
(
t
,
true
)
// save the current SymKeyHash for comparison
initialSymKeyHash
:=
filter
.
SymKeyHash
// ensure the SymKeyHash is invalid, for Install to recreate it
var
invalid
common
.
Hash
filter
.
SymKeyHash
=
invalid
_
,
err
:=
filters
.
Install
(
filter
)
if
err
!=
nil
{
t
.
Fatalf
(
"Error installing the filter: %s"
,
err
)
}
for
i
,
b
:=
range
filter
.
SymKeyHash
{
if
b
!=
initialSymKeyHash
[
i
]
{
t
.
Fatalf
(
"The filter's symmetric key hash was not properly generated by Install"
)
}
}
}
func
TestInstallIdenticalFilters
(
t
*
testing
.
T
)
{
InitSingleTest
()
w
:=
New
(
&
Config
{})
filters
:=
NewFilters
(
w
)
filter1
,
_
:=
generateFilter
(
t
,
true
)
// Copy the first filter since some of its fields
// are randomly gnerated.
filter2
:=
&
Filter
{
KeySym
:
filter1
.
KeySym
,
Topics
:
filter1
.
Topics
,
PoW
:
filter1
.
PoW
,
AllowP2P
:
filter1
.
AllowP2P
,
Messages
:
make
(
map
[
common
.
Hash
]
*
ReceivedMessage
),
}
_
,
err
:=
filters
.
Install
(
filter1
)
if
err
!=
nil
{
t
.
Fatalf
(
"Error installing the first filter with seed %d: %s"
,
seed
,
err
)
}
_
,
err
=
filters
.
Install
(
filter2
)
if
err
!=
nil
{
t
.
Fatalf
(
"Error installing the second filter with seed %d: %s"
,
seed
,
err
)
}
params
,
err
:=
generateMessageParams
()
if
err
!=
nil
{
t
.
Fatalf
(
"Error generating message parameters with seed %d: %s"
,
seed
,
err
)
}
params
.
KeySym
=
filter1
.
KeySym
params
.
Topic
=
BytesToTopic
(
filter1
.
Topics
[
0
])
filter1
.
Src
=
&
params
.
Src
.
PublicKey
filter2
.
Src
=
&
params
.
Src
.
PublicKey
sentMessage
,
err
:=
NewSentMessage
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new message with seed %d: %s."
,
seed
,
err
)
}
env
,
err
:=
sentMessage
.
Wrap
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed Wrap with seed %d: %s."
,
seed
,
err
)
}
msg
:=
env
.
Open
(
filter1
)
if
msg
==
nil
{
t
.
Fatalf
(
"failed to Open with filter1"
)
}
if
!
filter1
.
MatchEnvelope
(
env
)
{
t
.
Fatalf
(
"failed matching with the first filter"
)
}
if
!
filter2
.
MatchEnvelope
(
env
)
{
t
.
Fatalf
(
"failed matching with the first filter"
)
}
if
!
filter1
.
MatchMessage
(
msg
)
{
t
.
Fatalf
(
"failed matching with the second filter"
)
}
if
!
filter2
.
MatchMessage
(
msg
)
{
t
.
Fatalf
(
"failed matching with the second filter"
)
}
}
func
TestComparePubKey
(
t
*
testing
.
T
)
{
func
TestComparePubKey
(
t
*
testing
.
T
)
{
InitSingleTest
()
InitSingleTest
()
...
@@ -345,11 +442,6 @@ func TestMatchMessageSym(t *testing.T) {
...
@@ -345,11 +442,6 @@ func TestMatchMessageSym(t *testing.T) {
t
.
Fatalf
(
"failed Open with seed %d."
,
seed
)
t
.
Fatalf
(
"failed Open with seed %d."
,
seed
)
}
}
// Src mismatch
if
f
.
MatchMessage
(
msg
)
{
t
.
Fatalf
(
"failed MatchMessage(src mismatch) with seed %d."
,
seed
)
}
// Src: match
// Src: match
*
f
.
Src
.
X
=
*
params
.
Src
.
PublicKey
.
X
*
f
.
Src
.
X
=
*
params
.
Src
.
PublicKey
.
X
*
f
.
Src
.
Y
=
*
params
.
Src
.
PublicKey
.
Y
*
f
.
Src
.
Y
=
*
params
.
Src
.
PublicKey
.
Y
...
@@ -443,11 +535,6 @@ func TestMatchMessageAsym(t *testing.T) {
...
@@ -443,11 +535,6 @@ func TestMatchMessageAsym(t *testing.T) {
t
.
Fatalf
(
"failed to open with seed %d."
,
seed
)
t
.
Fatalf
(
"failed to open with seed %d."
,
seed
)
}
}
// Src mismatch
if
f
.
MatchMessage
(
msg
)
{
t
.
Fatalf
(
"failed MatchMessage(src mismatch) with seed %d."
,
seed
)
}
// Src: match
// Src: match
*
f
.
Src
.
X
=
*
params
.
Src
.
PublicKey
.
X
*
f
.
Src
.
X
=
*
params
.
Src
.
PublicKey
.
X
*
f
.
Src
.
Y
=
*
params
.
Src
.
PublicKey
.
Y
*
f
.
Src
.
Y
=
*
params
.
Src
.
PublicKey
.
Y
...
...
whisper/whisperv5/whisper_test.go
View file @
7a045af0
...
@@ -22,6 +22,8 @@ import (
...
@@ -22,6 +22,8 @@ import (
mrand
"math/rand"
mrand
"math/rand"
"testing"
"testing"
"time"
"time"
"github.com/ethereum/go-ethereum/common"
)
)
func
TestWhisperBasic
(
t
*
testing
.
T
)
{
func
TestWhisperBasic
(
t
*
testing
.
T
)
{
...
@@ -624,3 +626,226 @@ func TestCustomization(t *testing.T) {
...
@@ -624,3 +626,226 @@ func TestCustomization(t *testing.T) {
t
.
Fatalf
(
"failed to get whisper messages"
)
t
.
Fatalf
(
"failed to get whisper messages"
)
}
}
}
}
func
TestSymmetricSendCycle
(
t
*
testing
.
T
)
{
InitSingleTest
()
w
:=
New
(
&
DefaultConfig
)
defer
w
.
SetMinimumPoW
(
DefaultMinimumPoW
)
defer
w
.
SetMaxMessageSize
(
DefaultMaxMessageSize
)
w
.
Start
(
nil
)
defer
w
.
Stop
()
filter1
,
err
:=
generateFilter
(
t
,
true
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
filter1
.
PoW
=
DefaultMinimumPoW
// Copy the first filter since some of its fields
// are randomly gnerated.
filter2
:=
&
Filter
{
KeySym
:
filter1
.
KeySym
,
Topics
:
filter1
.
Topics
,
PoW
:
filter1
.
PoW
,
AllowP2P
:
filter1
.
AllowP2P
,
Messages
:
make
(
map
[
common
.
Hash
]
*
ReceivedMessage
),
}
params
,
err
:=
generateMessageParams
()
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
filter1
.
Src
=
&
params
.
Src
.
PublicKey
filter2
.
Src
=
&
params
.
Src
.
PublicKey
params
.
KeySym
=
filter1
.
KeySym
params
.
Topic
=
BytesToTopic
(
filter1
.
Topics
[
2
])
params
.
PoW
=
filter1
.
PoW
params
.
WorkTime
=
10
params
.
TTL
=
50
msg
,
err
:=
NewSentMessage
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new message with seed %d: %s."
,
seed
,
err
)
}
env
,
err
:=
msg
.
Wrap
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed Wrap with seed %d: %s."
,
seed
,
err
)
}
_
,
err
=
w
.
Subscribe
(
filter1
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed subscribe 1 with seed %d: %s."
,
seed
,
err
)
}
_
,
err
=
w
.
Subscribe
(
filter2
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed subscribe 2 with seed %d: %s."
,
seed
,
err
)
}
err
=
w
.
Send
(
env
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed sending envelope with PoW %.06f (seed %d): %s"
,
env
.
PoW
(),
seed
,
err
)
}
// wait till received or timeout
var
received
bool
for
j
:=
0
;
j
<
200
;
j
++
{
time
.
Sleep
(
10
*
time
.
Millisecond
)
if
len
(
w
.
Envelopes
())
>
0
{
received
=
true
break
}
}
if
!
received
{
t
.
Fatalf
(
"did not receive the sent envelope, seed: %d."
,
seed
)
}
// check w.messages()
time
.
Sleep
(
5
*
time
.
Millisecond
)
mail1
:=
filter1
.
Retrieve
()
mail2
:=
filter2
.
Retrieve
()
if
len
(
mail2
)
==
0
{
t
.
Fatalf
(
"did not receive any email for filter 2"
)
}
if
len
(
mail1
)
==
0
{
t
.
Fatalf
(
"did not receive any email for filter 1"
)
}
}
func
TestSymmetricSendWithoutAKey
(
t
*
testing
.
T
)
{
InitSingleTest
()
w
:=
New
(
&
DefaultConfig
)
defer
w
.
SetMinimumPoW
(
DefaultMinimumPoW
)
defer
w
.
SetMaxMessageSize
(
DefaultMaxMessageSize
)
w
.
Start
(
nil
)
defer
w
.
Stop
()
filter
,
err
:=
generateFilter
(
t
,
true
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
filter
.
PoW
=
DefaultMinimumPoW
params
,
err
:=
generateMessageParams
()
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
filter
.
Src
=
nil
params
.
KeySym
=
filter
.
KeySym
params
.
Topic
=
BytesToTopic
(
filter
.
Topics
[
2
])
params
.
PoW
=
filter
.
PoW
params
.
WorkTime
=
10
params
.
TTL
=
50
msg
,
err
:=
NewSentMessage
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new message with seed %d: %s."
,
seed
,
err
)
}
env
,
err
:=
msg
.
Wrap
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed Wrap with seed %d: %s."
,
seed
,
err
)
}
_
,
err
=
w
.
Subscribe
(
filter
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed subscribe 1 with seed %d: %s."
,
seed
,
err
)
}
err
=
w
.
Send
(
env
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed sending envelope with PoW %.06f (seed %d): %s"
,
env
.
PoW
(),
seed
,
err
)
}
// wait till received or timeout
var
received
bool
for
j
:=
0
;
j
<
200
;
j
++
{
time
.
Sleep
(
10
*
time
.
Millisecond
)
if
len
(
w
.
Envelopes
())
>
0
{
received
=
true
break
}
}
if
!
received
{
t
.
Fatalf
(
"did not receive the sent envelope, seed: %d."
,
seed
)
}
// check w.messages()
time
.
Sleep
(
5
*
time
.
Millisecond
)
mail
:=
filter
.
Retrieve
()
if
len
(
mail
)
==
0
{
t
.
Fatalf
(
"did not receive message in spite of not setting a public key"
)
}
}
func
TestSymmetricSendKeyMismatch
(
t
*
testing
.
T
)
{
InitSingleTest
()
w
:=
New
(
&
DefaultConfig
)
defer
w
.
SetMinimumPoW
(
DefaultMinimumPoW
)
defer
w
.
SetMaxMessageSize
(
DefaultMaxMessageSize
)
w
.
Start
(
nil
)
defer
w
.
Stop
()
filter
,
err
:=
generateFilter
(
t
,
true
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
filter
.
PoW
=
DefaultMinimumPoW
params
,
err
:=
generateMessageParams
()
if
err
!=
nil
{
t
.
Fatalf
(
"failed generateMessageParams with seed %d: %s."
,
seed
,
err
)
}
params
.
KeySym
=
filter
.
KeySym
params
.
Topic
=
BytesToTopic
(
filter
.
Topics
[
2
])
params
.
PoW
=
filter
.
PoW
params
.
WorkTime
=
10
params
.
TTL
=
50
msg
,
err
:=
NewSentMessage
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new message with seed %d: %s."
,
seed
,
err
)
}
env
,
err
:=
msg
.
Wrap
(
params
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed Wrap with seed %d: %s."
,
seed
,
err
)
}
_
,
err
=
w
.
Subscribe
(
filter
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed subscribe 1 with seed %d: %s."
,
seed
,
err
)
}
err
=
w
.
Send
(
env
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed sending envelope with PoW %.06f (seed %d): %s"
,
env
.
PoW
(),
seed
,
err
)
}
// wait till received or timeout
var
received
bool
for
j
:=
0
;
j
<
200
;
j
++
{
time
.
Sleep
(
10
*
time
.
Millisecond
)
if
len
(
w
.
Envelopes
())
>
0
{
received
=
true
break
}
}
if
!
received
{
t
.
Fatalf
(
"did not receive the sent envelope, seed: %d."
,
seed
)
}
// check w.messages()
time
.
Sleep
(
5
*
time
.
Millisecond
)
mail
:=
filter
.
Retrieve
()
if
len
(
mail
)
>
0
{
t
.
Fatalf
(
"received a message when keys weren't matching"
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment