wip
This commit is contained in:
@@ -14,7 +14,6 @@ type connSender struct {
|
|||||||
streamID byte
|
streamID byte
|
||||||
encrypted []byte
|
encrypted []byte
|
||||||
nonceBuf []byte
|
nonceBuf []byte
|
||||||
counterTS uint64
|
|
||||||
counter uint64
|
counter uint64
|
||||||
signingKey []byte
|
signingKey []byte
|
||||||
}
|
}
|
||||||
@@ -26,20 +25,15 @@ func newConnSender(conn *net.UDPConn, srcIP, streamID byte, signingPrivKey []byt
|
|||||||
streamID: streamID,
|
streamID: streamID,
|
||||||
encrypted: make([]byte, BUFFER_SIZE),
|
encrypted: make([]byte, BUFFER_SIZE),
|
||||||
nonceBuf: make([]byte, NONCE_SIZE),
|
nonceBuf: make([]byte, NONCE_SIZE),
|
||||||
|
counter: uint64(fasttime.Now()) << 30, // Ensure counter is always increasing.
|
||||||
signingKey: signingPrivKey,
|
signingKey: signingPrivKey,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs *connSender) send(packetType byte, packet []byte, route *route) {
|
func (cs *connSender) send(packetType byte, packet []byte, route *route) {
|
||||||
now := uint64(fasttime.Now())
|
|
||||||
if cs.counterTS < now {
|
|
||||||
cs.counterTS = now
|
|
||||||
cs.counter = now << 30
|
|
||||||
}
|
|
||||||
|
|
||||||
cs.counter++
|
cs.counter++
|
||||||
|
|
||||||
nonce := Nonce{
|
nonce := Nonce{
|
||||||
|
Timestamp: fasttime.Now(),
|
||||||
Counter: cs.counter,
|
Counter: cs.counter,
|
||||||
SourceIP: cs.sourceIP,
|
SourceIP: cs.sourceIP,
|
||||||
ViaIP: route.ViaIP,
|
ViaIP: route.ViaIP,
|
||||||
@@ -59,7 +53,6 @@ func (cs *connSender) send(packetType byte, packet []byte, route *route) {
|
|||||||
toSend = encrypted
|
toSend = encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Sending to %v: %+v", route.Addr, nonce)
|
|
||||||
if _, err := cs.conn.WriteToUDPAddrPort(toSend, route.Addr); err != nil {
|
if _, err := cs.conn.WriteToUDPAddrPort(toSend, route.Addr); err != nil {
|
||||||
log.Fatalf("Failed to write UDP packet: %v\n%s", err, debug.Stack())
|
log.Fatalf("Failed to write UDP packet: %v\n%s", err, debug.Stack())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ const (
|
|||||||
NONCE_SIZE = 24
|
NONCE_SIZE = 24
|
||||||
KEY_SIZE = 32
|
KEY_SIZE = 32
|
||||||
SIG_SIZE = 64
|
SIG_SIZE = 64
|
||||||
MTU = 1408
|
MTU = 1376
|
||||||
BUFFER_SIZE = MTU + NONCE_SIZE + SIG_SIZE
|
BUFFER_SIZE = 2048 // Definitely big enough.
|
||||||
|
|
||||||
STREAM_DATA = 0
|
STREAM_DATA = 0
|
||||||
STREAM_ROUTING = 1 // Routing queries and responses.
|
STREAM_ROUTING = 1 // Routing queries and responses.
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package peer
|
|||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
type Nonce struct {
|
type Nonce struct {
|
||||||
|
Timestamp int64
|
||||||
Counter uint64
|
Counter uint64
|
||||||
SourceIP byte
|
SourceIP byte
|
||||||
ViaIP byte
|
ViaIP byte
|
||||||
@@ -12,23 +13,21 @@ type Nonce struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (nonce *Nonce) Parse(nb []byte) {
|
func (nonce *Nonce) Parse(nb []byte) {
|
||||||
nonce.Counter = *(*uint64)(unsafe.Pointer(&nb[0]))
|
nonce.Timestamp = *(*int64)(unsafe.Pointer(&nb[0]))
|
||||||
nonce.SourceIP = nb[8]
|
nonce.Counter = *(*uint64)(unsafe.Pointer(&nb[8]))
|
||||||
nonce.ViaIP = nb[9]
|
nonce.SourceIP = nb[16]
|
||||||
nonce.DestIP = nb[10]
|
nonce.ViaIP = nb[17]
|
||||||
nonce.StreamID = nb[11]
|
nonce.DestIP = nb[18]
|
||||||
nonce.PacketType = nb[12]
|
nonce.StreamID = nb[19]
|
||||||
|
nonce.PacketType = nb[20]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (nonce Nonce) Marshal(buf []byte) {
|
func (nonce Nonce) Marshal(buf []byte) {
|
||||||
*(*uint64)(unsafe.Pointer(&buf[0])) = nonce.Counter
|
*(*int64)(unsafe.Pointer(&buf[0])) = nonce.Timestamp
|
||||||
buf[8] = nonce.SourceIP
|
*(*uint64)(unsafe.Pointer(&buf[8])) = nonce.Counter
|
||||||
buf[9] = nonce.ViaIP
|
buf[16] = nonce.SourceIP
|
||||||
buf[10] = nonce.DestIP
|
buf[17] = nonce.ViaIP
|
||||||
buf[11] = nonce.StreamID
|
buf[18] = nonce.DestIP
|
||||||
buf[12] = nonce.PacketType
|
buf[19] = nonce.StreamID
|
||||||
}
|
buf[20] = nonce.PacketType
|
||||||
|
|
||||||
func CounterTimestamp(counter uint64) int64 {
|
|
||||||
return int64(counter >> 30)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ func (peer *Peer) ifReader() {
|
|||||||
iface = peer.iface
|
iface = peer.iface
|
||||||
err error
|
err error
|
||||||
packet = make([]byte, BUFFER_SIZE)
|
packet = make([]byte, BUFFER_SIZE)
|
||||||
|
version byte
|
||||||
)
|
)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@@ -36,8 +37,16 @@ func (peer *Peer) ifReader() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
packet = packet[:n]
|
packet = packet[:n]
|
||||||
|
version = packet[0] >> 4
|
||||||
|
|
||||||
|
switch version {
|
||||||
|
case 4:
|
||||||
destIP = packet[19]
|
destIP = packet[19]
|
||||||
|
case 6:
|
||||||
|
destIP = packet[39]
|
||||||
|
default:
|
||||||
|
log.Printf("Dropping packet with IP version: %d", version)
|
||||||
|
}
|
||||||
|
|
||||||
route = router.GetRoute(destIP)
|
route = router.GetRoute(destIP)
|
||||||
if route == nil || !route.Up {
|
if route == nil || !route.Up {
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ NEXT_PACKET:
|
|||||||
nonce.Parse(packet[n-NONCE_SIZE:])
|
nonce.Parse(packet[n-NONCE_SIZE:])
|
||||||
|
|
||||||
// Drop after 8 seconds.
|
// Drop after 8 seconds.
|
||||||
if CounterTimestamp(nonce.Counter) < fasttime.Now()-8 {
|
if nonce.Timestamp < fasttime.Now()-8 {
|
||||||
log.Printf("Dropping old packet: %d", CounterTimestamp(nonce.Counter))
|
log.Printf("Dropping old packet: %d", nonce.Timestamp)
|
||||||
goto NEXT_PACKET
|
goto NEXT_PACKET
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,9 +56,8 @@ NEXT_PACKET:
|
|||||||
goto NEXT_PACKET
|
goto NEXT_PACKET
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check source counter.
|
|
||||||
if nonce.Counter <= counters[nonce.StreamID][nonce.SourceIP] {
|
if nonce.Counter <= counters[nonce.StreamID][nonce.SourceIP] {
|
||||||
log.Printf("Dropping packet with bad counter: %+v", nonce)
|
log.Printf("Dropping packet with bad counter: %d <= %d", nonce.Counter, counters[nonce.StreamID][nonce.SourceIP])
|
||||||
goto NEXT_PACKET
|
goto NEXT_PACKET
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user