might actually happen?
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
89
internal/outpost/radius/eap/packet.go
Normal file
89
internal/outpost/radius/eap/packet.go
Normal file
@ -0,0 +1,89 @@
|
||||
package eap
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"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:]
|
||||
fmt.Printf("decode raw '% x\n", raw[5:])
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user