/* SPDX-License-Identifier: MIT * * Phobos */ package phobos import ( "net/netip" "strings" "time" ) type Masking int const ( MaskingNone Masking = iota MaskingSTUN MaskingMEDIA MaskingTLS ) var maskingNames = map[Masking]string{ MaskingNone: "none", MaskingSTUN: "STUN", MaskingMEDIA: "MEDIA", MaskingTLS: "TLS", } func (m Masking) String() string { if name, ok := maskingNames[m]; ok { return name } return maskingNames[MaskingNone] } func ParseMasking(value string) (Masking, bool) { switch strings.ToLower(strings.TrimSpace(value)) { case "", "none", "off": return MaskingNone, true case "stun": return MaskingSTUN, true case "media": return MaskingMEDIA, true case "tls": return MaskingTLS, true } return MaskingNone, false } type MediaParams struct { PayloadType uint8 SSRC uint32 TimestampStep uint16 } type SendFunc func(p []byte) (int, error) type Masker interface { TimerInterval() time.Duration OnHandshakeRequest(sendForward SendFunc) OnDataUnwrap(buf []byte, length int, src netip.AddrPort, sendBack SendFunc) int OnDataWrap(buf []byte, length int) int OnTimer(sendToServer SendFunc) } func NewMasker(masking Masking, media MediaParams) Masker { switch masking { case MaskingSTUN: return &maskerSTUN{rng: newRNG32()} case MaskingMEDIA: return &maskerMedia{rng: newRNG32(), params: media} } return nil } func sendBindingRequest(send SendFunc, rng *rng32) { var buf [stunBindingReqSize]byte send(buf[:stunBuildBindingRequest(buf[:], rng)]) }