/* SPDX-License-Identifier: MIT
*
* Phobos
*/
package phobos
import (
"encoding/binary"
"golang.zx2c4.com/wireguard/windows/phobos/cobf"
)
const (
TypeHandshake = 1
TypeHandshakeResponse = 2
TypeCookie = 3
TypeData = 4
DefaultMaxDummy = 4
MediaObfuscateBytesDefault = 16
BufferSize = 65535
)
func PacketType(buf []byte) uint32 {
return binary.LittleEndian.Uint32(buf[:4])
}
func IsKnownPacketType(t uint32) bool {
return t >= TypeHandshake && t <= TypeData
}
// Obfuscator applies the Phobos wire protocol to WireGuard packets. The
// protocol itself lives in the shared C sources under src/phobos-obfuscator,
// reached through package cobf -- this type is a binding, not a second
// implementation.
type Obfuscator struct {
key []byte
}
func NewObfuscator(key []byte) *Obfuscator {
return &Obfuscator{key: key}
}
func (o *Obfuscator) Encode(buf []byte, length, maxDummyData, obfuscateBytes int) int {
if length < 4 {
return -1
}
return cobf.Encode(buf, length, o.key, maxDummyData, obfuscateBytes)
}
func (o *Obfuscator) Decode(buf []byte, length, obfuscateBytes int) int {
if length < 4 {
return -1
}
n, _ := cobf.Decode(buf, length, o.key, obfuscateBytes)
return n
}
func (o *Obfuscator) xorData(buf []byte) {
cobf.XOR(buf, len(buf), o.key)
}