Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
1.5 KB go
/* 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)])
}