mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-17 02:24:23 +08:00
proxy metrics packet creation
This commit is contained in:
parent
972ded5a2d
commit
c5425bd26b
4 changed files with 95 additions and 63 deletions
6
nm-proxy/metrics/metrics.go
Normal file
6
nm-proxy/metrics/metrics.go
Normal file
|
@ -0,0 +1,6 @@
|
|||
package metrics
|
||||
|
||||
/*
|
||||
1. Create metrics packet--> packet with identifier to track latency, errors.
|
||||
|
||||
*/
|
|
@ -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) {
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -12,14 +12,14 @@ import (
|
|||
|
||||
const (
|
||||
MessageInitiationType = 1
|
||||
|
||||
NoisePublicKeySize = 32
|
||||
NoisePrivateKeySize = 32
|
||||
|
||||
NoiseConstruction = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"
|
||||
WGIdentifier = "WireGuard v1 zx2c4 Jason@zx2c4.com"
|
||||
WGLabelMAC1 = "mac1----"
|
||||
WGLabelCookie = "cookie--"
|
||||
MessageMetricsType = 5
|
||||
NoisePublicKeySize = 32
|
||||
NoisePrivateKeySize = 32
|
||||
MessageMetricSize = 148
|
||||
NoiseConstruction = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"
|
||||
WGIdentifier = "WireGuard v1 zx2c4 Jason@zx2c4.com"
|
||||
WGLabelMAC1 = "mac1----"
|
||||
WGLabelCookie = "cookie--"
|
||||
)
|
||||
|
||||
func mixKey(dst, c *[blake2s.Size]byte, data []byte) {
|
||||
|
|
Loading…
Add table
Reference in a new issue