57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
package protocol
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateKeyNonce(t *testing.T) {
|
|
// Vectors from ts3j EncryptionTest.java
|
|
ivStructBase64 := "/rn6nR71hV8eFl+15WO68fRU8pOCBw3t0FmcG5c7WNxIkeZ1NtaWTVMBde0cdU5tTKwOl8sE6gpHjnCEF4hhDw=="
|
|
expectedKeyBase64 := "BF+lO776+e45u+qYAOHihg=="
|
|
expectedNonceBase64 := "1IVcTMuizpDHjQgn2yGCgg=="
|
|
|
|
ivStruct, _ := base64.StdEncoding.DecodeString(ivStructBase64)
|
|
expectedKey, _ := base64.StdEncoding.DecodeString(expectedKeyBase64)
|
|
expectedNonce, _ := base64.StdEncoding.DecodeString(expectedNonceBase64)
|
|
|
|
// CryptoState setup
|
|
crypto := &CryptoState{
|
|
SharedIV: ivStruct,
|
|
GenerationID: 0,
|
|
}
|
|
|
|
// Packet Header setup
|
|
// Packet ID = 1
|
|
// Type = COMMAND (2)
|
|
// Flags = NEW_PROTOCOL (0x20)
|
|
// Type in Header struct contains (Type | Flags)
|
|
// byte(2) | byte(0x20) = 0x22
|
|
|
|
header := &PacketHeader{
|
|
PacketID: 1,
|
|
Type: uint8(PacketTypeCommand) | PacketFlagNewProtocol,
|
|
}
|
|
// Note: PacketTypeCommand is 0x02. PacketFlagNewProtocol is 0x20.
|
|
// Header.Type is uint8.
|
|
|
|
// Generate (Client -> Server = true)
|
|
// ts3j test uses ProtocolRole.CLIENT which maps to 0x31 for temporaryByteBuffer?
|
|
// PacketTransformation.java: (header.getRole() == ProtocolRole.SERVER ? 0x30 : 0x31)
|
|
// If EncryptionTest creates Packet(ProtocolRole.CLIENT), then header role is CLIENT.
|
|
// So byte is 0x31.
|
|
// In my crypto.go, GenerateKeyNonce(..., isClientToServer bool).
|
|
// If client sends, isClientToServer should be true. (maps to 0x31).
|
|
|
|
key, nonce := crypto.GenerateKeyNonce(header, true)
|
|
|
|
if !reflect.DeepEqual(key, expectedKey) {
|
|
t.Errorf("Key mismatch.\nGot: %x\nWant: %x", key, expectedKey)
|
|
}
|
|
|
|
if !reflect.DeepEqual(nonce, expectedNonce) {
|
|
t.Errorf("Nonce mismatch.\nGot: %x\nWant: %x", nonce, expectedNonce)
|
|
}
|
|
}
|