Browse Source

proxy metrics packet creation

Abhishek Kondur 2 years ago
parent
commit
c5425bd26b

+ 6 - 0
nm-proxy/metrics/metrics.go

@@ -0,0 +1,6 @@
+package metrics
+
+/*
+1. Create metrics packet--> packet with identifier to track latency, errors.
+
+*/

+ 75 - 1
nm-proxy/packet/packet.go

@@ -1,11 +1,85 @@
 package packet
 
 import (
+	"bytes"
 	"crypto/md5"
+	"encoding/base64"
+	"encoding/binary"
+	"errors"
 	"fmt"
+	"log"
+	"net"
+	"time"
+
+	"github.com/gravitl/netmaker/nm-proxy/common"
+	"golang.org/x/crypto/blake2s"
+	"golang.org/x/crypto/chacha20poly1305"
+	"golang.zx2c4.com/wireguard/tai64n"
 )
 
-var udpHeaderLen = 8
+func ConsumeHandshakeInitiationMsg(initiator bool, buf []byte, src *net.UDPAddr, devicePubKey NoisePublicKey, devicePrivKey NoisePrivateKey) error {
+
+	var (
+		hash     [blake2s.Size]byte
+		chainKey [blake2s.Size]byte
+	)
+	var err error
+	var msg MessageInitiation
+	reader := bytes.NewReader(buf[:])
+	err = binary.Read(reader, binary.LittleEndian, &msg)
+	if err != nil {
+		log.Println("Failed to decode initiation message")
+		return err
+	}
+
+	if msg.Type != MessageInitiationType {
+		return errors.New("not handshake initiation message")
+	}
+	log.Println("-----> ConsumeHandshakeInitiationMsg, Intitator:  ", initiator)
+	mixHash(&hash, &InitialHash, devicePubKey[:])
+	mixHash(&hash, &hash, msg.Ephemeral[:])
+	mixKey(&chainKey, &InitialChainKey, msg.Ephemeral[:])
+
+	// decrypt static key
+	var peerPK NoisePublicKey
+	var key [chacha20poly1305.KeySize]byte
+	ss := sharedSecret(&devicePrivKey, msg.Ephemeral)
+	if isZero(ss[:]) {
+		return errors.New("no secret")
+	}
+	KDF2(&chainKey, &key, chainKey[:], ss[:])
+	aead, _ := chacha20poly1305.New(key[:])
+	_, err = aead.Open(peerPK[:0], ZeroNonce[:], msg.Static[:], hash[:])
+	if err != nil {
+		return err
+	}
+	log.Println("--------> Got HandShake from peer: ", base64.StdEncoding.EncodeToString(peerPK[:]), src)
+	if val, ok := common.ExtClientsWaitTh[base64.StdEncoding.EncodeToString(peerPK[:])]; ok {
+		val.CommChan <- src
+		time.Sleep(time.Second * 3)
+	}
+
+	setZero(hash[:])
+	setZero(chainKey[:])
+	return nil
+}
+
+func CreateMetricPacket(id uint64, sender, reciever NoisePublicKey) ([]byte, error) {
+	msg := MetricMessage{
+		ID:        id,
+		Sender:    sender,
+		Reciever:  reciever,
+		TimeStamp: tai64n.Now(),
+	}
+	var buff [MessageMetricSize]byte
+	writer := bytes.NewBuffer(buff[:0])
+	err := binary.Write(writer, binary.LittleEndian, msg)
+	if err != nil {
+		return nil, err
+	}
+	packet := writer.Bytes()
+	return packet, nil
+}
 
 func ProcessPacketBeforeSending(buf []byte, n int, srckey, dstKey string) ([]byte, int, string, string) {
 

+ 6 - 54
nm-proxy/packet/packet_helper.go

@@ -1,15 +1,6 @@
 package packet
 
 import (
-	"bytes"
-	"encoding/base64"
-	"encoding/binary"
-	"errors"
-	"log"
-	"net"
-	"time"
-
-	"github.com/gravitl/netmaker/nm-proxy/common"
 	"golang.org/x/crypto/blake2s"
 	"golang.org/x/crypto/chacha20poly1305"
 	"golang.org/x/crypto/poly1305"
@@ -37,49 +28,10 @@ type MessageInitiation struct {
 	MAC2      [blake2s.Size128]byte
 }
 
-func ConsumeHandshakeInitiationMsg(initiator bool, buf []byte, src *net.UDPAddr, devicePubKey NoisePublicKey, devicePrivKey NoisePrivateKey) error {
-
-	var (
-		hash     [blake2s.Size]byte
-		chainKey [blake2s.Size]byte
-	)
-	var err error
-	var msg MessageInitiation
-	reader := bytes.NewReader(buf[:])
-	err = binary.Read(reader, binary.LittleEndian, &msg)
-	if err != nil {
-		log.Println("Failed to decode initiation message")
-		return err
-	}
-
-	if msg.Type != MessageInitiationType {
-		return errors.New("not handshake initiation message")
-	}
-	log.Println("-----> ConsumeHandshakeInitiationMsg, Intitator:  ", initiator)
-	mixHash(&hash, &InitialHash, devicePubKey[:])
-	mixHash(&hash, &hash, msg.Ephemeral[:])
-	mixKey(&chainKey, &InitialChainKey, msg.Ephemeral[:])
-
-	// decrypt static key
-	var peerPK NoisePublicKey
-	var key [chacha20poly1305.KeySize]byte
-	ss := sharedSecret(&devicePrivKey, msg.Ephemeral)
-	if isZero(ss[:]) {
-		return errors.New("no secret")
-	}
-	KDF2(&chainKey, &key, chainKey[:], ss[:])
-	aead, _ := chacha20poly1305.New(key[:])
-	_, err = aead.Open(peerPK[:0], ZeroNonce[:], msg.Static[:], hash[:])
-	if err != nil {
-		return err
-	}
-	log.Println("--------> Got HandShake from peer: ", base64.StdEncoding.EncodeToString(peerPK[:]), src)
-	if val, ok := common.ExtClientsWaitTh[base64.StdEncoding.EncodeToString(peerPK[:])]; ok {
-		val.CommChan <- src
-		time.Sleep(time.Second * 3)
-	}
-
-	setZero(hash[:])
-	setZero(chainKey[:])
-	return nil
+type MetricMessage struct {
+	Type      uint32
+	ID        uint64
+	Sender    NoisePublicKey
+	Reciever  NoisePublicKey
+	TimeStamp tai64n.Timestamp
 }

+ 8 - 8
nm-proxy/packet/utils.go

@@ -12,14 +12,14 @@ import (
 
 const (
 	MessageInitiationType = 1
-
-	NoisePublicKeySize  = 32
-	NoisePrivateKeySize = 32
-
-	NoiseConstruction = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"
-	WGIdentifier      = "WireGuard v1 zx2c4 [email protected]"
-	WGLabelMAC1       = "mac1----"
-	WGLabelCookie     = "cookie--"
+	MessageMetricsType    = 5
+	NoisePublicKeySize    = 32
+	NoisePrivateKeySize   = 32
+	MessageMetricSize     = 148
+	NoiseConstruction     = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"
+	WGIdentifier          = "WireGuard v1 zx2c4 [email protected]"
+	WGLabelMAC1           = "mac1----"
+	WGLabelCookie         = "cookie--"
 )
 
 func mixKey(dst, c *[blake2s.Size]byte, data []byte) {