sym-encryption #1
@ -5,48 +5,25 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func _sendControlPacket(
|
func _sendControlPacket(pkt interface{ Marshal([]byte) []byte }, route peerRoute, buf1, buf2 []byte) {
|
||||||
pkt interface{ Marshal([]byte) []byte },
|
buf := pkt.Marshal(buf2)
|
||||||
route peerRoute,
|
h := header{
|
||||||
buf1 []byte,
|
|
||||||
buf2 []byte,
|
|
||||||
) {
|
|
||||||
buf := pkt.Marshal(buf1)
|
|
||||||
h1 := header{
|
|
||||||
StreamID: controlStreamID,
|
StreamID: controlStreamID,
|
||||||
Counter: atomic.AddUint64(&sendCounters[route.IP], 1),
|
Counter: atomic.AddUint64(&sendCounters[route.IP], 1),
|
||||||
SourceIP: localIP,
|
SourceIP: localIP,
|
||||||
DestIP: route.IP,
|
DestIP: route.IP,
|
||||||
}
|
}
|
||||||
buf = route.ControlCipher.Encrypt(h1, buf, buf2)
|
buf = route.ControlCipher.Encrypt(h, buf, buf1)
|
||||||
|
|
||||||
if route.RelayIP == 0 {
|
if route.RelayIP == 0 {
|
||||||
_conn.WriteTo(buf, route.RemoteAddr)
|
_conn.WriteTo(buf, route.RemoteAddr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
relayRoute := routingTable[route.RelayIP].Load()
|
_relayPacket(route.RelayIP, route.IP, buf, buf2)
|
||||||
if !relayRoute.Up || !relayRoute.Relay {
|
|
||||||
log.Print("Failed to send control packet: relay not available.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 := header{
|
|
||||||
StreamID: dataStreamID,
|
|
||||||
Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1),
|
|
||||||
SourceIP: localIP,
|
|
||||||
DestIP: route.IP,
|
|
||||||
}
|
|
||||||
buf = relayRoute.DataCipher.Encrypt(h2, buf, buf1)
|
|
||||||
_conn.WriteTo(buf, relayRoute.RemoteAddr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func _sendDataPacket(
|
func _sendDataPacket(route *peerRoute, pkt, buf1, buf2 []byte) {
|
||||||
pkt []byte,
|
|
||||||
route *peerRoute,
|
|
||||||
buf1 []byte,
|
|
||||||
buf2 []byte,
|
|
||||||
) {
|
|
||||||
h := header{
|
h := header{
|
||||||
StreamID: dataStreamID,
|
StreamID: dataStreamID,
|
||||||
Counter: atomic.AddUint64(&sendCounters[route.IP], 1),
|
Counter: atomic.AddUint64(&sendCounters[route.IP], 1),
|
||||||
@ -61,19 +38,23 @@ func _sendDataPacket(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
relayRoute := routingTable[route.RelayIP].Load()
|
_relayPacket(route.RelayIP, route.IP, enc, buf2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _relayPacket(relayIP, destIP byte, data, buf []byte) {
|
||||||
|
relayRoute := routingTable[relayIP].Load()
|
||||||
if !relayRoute.Up || !relayRoute.Relay {
|
if !relayRoute.Up || !relayRoute.Relay {
|
||||||
log.Print("Failed to send data packet: relay not available.")
|
log.Print("Failed to send data packet: relay not available.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 := header{
|
h := header{
|
||||||
StreamID: dataStreamID,
|
StreamID: dataStreamID,
|
||||||
Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1),
|
Counter: atomic.AddUint64(&sendCounters[relayRoute.IP], 1),
|
||||||
SourceIP: localIP,
|
SourceIP: localIP,
|
||||||
DestIP: route.IP,
|
DestIP: destIP,
|
||||||
}
|
}
|
||||||
|
|
||||||
enc = relayRoute.DataCipher.Encrypt(h2, enc, buf2)
|
enc := relayRoute.DataCipher.Encrypt(h, data, buf)
|
||||||
_conn.WriteTo(enc, relayRoute.RemoteAddr)
|
_conn.WriteTo(enc, relayRoute.RemoteAddr)
|
||||||
}
|
}
|
||||||
|
@ -27,31 +27,31 @@ type peerRoute struct {
|
|||||||
RelayIP byte // Non-zero if we should relay.
|
RelayIP byte // Non-zero if we should relay.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configuration for this peer.
|
|
||||||
var (
|
var (
|
||||||
|
// Configuration for this peer.
|
||||||
netName string
|
netName string
|
||||||
localIP byte
|
localIP byte
|
||||||
localPub bool
|
localPub bool
|
||||||
privateKey []byte
|
privateKey []byte
|
||||||
|
|
||||||
|
// Shared interface for writing.
|
||||||
|
_iface *ifWriter
|
||||||
|
|
||||||
|
// Shared connection for writing.
|
||||||
|
_conn *connWriter
|
||||||
|
|
||||||
|
// Counters for sending to each peer.
|
||||||
|
sendCounters [256]uint64
|
||||||
|
|
||||||
|
// Duplicate checkers for incoming packets.
|
||||||
|
dupChecks [256]*dupCheck
|
||||||
|
|
||||||
|
// Channels for incoming control packets.
|
||||||
|
controlPackets [256]chan controlPacket
|
||||||
|
|
||||||
|
// Channels for incoming peer updates from the hub.
|
||||||
|
peerUpdates [256]chan *m.Peer
|
||||||
|
|
||||||
|
// Global routing table.
|
||||||
|
routingTable [256]*atomic.Pointer[peerRoute]
|
||||||
)
|
)
|
||||||
|
|
||||||
// Shared interface for writing.
|
|
||||||
var _iface *ifWriter
|
|
||||||
|
|
||||||
// Shared connection for writing.
|
|
||||||
var _conn *connWriter
|
|
||||||
|
|
||||||
// Counters for sending to each peer.
|
|
||||||
var sendCounters [256]uint64
|
|
||||||
|
|
||||||
// Duplicate checkers for incoming packets.
|
|
||||||
var dupChecks [256]*dupCheck
|
|
||||||
|
|
||||||
// Channels for incoming control packets.
|
|
||||||
var controlPackets [256]chan controlPacket
|
|
||||||
|
|
||||||
// Channels for incoming peer updates from the hub.
|
|
||||||
var peerUpdates [256]chan *m.Peer
|
|
||||||
|
|
||||||
// Global routing table.
|
|
||||||
var routingTable [256]*atomic.Pointer[peerRoute]
|
|
||||||
|
@ -287,6 +287,6 @@ func readFromIFace(iface io.ReadWriteCloser) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
_sendDataPacket(packet, route, buf1, buf2)
|
_sendDataPacket(route, packet, buf1, buf2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user