From 1e532c1e71f36e9cc1ce0fa7df2f8447a1d08f02 Mon Sep 17 00:00:00 2001
From: Mark Puha
Date: Sun, 9 Feb 2025 18:26:57 +0100
Subject: [PATCH] awg-2 working with identity generator
---
adapter/lua.go | 1 +
adapter/lua_test.go | 6 +++---
device/device.go | 14 +++++++++++++-
device/device_test.go | 9 ++++++---
device/receive.go | 29 +++++++++++++++++++++++++++--
device/send.go | 17 ++++-------------
6 files changed, 54 insertions(+), 22 deletions(-)
diff --git a/adapter/lua.go b/adapter/lua.go
index 371878d..838ff84 100644
--- a/adapter/lua.go
+++ b/adapter/lua.go
@@ -69,6 +69,7 @@ func (l *Lua) Parse(data []byte) ([]byte, error) {
result := l.state.ToBytes(-1)
l.state.Pop(1)
+ // copy(data, result)
return result, nil
}
diff --git a/adapter/lua_test.go b/adapter/lua_test.go
index c7027d0..1a3d039 100644
--- a/adapter/lua_test.go
+++ b/adapter/lua_test.go
@@ -13,11 +13,11 @@ func newLua() *Lua {
end
function d_parse(data)
- local header = "10header"
+ local header = "1header"
return string.sub(data, #header+1)
end
*/
- Base64LuaCode: "CmZ1bmN0aW9uIGRfZ2VuKG1zZ190eXBlLCBkYXRhLCBjb3VudGVyKQoJbG9jYWwgaGVhZGVyID0gImhlYWRlciIKCXJldHVybiBjb3VudGVyIC4uIGhlYWRlciAuLiBkYXRhCmVuZAoKZnVuY3Rpb24gZF9wYXJzZShkYXRhKQoJbG9jYWwgaGVhZGVyID0gIjEwaGVhZGVyIgoJcmV0dXJuIHN0cmluZy5zdWIoZGF0YSwgI2hlYWRlcisxKQplbmQK",
+ Base64LuaCode: "CmZ1bmN0aW9uIGRfZ2VuKG1zZ190eXBlLCBkYXRhLCBjb3VudGVyKQoJbG9jYWwgaGVhZGVyID0gImhlYWRlciIKCXJldHVybiBjb3VudGVyIC4uIGhlYWRlciAuLiBkYXRhCmVuZAoKZnVuY3Rpb24gZF9wYXJzZShkYXRhKQoJbG9jYWwgaGVhZGVyID0gIjFoZWFkZXIiCglyZXR1cm4gc3RyaW5nLnN1YihkYXRhLCAjaGVhZGVyKzEpCmVuZAo=",
})
return lua
}
@@ -47,7 +47,7 @@ func TestLua_Parse(t *testing.T) {
t.Run("", func(t *testing.T) {
l := newLua()
defer l.Close()
- got, err := l.Parse([]byte("10headertest"))
+ got, err := l.Parse([]byte("1headertest"))
if err != nil {
t.Errorf("Lua.Parse() error = %v, wantErr %v", err, nil)
return
diff --git a/device/device.go b/device/device.go
index b42ddc0..b16b460 100644
--- a/device/device.go
+++ b/device/device.go
@@ -92,7 +92,7 @@ type Device struct {
ipcMutex sync.RWMutex
closed chan struct{}
log *Logger
-
+
awg awgType
}
@@ -833,3 +833,15 @@ func (device *Device) handlePostConfig(tempAwgType *awgType) (err error) {
return err
}
+
+func (device *Device) codecPacket(msgType uint32, packet []byte) ([]byte, error) {
+ if device.awg.luaAdapter != nil {
+ var err error
+ packet, err = device.awg.luaAdapter.Generate(int64(msgType),packet)
+ if err != nil {
+ device.log.Errorf("%v - Failed to run codec generate: %v", device, err)
+ return nil, err
+ }
+ }
+ return packet, nil
+}
diff --git a/device/device_test.go b/device/device_test.go
index e904f26..63f20df 100644
--- a/device/device_test.go
+++ b/device/device_test.go
@@ -107,6 +107,7 @@ func genASecurityConfigs(tb testing.TB) (cfgs, endpointCfgs [2]string) {
"private_key", hex.EncodeToString(key1[:]),
"listen_port", "0",
"replace_peers", "true",
+ "lua_codec", "CQkJZnVuY3Rpb24gZF9nZW4obXNnX3R5cGUsIGRhdGEsIGNvdW50ZXIpCgkJCQlyZXR1cm4gZGF0YQoJCQllbmQKCgkJCWZ1bmN0aW9uIGRfcGFyc2UoZGF0YSkKCQkJCXJldHVybiBkYXRhCgkJCWVuZAo=",
"jc", "5",
"jmin", "500",
"jmax", "1000",
@@ -114,8 +115,8 @@ func genASecurityConfigs(tb testing.TB) (cfgs, endpointCfgs [2]string) {
"s2", "40",
"h1", "123456",
"h2", "67543",
- "h4", "32345",
"h3", "123123",
+ "h4", "32345",
"public_key", hex.EncodeToString(pub2[:]),
"protocol_version", "1",
"replace_allowed_ips", "true",
@@ -129,6 +130,7 @@ func genASecurityConfigs(tb testing.TB) (cfgs, endpointCfgs [2]string) {
"private_key", hex.EncodeToString(key2[:]),
"listen_port", "0",
"replace_peers", "true",
+ "lua_codec", "CQkJZnVuY3Rpb24gZF9nZW4obXNnX3R5cGUsIGRhdGEsIGNvdW50ZXIpCgkJCQlyZXR1cm4gZGF0YQoJCQllbmQKCgkJCWZ1bmN0aW9uIGRfcGFyc2UoZGF0YSkKCQkJCXJldHVybiBkYXRhCgkJCWVuZAo=",
"jc", "5",
"jmin", "500",
"jmax", "1000",
@@ -136,8 +138,8 @@ func genASecurityConfigs(tb testing.TB) (cfgs, endpointCfgs [2]string) {
"s2", "40",
"h1", "123456",
"h2", "67543",
- "h4", "32345",
"h3", "123123",
+ "h4", "32345",
"public_key", hex.EncodeToString(pub1[:]),
"protocol_version", "1",
"replace_allowed_ips", "true",
@@ -192,6 +194,7 @@ func (pair *testPair) Send(
var err error
select {
case msgRecv := <-p0.tun.Inbound:
+ fmt.Printf("len(%d) msg: %x\nlen(%d) rec: %x\n", len(msg), msg, len(msgRecv), msgRecv)
if !bytes.Equal(msg, msgRecv) {
err = fmt.Errorf("%s did not transit correctly", ping)
}
@@ -275,7 +278,7 @@ func TestTwoDevicePing(t *testing.T) {
}
// Run test with -race=false to avoid the race for setting the default msgTypes 2 times
-func TestTwoDevicePingASecurity(t *testing.T) {
+func TestASecurityTwoDevicePing(t *testing.T) {
goroutineLeakCheck(t)
pair := genTestPair(t, true, true)
t.Run("ping 1.0.0.1", func(t *testing.T) {
diff --git a/device/receive.go b/device/receive.go
index 70801ef..f8551ae 100644
--- a/device/receive.go
+++ b/device/receive.go
@@ -9,9 +9,11 @@ import (
"bytes"
"encoding/binary"
"errors"
+ "fmt"
"net"
"sync"
"time"
+ "unsafe"
"github.com/amnezia-vpn/amneziawg-go/conn"
"golang.org/x/crypto/chacha20poly1305"
@@ -138,8 +140,24 @@ func (device *Device) RoutineReceiveIncoming(
// check size of packet
packet := bufsArrs[i][:size]
+ fmt.Printf("bufsArrs size: %d\n%.100x\n", size, bufsArrs[i])
+ fmt.Printf("packet before: %x\n", packet)
if device.awg.luaAdapter != nil {
- packet, err = device.awg.luaAdapter.Parse(packet)
+ ptr:= unsafe.Pointer(bufsArrs[i]) // Get pointer to the array
+ slicePtr:= (*byte)(ptr) // Type conversion to the array type
+
+ realPacket, err := device.awg.luaAdapter.Parse(packet)
+ // Copy data from newSlice to the memory pointed to by slicedPtr
+ newSliceLen:= len(realPacket)
+ for j:= 0; j < newSliceLen; j++ {
+ *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(slicePtr)) + uintptr(j))) = realPacket[j]
+ }
+ fmt.Printf("packet after: %x\n", packet)
+ fmt.Printf("bufsArs after size: %d\n%.100x\n", size, bufsArrs[i])
+ // diff := size - len(packet)
+ // bufsArrs[i][:len(packet)] = bufsArrs[i][diff:len(packet)]
+ size = len(packet)
+ fmt.Println("after size: ", size)
if err != nil {
device.log.Verbosef("Couldn't parse message; reason: %v", err)
continue
@@ -151,7 +169,7 @@ func (device *Device) RoutineReceiveIncoming(
junkSize := msgTypeToJunkSize[assumedMsgType]
// transport size can align with other header types;
// making sure we have the right msgType
- msgType = binary.LittleEndian.Uint32(packet[junkSize : junkSize+4])
+ msgType = binary.LittleEndian.Uint32(packet[junkSize:junkSize+4])
if msgType == assumedMsgType {
packet = packet[junkSize:]
} else {
@@ -285,15 +303,18 @@ func (device *Device) RoutineDecryption(id int) {
elem.counter = binary.LittleEndian.Uint64(counter)
// copy counter to nonce
binary.LittleEndian.PutUint64(nonce[0x4:0xc], elem.counter)
+ fmt.Printf("before decrypt: %x\n", elem.packet)
elem.packet, err = elem.keypair.receive.Open(
content[:0],
nonce[:],
content,
nil,
)
+
if err != nil {
elem.packet = nil
}
+ fmt.Printf("decrypt: %x\n", elem.packet)
}
elemsContainer.Unlock()
}
@@ -551,10 +572,13 @@ func (peer *Peer) RoutineSequentialReceiver(maxBatchSize int) {
continue
}
+ fmt.Printf("bufs packet: %x\n", elem.packet)
+ fmt.Printf("bufs packet: %x\n", elem.buffer[len(elem.packet)+1:MessageTransportOffsetContent+len(elem.packet)])
bufs = append(
bufs,
elem.buffer[:MessageTransportOffsetContent+len(elem.packet)],
)
+ fmt.Printf("bufs before send: %.100x\n", elem.buffer)
}
peer.rxBytes.Add(rxBytesLen)
@@ -568,6 +592,7 @@ func (peer *Peer) RoutineSequentialReceiver(maxBatchSize int) {
peer.timersDataReceived()
}
if len(bufs) > 0 {
+ fmt.Printf("bufs: %x\n", bufs)
_, err := device.tun.device.Write(bufs, MessageTransportOffsetContent)
if err != nil && !device.isClosed() {
device.log.Errorf("Failed to write packets to TUN device: %v", err)
diff --git a/device/send.go b/device/send.go
index 297f19e..85ad169 100644
--- a/device/send.go
+++ b/device/send.go
@@ -9,6 +9,7 @@ import (
"bytes"
"encoding/binary"
"errors"
+ "fmt"
"net"
"os"
"sync"
@@ -547,18 +548,6 @@ func calculatePaddingSize(packetSize, mtu int) int {
return paddedSize - lastUnit
}
-func (device *Device) codecPacket(msgType uint32, packet []byte) ([]byte, error) {
- if device.awg.luaAdapter != nil {
- var err error
- packet, err = device.awg.luaAdapter.Generate(int64(msgType),packet)
- if err != nil {
- device.log.Errorf("%v - Failed to run codec generate: %v", device, err)
- return nil, err
- }
- }
- return packet, nil
-}
-
/* Encrypts the elements in the queue
* and marks them for sequential consumption (by releasing the mutex)
*
@@ -603,11 +592,12 @@ func (device *Device) RoutineEncryption(id int) {
elem.packet,
nil,
)
-
+ fmt.Printf("msg: %x\n", elem.packet)
var err error
if elem.packet, err = device.codecPacket(DefaultMessageTransportType, elem.packet); err != nil {
continue
}
+ fmt.Printf("msgmsg: %x\n", elem.packet)
}
elemsContainer.Unlock()
}
@@ -662,6 +652,7 @@ func (peer *Peer) RoutineSequentialSender(maxBatchSize int) {
peer.timersDataSent()
}
for _, elem := range elemsContainer.elems {
+ fmt.Printf("send buffer: %.200x\n", elem.buffer)
device.PutMessageBuffer(elem.buffer)
device.PutOutboundElement(elem)
}