Files
authentik/internal/outpost/radius/eap/packet.go
Jens Langhammer ad57c66a32 better log
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-07-01 22:42:54 +02:00

91 lines
1.8 KiB
Go

package eap
import (
"encoding/binary"
"errors"
"github.com/sirupsen/logrus"
"goauthentik.io/internal/outpost/radius/eap/debug"
"goauthentik.io/internal/outpost/radius/eap/tls"
)
type Code uint8
const (
CodeRequest Code = 1
CodeResponse Code = 2
)
type Type uint8
const (
TypeIdentity Type = 1
TypeMD5Challenge Type = 4
TypeTLS Type = 13
)
type Packet struct {
code Code
id uint8
length uint16
msgType Type
rawPayload []byte
Payload Payload
}
type Payload interface {
Decode(raw []byte) error
Encode() ([]byte, error)
}
type PayloadWriter struct{}
func emptyPayload(t Type) Payload {
switch t {
case TypeIdentity:
return &IdentityPayload{}
case TypeTLS:
return &tls.Payload{}
}
return nil
}
func Decode(raw []byte) (*Packet, error) {
packet := &Packet{}
packet.code = Code(raw[0])
packet.id = raw[1]
packet.length = binary.BigEndian.Uint16(raw[2:])
if packet.length != uint16(len(raw)) {
return nil, errors.New("mismatched packet length")
}
if len(raw) > 4 && (packet.code == CodeRequest || packet.code == CodeResponse) {
packet.msgType = Type(raw[4])
}
packet.Payload = emptyPayload(packet.msgType)
packet.rawPayload = raw[5:]
logrus.WithField("raw", debug.FormatBytes(raw[5:])).Debug("EAP decode raw")
err := packet.Payload.Decode(raw[5:])
if err != nil {
return nil, err
}
return packet, nil
}
func (p *Packet) Encode() ([]byte, error) {
buff := make([]byte, 5)
buff[0] = uint8(p.code)
buff[1] = uint8(p.id)
payloadBuffer, err := p.Payload.Encode()
if err != nil {
return buff, err
}
binary.BigEndian.PutUint16(buff[2:], uint16(len(payloadBuffer)+5))
if p.code == CodeRequest || p.code == CodeResponse {
buff[4] = uint8(p.msgType)
}
buff = append(buff, payloadBuffer...)
return buff, nil
}