Store upstream names, prepare for dnscrypt v3 stamps
This commit is contained in:
parent
721313a603
commit
805c8a822f
11
common.go
11
common.go
|
@ -1,7 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,16 +23,6 @@ var (
|
||||||
TimeoutMax = 5 * time.Second
|
TimeoutMax = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServerInfo struct {
|
|
||||||
MagicQuery [8]byte
|
|
||||||
ServerPk [32]byte
|
|
||||||
SharedKey [32]byte
|
|
||||||
CryptoConstruction CryptoConstruction
|
|
||||||
Timeout time.Duration
|
|
||||||
UDPAddr *net.UDPAddr
|
|
||||||
TCPAddr *net.TCPAddr
|
|
||||||
}
|
|
||||||
|
|
||||||
func HasTCFlag(packet []byte) bool {
|
func HasTCFlag(packet []byte) bool {
|
||||||
return packet[2]&2 == 2
|
return packet[2]&2 == 2
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,16 +21,16 @@ type Proxy struct {
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(0)
|
log.SetFlags(0)
|
||||||
NewProxy("127.0.0.1:5399", "212.47.228.136:443", "E801:B84E:A606:BFB0:BAC0:CE43:445B:B15E:BA64:B02F:A3C4:AA31:AE10:636A:0790:324D", "2.dnscrypt-cert.fr.dnscrypt.org")
|
NewProxy("127.0.0.1:5399", "dnscrypt.org-fr", "212.47.228.136:443", "E801:B84E:A606:BFB0:BAC0:CE43:445B:B15E:BA64:B02F:A3C4:AA31:AE10:636A:0790:324D", "2.dnscrypt-cert.fr.dnscrypt.org")
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProxy(listenAddrStr string, serverAddrStr string, serverPkStr string, providerName string) {
|
func NewProxy(listenAddrStr string, serverName string, serverAddrStr string, serverPkStr string, providerName string) {
|
||||||
proxy := Proxy{questionSizeEstimator: NewQuestionSizeEstimator(), timeout: TimeoutMax}
|
proxy := Proxy{questionSizeEstimator: NewQuestionSizeEstimator(), timeout: TimeoutMax}
|
||||||
if _, err := rand.Read(proxy.proxySecretKey[:]); err != nil {
|
if _, err := rand.Read(proxy.proxySecretKey[:]); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
curve25519.ScalarBaseMult(&proxy.proxyPublicKey, &proxy.proxySecretKey)
|
curve25519.ScalarBaseMult(&proxy.proxyPublicKey, &proxy.proxySecretKey)
|
||||||
proxy.serversInfo.registerServer(&proxy, serverAddrStr, serverPkStr, providerName)
|
proxy.serversInfo.registerServer(&proxy, serverName, serverAddrStr, serverPkStr, providerName)
|
||||||
listenUDPAddr, err := net.ResolveUDPAddr("udp", listenAddrStr)
|
listenUDPAddr, err := net.ResolveUDPAddr("udp", listenAddrStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
|
@ -6,21 +6,57 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"golang.org/x/crypto/ed25519"
|
"golang.org/x/crypto/ed25519"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServersInfo struct {
|
type ServerStamp struct {
|
||||||
sync.RWMutex
|
name string
|
||||||
inner []ServerInfo
|
serverAddrStr string
|
||||||
|
serverPkStr string
|
||||||
|
providerName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (serversInfo *ServersInfo) registerServer(proxy *Proxy, serverAddrStr string, serverPkStr string, providerName string) error {
|
func NewServerStampFromLegacy(name string, serverAddrStr string, serverPkStr string, providerName string) (ServerStamp, error) {
|
||||||
newServer, err := serversInfo.fetchServerInfo(proxy, serverAddrStr, serverPkStr, providerName)
|
return ServerStamp{
|
||||||
|
name: name,
|
||||||
|
serverAddrStr: serverAddrStr,
|
||||||
|
serverPkStr: serverPkStr,
|
||||||
|
providerName: providerName,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerInfo struct {
|
||||||
|
MagicQuery [8]byte
|
||||||
|
ServerPk [32]byte
|
||||||
|
SharedKey [32]byte
|
||||||
|
CryptoConstruction CryptoConstruction
|
||||||
|
Name string
|
||||||
|
Timeout time.Duration
|
||||||
|
UDPAddr *net.UDPAddr
|
||||||
|
TCPAddr *net.TCPAddr
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServersInfo struct {
|
||||||
|
sync.RWMutex
|
||||||
|
inner []ServerInfo
|
||||||
|
serverStamps []ServerStamp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (serversInfo *ServersInfo) registerServer(proxy *Proxy, name string, serverAddrStr string, serverPkStr string, providerName string) error {
|
||||||
|
newServer, err := serversInfo.fetchServerInfo(proxy, name, serverAddrStr, serverPkStr, providerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
serversInfo.Lock()
|
serversInfo.Lock()
|
||||||
|
for i, oldServer := range serversInfo.inner {
|
||||||
|
if oldServer.Name == newServer.Name {
|
||||||
|
serversInfo.inner[i] = newServer
|
||||||
|
serversInfo.Unlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
serversInfo.inner = append(serversInfo.inner, newServer)
|
serversInfo.inner = append(serversInfo.inner, newServer)
|
||||||
serversInfo.Unlock()
|
serversInfo.Unlock()
|
||||||
return nil
|
return nil
|
||||||
|
@ -33,7 +69,7 @@ func (serversInfo *ServersInfo) getOne() *ServerInfo {
|
||||||
return serverInfo
|
return serverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (serversInfo *ServersInfo) fetchServerInfo(proxy *Proxy, serverAddrStr string, serverPkStr string, providerName string) (ServerInfo, error) {
|
func (serversInfo *ServersInfo) fetchServerInfo(proxy *Proxy, name string, serverAddrStr string, serverPkStr string, providerName string) (ServerInfo, error) {
|
||||||
serverPublicKey, err := hex.DecodeString(strings.Replace(serverPkStr, ":", "", -1))
|
serverPublicKey, err := hex.DecodeString(strings.Replace(serverPkStr, ":", "", -1))
|
||||||
if err != nil || len(serverPublicKey) != ed25519.PublicKeySize {
|
if err != nil || len(serverPublicKey) != ed25519.PublicKeySize {
|
||||||
log.Fatal("Invalid public key")
|
log.Fatal("Invalid public key")
|
||||||
|
@ -55,6 +91,7 @@ func (serversInfo *ServersInfo) fetchServerInfo(proxy *Proxy, serverAddrStr stri
|
||||||
ServerPk: certInfo.ServerPk,
|
ServerPk: certInfo.ServerPk,
|
||||||
SharedKey: certInfo.SharedKey,
|
SharedKey: certInfo.SharedKey,
|
||||||
CryptoConstruction: certInfo.CryptoConstruction,
|
CryptoConstruction: certInfo.CryptoConstruction,
|
||||||
|
Name: name,
|
||||||
Timeout: TimeoutMin,
|
Timeout: TimeoutMin,
|
||||||
UDPAddr: remoteUDPAddr,
|
UDPAddr: remoteUDPAddr,
|
||||||
TCPAddr: remoteTCPAddr,
|
TCPAddr: remoteTCPAddr,
|
||||||
|
|
Loading…
Reference in New Issue