Rework index hashtable
This commit is contained in:
parent
233f079a94
commit
2c27ab205c
|
@ -56,8 +56,8 @@ type Device struct {
|
||||||
|
|
||||||
// unprotected / "self-synchronising resources"
|
// unprotected / "self-synchronising resources"
|
||||||
|
|
||||||
indices IndexTable
|
indexTable IndexTable
|
||||||
mac CookieChecker
|
mac CookieChecker
|
||||||
|
|
||||||
rate struct {
|
rate struct {
|
||||||
underLoadUntil atomic.Value
|
underLoadUntil atomic.Value
|
||||||
|
@ -283,7 +283,7 @@ func NewDevice(tun TUNDevice, logger *Logger) *Device {
|
||||||
|
|
||||||
// initialize noise & crypt-key routine
|
// initialize noise & crypt-key routine
|
||||||
|
|
||||||
device.indices.Init()
|
device.indexTable.Init()
|
||||||
device.routing.table.Reset()
|
device.routing.table.Reset()
|
||||||
|
|
||||||
// setup buffer pool
|
// setup buffer pool
|
||||||
|
|
|
@ -7,18 +7,14 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
/* Index=0 is reserved for unset indecies
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
type IndexTableEntry struct {
|
type IndexTableEntry struct {
|
||||||
peer *Peer
|
peer *Peer
|
||||||
handshake *Handshake
|
handshake *Handshake
|
||||||
keyPair *Keypair
|
keypair *Keypair
|
||||||
}
|
}
|
||||||
|
|
||||||
type IndexTable struct {
|
type IndexTable struct {
|
||||||
|
@ -27,34 +23,38 @@ type IndexTable struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func randUint32() (uint32, error) {
|
func randUint32() (uint32, error) {
|
||||||
var buff [4]byte
|
var integer [4]byte
|
||||||
_, err := rand.Read(buff[:])
|
_, err := rand.Read(integer[:])
|
||||||
value := binary.LittleEndian.Uint32(buff[:])
|
return *(*uint32)(unsafe.Pointer(&integer[0])), err
|
||||||
return value, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (table *IndexTable) Init() {
|
func (table *IndexTable) Init() {
|
||||||
table.mutex.Lock()
|
table.mutex.Lock()
|
||||||
|
defer table.mutex.Unlock()
|
||||||
table.table = make(map[uint32]IndexTableEntry)
|
table.table = make(map[uint32]IndexTableEntry)
|
||||||
table.mutex.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (table *IndexTable) Delete(index uint32) {
|
func (table *IndexTable) Delete(index uint32) {
|
||||||
if index == 0 {
|
table.mutex.Lock()
|
||||||
|
defer table.mutex.Unlock()
|
||||||
|
delete(table.table, index)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (table *IndexTable) SwapIndexForKeypair(index uint32, keypair *Keypair) {
|
||||||
|
table.mutex.Lock()
|
||||||
|
defer table.mutex.Unlock()
|
||||||
|
entry, ok := table.table[index]
|
||||||
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
table.mutex.Lock()
|
table.table[index] = IndexTableEntry{
|
||||||
delete(table.table, index)
|
peer: entry.peer,
|
||||||
table.mutex.Unlock()
|
keypair: keypair,
|
||||||
|
handshake: nil,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (table *IndexTable) Insert(key uint32, value IndexTableEntry) {
|
func (table *IndexTable) NewIndexForHandshake(peer *Peer, handshake *Handshake) (uint32, error) {
|
||||||
table.mutex.Lock()
|
|
||||||
table.table[key] = value
|
|
||||||
table.mutex.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (table *IndexTable) NewIndex(peer *Peer) (uint32, error) {
|
|
||||||
for {
|
for {
|
||||||
// generate random index
|
// generate random index
|
||||||
|
|
||||||
|
@ -62,9 +62,6 @@ func (table *IndexTable) NewIndex(peer *Peer) (uint32, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return index, err
|
return index, err
|
||||||
}
|
}
|
||||||
if index == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if index used
|
// check if index used
|
||||||
|
|
||||||
|
@ -75,7 +72,7 @@ func (table *IndexTable) NewIndex(peer *Peer) (uint32, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// map index to handshake
|
// check again while locked
|
||||||
|
|
||||||
table.mutex.Lock()
|
table.mutex.Lock()
|
||||||
_, found := table.table[index]
|
_, found := table.table[index]
|
||||||
|
@ -85,8 +82,8 @@ func (table *IndexTable) NewIndex(peer *Peer) (uint32, error) {
|
||||||
}
|
}
|
||||||
table.table[index] = IndexTableEntry{
|
table.table[index] = IndexTableEntry{
|
||||||
peer: peer,
|
peer: peer,
|
||||||
handshake: &peer.handshake,
|
handshake: handshake,
|
||||||
keyPair: nil,
|
keypair: nil,
|
||||||
}
|
}
|
||||||
table.mutex.Unlock()
|
table.mutex.Unlock()
|
||||||
return index, nil
|
return index, nil
|
|
@ -44,6 +44,6 @@ func (kp *Keypairs) Current() *Keypair {
|
||||||
|
|
||||||
func (device *Device) DeleteKeypair(key *Keypair) {
|
func (device *Device) DeleteKeypair(key *Keypair) {
|
||||||
if key != nil {
|
if key != nil {
|
||||||
device.indices.Delete(key.localIndex)
|
device.indexTable.Delete(key.localIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,7 +161,7 @@ func (device *Device) CreateMessageInitiation(peer *Peer) (*MessageInitiation, e
|
||||||
defer handshake.mutex.Unlock()
|
defer handshake.mutex.Unlock()
|
||||||
|
|
||||||
if isZero(handshake.precomputedStaticStatic[:]) {
|
if isZero(handshake.precomputedStaticStatic[:]) {
|
||||||
return nil, errors.New("Static shared secret is zero")
|
return nil, errors.New("static shared secret is zero")
|
||||||
}
|
}
|
||||||
|
|
||||||
// create ephemeral key
|
// create ephemeral key
|
||||||
|
@ -176,8 +176,8 @@ func (device *Device) CreateMessageInitiation(peer *Peer) (*MessageInitiation, e
|
||||||
|
|
||||||
// assign index
|
// assign index
|
||||||
|
|
||||||
device.indices.Delete(handshake.localIndex)
|
device.indexTable.Delete(handshake.localIndex)
|
||||||
handshake.localIndex, err = device.indices.NewIndex(peer)
|
handshake.localIndex, err = device.indexTable.NewIndexForHandshake(peer, handshake)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -328,14 +328,14 @@ func (device *Device) CreateMessageResponse(peer *Peer) (*MessageResponse, error
|
||||||
defer handshake.mutex.Unlock()
|
defer handshake.mutex.Unlock()
|
||||||
|
|
||||||
if handshake.state != HandshakeInitiationConsumed {
|
if handshake.state != HandshakeInitiationConsumed {
|
||||||
return nil, errors.New("handshake initation must be consumed first")
|
return nil, errors.New("handshake initiation must be consumed first")
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign index
|
// assign index
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
device.indices.Delete(handshake.localIndex)
|
device.indexTable.Delete(handshake.localIndex)
|
||||||
handshake.localIndex, err = device.indices.NewIndex(peer)
|
handshake.localIndex, err = device.indexTable.NewIndexForHandshake(peer, handshake)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -393,9 +393,9 @@ func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookup handshake by reciever
|
// lookup handshake by receiver
|
||||||
|
|
||||||
lookup := device.indices.Lookup(msg.Receiver)
|
lookup := device.indexTable.Lookup(msg.Receiver)
|
||||||
handshake := lookup.handshake
|
handshake := lookup.handshake
|
||||||
if handshake == nil {
|
if handshake == nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -528,35 +528,28 @@ func (peer *Peer) NewKeypair() *Keypair {
|
||||||
|
|
||||||
// create AEAD instances
|
// create AEAD instances
|
||||||
|
|
||||||
keyPair := new(Keypair)
|
keypair := new(Keypair)
|
||||||
keyPair.send, _ = chacha20poly1305.New(sendKey[:])
|
keypair.send, _ = chacha20poly1305.New(sendKey[:])
|
||||||
keyPair.receive, _ = chacha20poly1305.New(recvKey[:])
|
keypair.receive, _ = chacha20poly1305.New(recvKey[:])
|
||||||
|
|
||||||
setZero(sendKey[:])
|
setZero(sendKey[:])
|
||||||
setZero(recvKey[:])
|
setZero(recvKey[:])
|
||||||
|
|
||||||
keyPair.created = time.Now()
|
keypair.created = time.Now()
|
||||||
keyPair.sendNonce = 0
|
keypair.sendNonce = 0
|
||||||
keyPair.replayFilter.Init()
|
keypair.replayFilter.Init()
|
||||||
keyPair.isInitiator = isInitiator
|
keypair.isInitiator = isInitiator
|
||||||
keyPair.localIndex = peer.handshake.localIndex
|
keypair.localIndex = peer.handshake.localIndex
|
||||||
keyPair.remoteIndex = peer.handshake.remoteIndex
|
keypair.remoteIndex = peer.handshake.remoteIndex
|
||||||
|
|
||||||
// remap index
|
// remap index
|
||||||
|
|
||||||
device.indices.Insert(
|
device.indexTable.SwapIndexForKeypair(handshake.localIndex, keypair)
|
||||||
handshake.localIndex,
|
|
||||||
IndexTableEntry{
|
|
||||||
peer: peer,
|
|
||||||
keyPair: keyPair,
|
|
||||||
handshake: nil,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
handshake.localIndex = 0
|
handshake.localIndex = 0
|
||||||
|
|
||||||
// rotate key pairs
|
// rotate key pairs
|
||||||
|
|
||||||
kp := &peer.keyPairs
|
kp := &peer.keypairs
|
||||||
kp.mutex.Lock()
|
kp.mutex.Lock()
|
||||||
|
|
||||||
peer.timersSessionDerived()
|
peer.timersSessionDerived()
|
||||||
|
@ -574,14 +567,14 @@ func (peer *Peer) NewKeypair() *Keypair {
|
||||||
kp.previous = current
|
kp.previous = current
|
||||||
}
|
}
|
||||||
device.DeleteKeypair(previous)
|
device.DeleteKeypair(previous)
|
||||||
kp.current = keyPair
|
kp.current = keypair
|
||||||
} else {
|
} else {
|
||||||
kp.next = keyPair
|
kp.next = keypair
|
||||||
device.DeleteKeypair(next)
|
device.DeleteKeypair(next)
|
||||||
kp.previous = nil
|
kp.previous = nil
|
||||||
device.DeleteKeypair(previous)
|
device.DeleteKeypair(previous)
|
||||||
}
|
}
|
||||||
kp.mutex.Unlock()
|
kp.mutex.Unlock()
|
||||||
|
|
||||||
return keyPair
|
return keypair
|
||||||
}
|
}
|
||||||
|
|
6
peer.go
6
peer.go
|
@ -20,7 +20,7 @@ const (
|
||||||
type Peer struct {
|
type Peer struct {
|
||||||
isRunning AtomicBool
|
isRunning AtomicBool
|
||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
keyPairs Keypairs
|
keypairs Keypairs
|
||||||
handshake Handshake
|
handshake Handshake
|
||||||
device *Device
|
device *Device
|
||||||
endpoint Endpoint
|
endpoint Endpoint
|
||||||
|
@ -234,7 +234,7 @@ func (peer *Peer) Stop() {
|
||||||
|
|
||||||
// clear key pairs
|
// clear key pairs
|
||||||
|
|
||||||
kp := &peer.keyPairs
|
kp := &peer.keypairs
|
||||||
kp.mutex.Lock()
|
kp.mutex.Lock()
|
||||||
|
|
||||||
device.DeleteKeypair(kp.previous)
|
device.DeleteKeypair(kp.previous)
|
||||||
|
@ -250,7 +250,7 @@ func (peer *Peer) Stop() {
|
||||||
|
|
||||||
hs := &peer.handshake
|
hs := &peer.handshake
|
||||||
hs.mutex.Lock()
|
hs.mutex.Lock()
|
||||||
device.indices.Delete(hs.localIndex)
|
device.indexTable.Delete(hs.localIndex)
|
||||||
hs.Clear()
|
hs.Clear()
|
||||||
hs.mutex.Unlock()
|
hs.mutex.Unlock()
|
||||||
|
|
||||||
|
|
24
receive.go
24
receive.go
|
@ -31,7 +31,7 @@ type QueueInboundElement struct {
|
||||||
buffer *[MaxMessageSize]byte
|
buffer *[MaxMessageSize]byte
|
||||||
packet []byte
|
packet []byte
|
||||||
counter uint64
|
counter uint64
|
||||||
keyPair *Keypair
|
keypair *Keypair
|
||||||
endpoint Endpoint
|
endpoint Endpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ func (peer *Peer) keepKeyFreshReceiving() {
|
||||||
if peer.timers.sentLastMinuteHandshake {
|
if peer.timers.sentLastMinuteHandshake {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
kp := peer.keyPairs.Current()
|
kp := peer.keypairs.Current()
|
||||||
if kp != nil && kp.isInitiator && time.Now().Sub(kp.created) > (RejectAfterTime-KeepaliveTimeout-RekeyTimeout) {
|
if kp != nil && kp.isInitiator && time.Now().Sub(kp.created) > (RejectAfterTime-KeepaliveTimeout-RekeyTimeout) {
|
||||||
peer.timers.sentLastMinuteHandshake = true
|
peer.timers.sentLastMinuteHandshake = true
|
||||||
peer.SendHandshakeInitiation(false)
|
peer.SendHandshakeInitiation(false)
|
||||||
|
@ -183,15 +183,15 @@ func (device *Device) RoutineReceiveIncoming(IP int, bind Bind) {
|
||||||
receiver := binary.LittleEndian.Uint32(
|
receiver := binary.LittleEndian.Uint32(
|
||||||
packet[MessageTransportOffsetReceiver:MessageTransportOffsetCounter],
|
packet[MessageTransportOffsetReceiver:MessageTransportOffsetCounter],
|
||||||
)
|
)
|
||||||
value := device.indices.Lookup(receiver)
|
value := device.indexTable.Lookup(receiver)
|
||||||
keyPair := value.keyPair
|
keypair := value.keypair
|
||||||
if keyPair == nil {
|
if keypair == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// check key-pair expiry
|
// check key-pair expiry
|
||||||
|
|
||||||
if keyPair.created.Add(RejectAfterTime).Before(time.Now()) {
|
if keypair.created.Add(RejectAfterTime).Before(time.Now()) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ func (device *Device) RoutineReceiveIncoming(IP int, bind Bind) {
|
||||||
elem := &QueueInboundElement{
|
elem := &QueueInboundElement{
|
||||||
packet: packet,
|
packet: packet,
|
||||||
buffer: buffer,
|
buffer: buffer,
|
||||||
keyPair: keyPair,
|
keypair: keypair,
|
||||||
dropped: AtomicFalse,
|
dropped: AtomicFalse,
|
||||||
endpoint: endpoint,
|
endpoint: endpoint,
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ func (device *Device) RoutineDecryption() {
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
elem.counter = binary.LittleEndian.Uint64(counter)
|
elem.counter = binary.LittleEndian.Uint64(counter)
|
||||||
elem.packet, err = elem.keyPair.receive.Open(
|
elem.packet, err = elem.keypair.receive.Open(
|
||||||
content[:0],
|
content[:0],
|
||||||
nonce[:],
|
nonce[:],
|
||||||
content,
|
content,
|
||||||
|
@ -358,7 +358,7 @@ func (device *Device) RoutineHandshake() {
|
||||||
|
|
||||||
// lookup peer from index
|
// lookup peer from index
|
||||||
|
|
||||||
entry := device.indices.Lookup(reply.Receiver)
|
entry := device.indexTable.Lookup(reply.Receiver)
|
||||||
|
|
||||||
if entry.peer == nil {
|
if entry.peer == nil {
|
||||||
continue
|
continue
|
||||||
|
@ -587,7 +587,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
||||||
|
|
||||||
// check for replay
|
// check for replay
|
||||||
|
|
||||||
if !elem.keyPair.replayFilter.ValidateCounter(elem.counter) {
|
if !elem.keypair.replayFilter.ValidateCounter(elem.counter) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,9 +599,9 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
||||||
|
|
||||||
// check if using new key-pair
|
// check if using new key-pair
|
||||||
|
|
||||||
kp := &peer.keyPairs
|
kp := &peer.keypairs
|
||||||
kp.mutex.Lock() //TODO: make this into an RW lock to reduce contention here for the equality check which is rarely true
|
kp.mutex.Lock() //TODO: make this into an RW lock to reduce contention here for the equality check which is rarely true
|
||||||
if kp.next == elem.keyPair {
|
if kp.next == elem.keypair {
|
||||||
old := kp.previous
|
old := kp.previous
|
||||||
kp.previous = kp.current
|
kp.previous = kp.current
|
||||||
device.DeleteKeypair(old)
|
device.DeleteKeypair(old)
|
||||||
|
|
20
send.go
20
send.go
|
@ -47,7 +47,7 @@ type QueueOutboundElement struct {
|
||||||
buffer *[MaxMessageSize]byte // slice holding the packet data
|
buffer *[MaxMessageSize]byte // slice holding the packet data
|
||||||
packet []byte // slice of "buffer" (always!)
|
packet []byte // slice of "buffer" (always!)
|
||||||
nonce uint64 // nonce for encryption
|
nonce uint64 // nonce for encryption
|
||||||
keyPair *Keypair // key-pair for encryption
|
keypair *Keypair // key-pair for encryption
|
||||||
peer *Peer // related peer
|
peer *Peer // related peer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ func (peer *Peer) SendHandshakeInitiation(isRetry bool) error {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
func (peer *Peer) keepKeyFreshSending() {
|
func (peer *Peer) keepKeyFreshSending() {
|
||||||
kp := peer.keyPairs.Current()
|
kp := peer.keypairs.Current()
|
||||||
if kp == nil {
|
if kp == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ func (peer *Peer) FlushNonceQueue() {
|
||||||
* Obs. A single instance per peer
|
* Obs. A single instance per peer
|
||||||
*/
|
*/
|
||||||
func (peer *Peer) RoutineNonce() {
|
func (peer *Peer) RoutineNonce() {
|
||||||
var keyPair *Keypair
|
var keypair *Keypair
|
||||||
|
|
||||||
device := peer.device
|
device := peer.device
|
||||||
logDebug := device.log.Debug
|
logDebug := device.log.Debug
|
||||||
|
@ -291,9 +291,9 @@ func (peer *Peer) RoutineNonce() {
|
||||||
// wait for key pair
|
// wait for key pair
|
||||||
|
|
||||||
for {
|
for {
|
||||||
keyPair = peer.keyPairs.Current()
|
keypair = peer.keypairs.Current()
|
||||||
if keyPair != nil && keyPair.sendNonce < RejectAfterMessages {
|
if keypair != nil && keypair.sendNonce < RejectAfterMessages {
|
||||||
if time.Now().Sub(keyPair.created) < RejectAfterTime {
|
if time.Now().Sub(keypair.created) < RejectAfterTime {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,12 +328,12 @@ func (peer *Peer) RoutineNonce() {
|
||||||
// populate work element
|
// populate work element
|
||||||
|
|
||||||
elem.peer = peer
|
elem.peer = peer
|
||||||
elem.nonce = atomic.AddUint64(&keyPair.sendNonce, 1) - 1
|
elem.nonce = atomic.AddUint64(&keypair.sendNonce, 1) - 1
|
||||||
// double check in case of race condition added by future code
|
// double check in case of race condition added by future code
|
||||||
if elem.nonce >= RejectAfterMessages {
|
if elem.nonce >= RejectAfterMessages {
|
||||||
goto NextPacket
|
goto NextPacket
|
||||||
}
|
}
|
||||||
elem.keyPair = keyPair
|
elem.keypair = keypair
|
||||||
elem.dropped = AtomicFalse
|
elem.dropped = AtomicFalse
|
||||||
elem.mutex.Lock()
|
elem.mutex.Lock()
|
||||||
|
|
||||||
|
@ -392,7 +392,7 @@ func (device *Device) RoutineEncryption() {
|
||||||
fieldNonce := header[8:16]
|
fieldNonce := header[8:16]
|
||||||
|
|
||||||
binary.LittleEndian.PutUint32(fieldType, MessageTransportType)
|
binary.LittleEndian.PutUint32(fieldType, MessageTransportType)
|
||||||
binary.LittleEndian.PutUint32(fieldReceiver, elem.keyPair.remoteIndex)
|
binary.LittleEndian.PutUint32(fieldReceiver, elem.keypair.remoteIndex)
|
||||||
binary.LittleEndian.PutUint64(fieldNonce, elem.nonce)
|
binary.LittleEndian.PutUint64(fieldNonce, elem.nonce)
|
||||||
|
|
||||||
// pad content to multiple of 16
|
// pad content to multiple of 16
|
||||||
|
@ -408,7 +408,7 @@ func (device *Device) RoutineEncryption() {
|
||||||
// encrypt content and release to consumer
|
// encrypt content and release to consumer
|
||||||
|
|
||||||
binary.LittleEndian.PutUint64(nonce[4:], elem.nonce)
|
binary.LittleEndian.PutUint64(nonce[4:], elem.nonce)
|
||||||
elem.packet = elem.keyPair.send.Seal(
|
elem.packet = elem.keypair.send.Seal(
|
||||||
header,
|
header,
|
||||||
nonce[:],
|
nonce[:],
|
||||||
elem.packet,
|
elem.packet,
|
||||||
|
|
|
@ -108,7 +108,7 @@ func expiredZeroKeyMaterial(peer *Peer) {
|
||||||
hs := &peer.handshake
|
hs := &peer.handshake
|
||||||
hs.mutex.Lock()
|
hs.mutex.Lock()
|
||||||
|
|
||||||
kp := &peer.keyPairs
|
kp := &peer.keypairs
|
||||||
kp.mutex.Lock()
|
kp.mutex.Lock()
|
||||||
|
|
||||||
if kp.previous != nil {
|
if kp.previous != nil {
|
||||||
|
@ -125,7 +125,7 @@ func expiredZeroKeyMaterial(peer *Peer) {
|
||||||
}
|
}
|
||||||
kp.mutex.Unlock()
|
kp.mutex.Unlock()
|
||||||
|
|
||||||
peer.device.indices.Delete(hs.localIndex)
|
peer.device.indexTable.Delete(hs.localIndex)
|
||||||
hs.Clear()
|
hs.Clear()
|
||||||
hs.mutex.Unlock()
|
hs.mutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue