mirror of
https://github.com/amnezia-vpn/amneziawg-go.git
synced 2025-07-30 08:32:50 +02:00
feat: working ranged magic headers
This commit is contained in:
parent
2749e6b043
commit
c38c3ed54f
7 changed files with 29 additions and 15 deletions
|
@ -665,6 +665,7 @@ func (device *Device) handlePostConfig(tempAwg *awg.Protocol) error {
|
|||
if tempAwg.ASecCfg.ResponsePacketMagicHeader.Min > 4 {
|
||||
isASecOn = true
|
||||
device.log.Verbosef("UAPI: Updating response_packet_magic_header")
|
||||
device.awg.ASecCfg.ResponsePacketMagicHeader = tempAwg.ASecCfg.ResponsePacketMagicHeader
|
||||
MessageResponseType = device.awg.ASecCfg.ResponsePacketMagicHeader.Min
|
||||
limits[1] = tempAwg.ASecCfg.ResponsePacketMagicHeader
|
||||
} else {
|
||||
|
@ -690,7 +691,7 @@ func (device *Device) handlePostConfig(tempAwg *awg.Protocol) error {
|
|||
device.log.Verbosef("UAPI: Updating transport_packet_magic_header")
|
||||
device.awg.ASecCfg.TransportPacketMagicHeader = tempAwg.ASecCfg.TransportPacketMagicHeader
|
||||
MessageTransportType = device.awg.ASecCfg.TransportPacketMagicHeader.Min
|
||||
limits[3] = tempAwg.ASecCfg.UnderloadPacketMagicHeader
|
||||
limits[3] = tempAwg.ASecCfg.TransportPacketMagicHeader
|
||||
} else {
|
||||
device.log.Verbosef("UAPI: Using default transport type")
|
||||
MessageTransportType = DefaultMessageTransportType
|
||||
|
@ -704,6 +705,8 @@ func (device *Device) handlePostConfig(tempAwg *awg.Protocol) error {
|
|||
MessageTransportType: {},
|
||||
}
|
||||
|
||||
device.awg.MagicHeaders = awg.NewLimits(limits)
|
||||
|
||||
// size will be different if same values
|
||||
if len(isSameHeaderMap) != 4 {
|
||||
errs = append(errs, ipcErrorf(
|
||||
|
@ -717,8 +720,6 @@ func (device *Device) handlePostConfig(tempAwg *awg.Protocol) error {
|
|||
)
|
||||
}
|
||||
|
||||
device.awg.MagicHeaders = awg.NewLimits(limits)
|
||||
|
||||
newInitSize := MessageInitiationSize + tempAwg.ASecCfg.InitHeaderJunkSize
|
||||
|
||||
if newInitSize >= MaxSegmentSize {
|
||||
|
@ -846,8 +847,6 @@ func (device *Device) handlePostConfig(tempAwg *awg.Protocol) error {
|
|||
return errors.Join(errs...)
|
||||
}
|
||||
|
||||
var ErrContinueLoop = errors.New("continue processing")
|
||||
|
||||
func (device *Device) Logic(size int, packet *[]byte, bufsArrs *[MaxMessageSize]byte) (msgType uint32, err error) {
|
||||
// TODO:
|
||||
// if awg.WaitResponse.ShouldWait.IsSet() {
|
||||
|
@ -860,6 +859,9 @@ func (device *Device) Logic(size int, packet *[]byte, bufsArrs *[MaxMessageSize]
|
|||
}
|
||||
|
||||
junkSize := msgTypeToJunkSize[assumedMsgType]
|
||||
fmt.Println(msgTypeToJunkSize)
|
||||
fmt.Printf("Assumed message type: %d; size: %d", assumedMsgType, junkSize)
|
||||
|
||||
// transport size can align with other header types;
|
||||
// making sure we have the right msgType
|
||||
msgType, err = device.getMsgType(packet, junkSize)
|
||||
|
@ -877,10 +879,11 @@ func (device *Device) Logic(size int, packet *[]byte, bufsArrs *[MaxMessageSize]
|
|||
}
|
||||
|
||||
func (device *Device) getMsgType(packet *[]byte, junkSize int) (uint32, error) {
|
||||
msgType := binary.LittleEndian.Uint32((*packet)[junkSize : junkSize+4])
|
||||
msgType, err := device.awg.GetLimitMin(msgType)
|
||||
msgTypeRange := binary.LittleEndian.Uint32((*packet)[junkSize : junkSize+4])
|
||||
msgType, err := device.awg.GetLimitMin(msgTypeRange)
|
||||
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("aSec: get limit min for message type %d: %w", msgType, err)
|
||||
return 0, fmt.Errorf("aSec: get limit min for message type range: %d; %w", msgTypeRange, err)
|
||||
}
|
||||
return msgType, nil
|
||||
}
|
||||
|
@ -890,7 +893,7 @@ func (device *Device) handleTransport(size int, packet *[]byte, bufsArrs *[MaxMe
|
|||
|
||||
msgType, err := device.getMsgType(packet, device.awg.ASecCfg.TransportHeaderJunkSize)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("aSec: get msg type: %w", err)
|
||||
return 0, fmt.Errorf("get msg type: %w", err)
|
||||
}
|
||||
|
||||
if msgType != MessageTransportType {
|
||||
|
|
|
@ -236,10 +236,10 @@ func TestAWGDevicePing(t *testing.T) {
|
|||
"s2", "18",
|
||||
"s3", "20",
|
||||
"s4", "25",
|
||||
"h1", "123456",
|
||||
"h2", "67543",
|
||||
"h3", "123123",
|
||||
"h4", "32345",
|
||||
"h1", "123456-123500",
|
||||
"h2", "67543-67550",
|
||||
"h3", "123123-123200",
|
||||
"h4", "32345-32350",
|
||||
)
|
||||
t.Run("ping 1.0.0.1", func(t *testing.T) {
|
||||
pair.Send(t, Ping, nil)
|
||||
|
|
|
@ -271,6 +271,7 @@ func (device *Device) ConsumeMessageInitiation(msg *MessageInitiation) *Peer {
|
|||
)
|
||||
|
||||
device.awg.ASecMux.RLock()
|
||||
|
||||
if msg.Type != MessageInitiationType {
|
||||
device.awg.ASecMux.RUnlock()
|
||||
return nil
|
||||
|
@ -448,6 +449,7 @@ func (device *Device) CreateMessageResponse(peer *Peer) (*MessageResponse, error
|
|||
|
||||
func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
|
||||
device.awg.ASecMux.RLock()
|
||||
|
||||
if msg.Type != MessageResponseType {
|
||||
device.awg.ASecMux.RUnlock()
|
||||
return nil
|
||||
|
|
|
@ -142,7 +142,7 @@ func (device *Device) RoutineReceiveIncoming(
|
|||
if device.isAWG() {
|
||||
msgType, err = device.Logic(size, &packet, bufsArrs[i])
|
||||
if err != nil {
|
||||
device.log.Verbosef("awg device logic: %w", err)
|
||||
device.log.Verbosef("awg device logic: %v", err)
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
|
@ -378,6 +378,9 @@ func (device *Device) RoutineHandshake(id int) {
|
|||
goto skip
|
||||
}
|
||||
|
||||
// have to reassign msgType for ranged msgType to work
|
||||
msg.Type = elem.msgType
|
||||
|
||||
// consume initiation
|
||||
peer := device.ConsumeMessageInitiation(&msg)
|
||||
if peer == nil {
|
||||
|
@ -410,6 +413,9 @@ func (device *Device) RoutineHandshake(id int) {
|
|||
goto skip
|
||||
}
|
||||
|
||||
// have to reassign msgType for ranged msgType to work
|
||||
msg.Type = elem.msgType
|
||||
|
||||
// consume response
|
||||
|
||||
peer := device.ConsumeMessageResponse(&msg)
|
||||
|
|
|
@ -537,7 +537,7 @@ func (device *Device) RoutineEncryption(id int) {
|
|||
|
||||
msgType, err := device.awg.Get(DefaultMessageTransportType)
|
||||
if err != nil {
|
||||
device.log.Errorf("Get message type for transport: %v", err)
|
||||
device.log.Errorf("get message type for transport: %v", err)
|
||||
continue
|
||||
}
|
||||
binary.LittleEndian.PutUint32(fieldType, msgType)
|
||||
|
|
1
go.mod
1
go.mod
|
@ -7,6 +7,7 @@ require (
|
|||
github.com/tevino/abool v1.2.0
|
||||
go.uber.org/atomic v1.11.0
|
||||
golang.org/x/crypto v0.36.0
|
||||
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090
|
||||
golang.org/x/net v0.37.0
|
||||
golang.org/x/sys v0.31.0
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2
|
||||
|
|
2
go.sum
2
go.sum
|
@ -14,6 +14,8 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
|||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY=
|
||||
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||
|
|
Loading…
Add table
Reference in a new issue