sym-encryption #1
| @@ -5,48 +5,25 @@ import ( | ||||
| 	"sync/atomic" | ||||
| ) | ||||
|  | ||||
| func _sendControlPacket( | ||||
| 	pkt interface{ Marshal([]byte) []byte }, | ||||
| 	route peerRoute, | ||||
| 	buf1 []byte, | ||||
| 	buf2 []byte, | ||||
| ) { | ||||
| 	buf := pkt.Marshal(buf1) | ||||
| 	h1 := header{ | ||||
| func _sendControlPacket(pkt interface{ Marshal([]byte) []byte }, route peerRoute, buf1, buf2 []byte) { | ||||
| 	buf := pkt.Marshal(buf2) | ||||
| 	h := header{ | ||||
| 		StreamID: controlStreamID, | ||||
| 		Counter:  atomic.AddUint64(&sendCounters[route.IP], 1), | ||||
| 		SourceIP: localIP, | ||||
| 		DestIP:   route.IP, | ||||
| 	} | ||||
| 	buf = route.ControlCipher.Encrypt(h1, buf, buf2) | ||||
| 	buf = route.ControlCipher.Encrypt(h, buf, buf1) | ||||
|  | ||||
| 	if route.RelayIP == 0 { | ||||
| 		_conn.WriteTo(buf, route.RemoteAddr) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	relayRoute := routingTable[route.RelayIP].Load() | ||||
| 	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) | ||||
| 	_relayPacket(route.RelayIP, route.IP, buf, buf2) | ||||
| } | ||||
|  | ||||
| func _sendDataPacket( | ||||
| 	pkt []byte, | ||||
| 	route *peerRoute, | ||||
| 	buf1 []byte, | ||||
| 	buf2 []byte, | ||||
| ) { | ||||
| func _sendDataPacket(route *peerRoute, pkt, buf1, buf2 []byte) { | ||||
| 	h := header{ | ||||
| 		StreamID: dataStreamID, | ||||
| 		Counter:  atomic.AddUint64(&sendCounters[route.IP], 1), | ||||
| @@ -61,19 +38,23 @@ func _sendDataPacket( | ||||
| 		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 { | ||||
| 		log.Print("Failed to send data packet: relay not available.") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	h2 := header{ | ||||
| 	h := header{ | ||||
| 		StreamID: dataStreamID, | ||||
| 		Counter:  atomic.AddUint64(&sendCounters[relayRoute.IP], 1), | ||||
| 		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) | ||||
| } | ||||
|   | ||||
| @@ -27,31 +27,31 @@ type peerRoute struct { | ||||
| 	RelayIP       byte           // Non-zero if we should relay. | ||||
| } | ||||
|  | ||||
| // Configuration for this peer. | ||||
| var ( | ||||
| 	// Configuration for this peer. | ||||
| 	netName    string | ||||
| 	localIP    byte | ||||
| 	localPub   bool | ||||
| 	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 | ||||
| 		} | ||||
|  | ||||
| 		_sendDataPacket(packet, route, buf1, buf2) | ||||
| 		_sendDataPacket(route, packet, buf1, buf2) | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user