mirror of
https://github.com/DNSCrypt/dnscrypt-proxy.git
synced 2025-03-04 10:24:40 +01:00
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
![]() |
package main
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type CryptoConstruction uint16
|
||
|
|
||
|
const (
|
||
|
UndefinedConstruction CryptoConstruction = iota
|
||
|
XSalsa20Poly1305
|
||
|
XChacha20Poly1305
|
||
|
)
|
||
|
|
||
|
type ServerParams struct {
|
||
|
CertInfo CertInfo
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
CertMagic = [4]byte{0x44, 0x4e, 0x53, 0x43}
|
||
|
ServerMagic = [8]byte{0x72, 0x36, 0x66, 0x6e, 0x76, 0x57, 0x6a, 0x38}
|
||
|
MinDNSPacketSize = uint(12)
|
||
|
MaxDNSPacketSize = uint(4096)
|
||
|
InitialMinQuestionSize = uint(128)
|
||
|
TimeoutMin = 1 * time.Second
|
||
|
TimeoutMax = 5 * time.Second
|
||
|
)
|
||
|
|
||
|
func HasTCFlag(packet []byte) bool {
|
||
|
return packet[2]&2 == 2
|
||
|
}
|
||
|
|
||
|
func Pad(packet []byte, minSize uint) []byte {
|
||
|
packet = append(packet, 0x80)
|
||
|
for uint(len(packet)) < minSize {
|
||
|
packet = append(packet, 0)
|
||
|
}
|
||
|
return packet
|
||
|
}
|
||
|
|
||
|
func Unpad(packet []byte) ([]byte, error) {
|
||
|
i := len(packet)
|
||
|
for {
|
||
|
if i == 0 {
|
||
|
return nil, errors.New("Invalid padding (short packet)")
|
||
|
}
|
||
|
i--
|
||
|
if packet[i] == 0x80 {
|
||
|
break
|
||
|
}
|
||
|
if packet[i] != 0x00 {
|
||
|
return nil, errors.New("Invalid padding (delimiter not found)")
|
||
|
}
|
||
|
}
|
||
|
return packet[:i], nil
|
||
|
}
|