147 lines
4.5 KiB
Go
147 lines
4.5 KiB
Go
package netproto
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
)
|
|
|
|
type MainHeader struct {
|
|
Version uint8 `json:"version"`
|
|
Meta map[string]string `json:"meta"`
|
|
ExtensionHeaders []ExtensionHeader `json:"extension_headers"`
|
|
}
|
|
|
|
const (
|
|
MainHeaderVersion1 = 1
|
|
)
|
|
|
|
const (
|
|
ExtensionHeaderType_Source uint8 = 1 /* https://git.send.nrw/sendnrw/sendnrwlib/issues/1 */
|
|
ExtensionHeaderType_Destination uint8 = 2 /* https://git.send.nrw/sendnrw/sendnrwlib/issues/1 */
|
|
ExtensionHeaderType_PayloadDefinition uint8 = 3
|
|
ExtensionHeaderType_Protocol uint8 = 4
|
|
ExtensionHeaderType_Control uint8 = 5 /*Syn/SynAck/Ack/AckFin/Fin*/
|
|
ExtensionHeaderType_Crypto uint8 = 6 /*Hinweis auf eine Verschlüsselung*/
|
|
ExtensionHeaderType_Validation uint8 = 7 /*Hinweis auf eine Validierung oder Checksum*/
|
|
ExtensionHeaderType_Routing uint8 = 8 /*Hinweis auf eine Routing-Information*/
|
|
)
|
|
|
|
const (
|
|
ControlFlag_Flow_SYN string = "SYN"
|
|
ControlFlag_Flow_SYNACK string = "SYNACK"
|
|
ControlFlag_Flow_ACK string = "ACK"
|
|
ControlFlag_Flow_ACKFIN string = "ACKFIN"
|
|
ControlFlag_Flow_FIN string = "FIN"
|
|
ControlFlag_Encryption_INSECURE string = "INSECURE"
|
|
ControlFlag_Encryption_STAYINSECURE string = "STAYINSECURE"
|
|
ControlFlag_Encryption_SECURESTART string = "SECURESTART"
|
|
ControlFlag_Encryption_SECUREACCEPT string = "SECUREACCEPT"
|
|
ControlFlag_Encryption_SECUREFAIL string = "SECUREFAIL"
|
|
)
|
|
|
|
func GenerateEHT1(IPv4, IPv6, Port string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Source,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"ipv4": IPv4, "ipv6": IPv6, "port": Port},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT2(IPv4, IPv6, Port string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Destination,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"ipv4": IPv4, "ipv6": IPv6, "port": Port},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT3(PayloadMime, PayloadLength, PayloadChecksum string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_PayloadDefinition,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"payloadmime": PayloadMime, "payloadlength": PayloadLength, "payloadchecksum": PayloadChecksum},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT4(ProtocolName, ProtocolVersion, ProtocolOID string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Protocol,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"protocolname": ProtocolName, "protocolversion": ProtocolVersion, "protocoloid": ProtocolOID},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT5(ControlFlagFlow, ControlFlagEncryption string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Control,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"controlflagflow": ControlFlagFlow, "controlflagencryption": ControlFlagEncryption},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT6(PublicKey string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Crypto,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"publickey": PublicKey},
|
|
}
|
|
}
|
|
|
|
func GenerateEHT7(Checksum string) ExtensionHeader {
|
|
return ExtensionHeader{
|
|
Type: ExtensionHeaderType_Validation,
|
|
Meta: map[string]string{"version": "1.0"},
|
|
Data: map[string]string{"checksum": Checksum},
|
|
}
|
|
}
|
|
|
|
func GenerateMainHeader(Version uint8, Flag string, ExH ...ExtensionHeader) MainHeader {
|
|
return MainHeader{
|
|
Version: Version,
|
|
Meta: map[string]string{"version": "1.0", "flag": Flag},
|
|
ExtensionHeaders: ExH,
|
|
}
|
|
}
|
|
|
|
func GenerateNetworkProtocol(mainheader MainHeader, payload string) NetworkProtocol {
|
|
return NetworkProtocol{
|
|
Header: mainheader,
|
|
Payload: payload,
|
|
}
|
|
}
|
|
|
|
func EncodeBase64(input string) (string, error) {
|
|
return base64.StdEncoding.EncodeToString([]byte(input)), nil
|
|
}
|
|
|
|
func DecodeBase64(input string) (string, error) {
|
|
d, err := base64.StdEncoding.DecodeString(input)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(d), nil
|
|
}
|
|
|
|
func ToJSON(input interface{}) (string, error) {
|
|
b, err := json.Marshal(input)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(b), nil
|
|
}
|
|
|
|
func FromJSON(input string, output interface{}) error {
|
|
return json.Unmarshal([]byte(input), output)
|
|
}
|
|
|
|
type ExtensionHeader struct {
|
|
Type uint8 `json:"type"`
|
|
Meta map[string]string `json:"meta"`
|
|
Data map[string]string `json:"data"`
|
|
}
|
|
|
|
type NetworkProtocol struct {
|
|
Header MainHeader `json:"header"`
|
|
Payload string `json:"payload"`
|
|
}
|