Synchronize legacy UDP crypto setup
This commit is contained in:
committed by
Brandon McGinty
parent
42861dfcd5
commit
fa84373a81
@@ -233,6 +233,8 @@ type cryptState struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cs *cryptState) setup(key, iv []byte) error {
|
func (cs *cryptState) setup(key, iv []byte) error {
|
||||||
|
cs.mu.Lock()
|
||||||
|
defer cs.mu.Unlock()
|
||||||
if len(key) != 16 {
|
if len(key) != 16 {
|
||||||
return errors.New("gumble: crypt key must be 16 bytes")
|
return errors.New("gumble: crypt key must be 16 bytes")
|
||||||
}
|
}
|
||||||
@@ -269,6 +271,8 @@ func (cs *cryptState) nonceForPacket(counter uint32) [12]byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cs *cryptState) encrypt(counter uint32, plaintext []byte) ([]byte, error) {
|
func (cs *cryptState) encrypt(counter uint32, plaintext []byte) ([]byte, error) {
|
||||||
|
cs.mu.Lock()
|
||||||
|
defer cs.mu.Unlock()
|
||||||
if !cs.initialized {
|
if !cs.initialized {
|
||||||
return plaintext, nil
|
return plaintext, nil
|
||||||
}
|
}
|
||||||
@@ -277,6 +281,8 @@ func (cs *cryptState) encrypt(counter uint32, plaintext []byte) ([]byte, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cs *cryptState) decrypt(counter uint32, ciphertext []byte) ([]byte, error) {
|
func (cs *cryptState) decrypt(counter uint32, ciphertext []byte) ([]byte, error) {
|
||||||
|
cs.mu.Lock()
|
||||||
|
defer cs.mu.Unlock()
|
||||||
if !cs.initialized {
|
if !cs.initialized {
|
||||||
return ciphertext, nil
|
return ciphertext, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,34 @@ import (
|
|||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestCryptStateSetupAndEncryptAreConcurrentSafe(t *testing.T) {
|
||||||
|
key := make([]byte, 16)
|
||||||
|
iv := make([]byte, 16)
|
||||||
|
var cs cryptState
|
||||||
|
if err := cs.setup(key, iv); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for i := 0; i < 20; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(counter uint32) {
|
||||||
|
defer wg.Done()
|
||||||
|
if counter%2 == 0 {
|
||||||
|
if err := cs.setup(key, iv); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
} else if _, err := cs.encrypt(counter, []byte("audio")); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}(uint32(i))
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
// TestOCBRoundTrip verifies encrypt-then-decrypt returns the original.
|
// TestOCBRoundTrip verifies encrypt-then-decrypt returns the original.
|
||||||
func TestOCBRoundTrip(t *testing.T) {
|
func TestOCBRoundTrip(t *testing.T) {
|
||||||
key := make([]byte, 16)
|
key := make([]byte, 16)
|
||||||
|
|||||||
Reference in New Issue
Block a user