package main
import (
+ "./replay"
"crypto/cipher"
"sync"
"time"
sendNonce uint64
send cipher.AEAD
receive cipher.AEAD
- replayFilter ReplayFilter
+ replayFilter replay.ReplayFilter
isInitiator bool
created time.Time
localIndex uint32
}
return a
}
-
-func minUint64(a uint64, b uint64) uint64 {
- if a > b {
- return b
- }
- return a
-}
// check for replay
- if !elem.keypair.replayFilter.ValidateCounter(elem.counter) {
+ if !elem.keypair.replayFilter.ValidateCounter(elem.counter, RejectAfterMessages) {
continue
}
* Copyright (C) 2017-2018 Mathias N. Hall-Andersen <mathias@hall-andersen.dk>.
*/
-package main
-
-/* Copyright (C) 2015-2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. */
+package replay
/* Implementation of RFC6479
* https://tools.ietf.org/html/rfc6479
BacktrackWords = CounterBitsTotal / _WordSize
)
+func minUint64(a uint64, b uint64) uint64 {
+ if a > b {
+ return b
+ }
+ return a
+}
+
type ReplayFilter struct {
counter uint64
backtrack [BacktrackWords]uintptr
filter.backtrack[0] = 0
}
-func (filter *ReplayFilter) ValidateCounter(counter uint64) bool {
- if counter >= RejectAfterMessages {
+func (filter *ReplayFilter) ValidateCounter(counter uint64, limit uint64) bool {
+ if counter >= limit {
return false
}
* Copyright (C) 2017-2018 Mathias N. Hall-Andersen <mathias@hall-andersen.dk>.
*/
-package main
+package replay
import (
"testing"
*
*/
+const RejectAfterMessages = (1 << 64) - (1 << 4) - 1
+
func TestReplay(t *testing.T) {
var filter ReplayFilter
testNumber := 0
T := func(n uint64, v bool) {
testNumber++
- if filter.ValidateCounter(n) != v {
+ if filter.ValidateCounter(n, RejectAfterMessages) != v {
t.Fatal("Test", testNumber, "failed", n, v)
}
}