2021-05-23 19:42:26 +00:00
|
|
|
package core
|
2018-06-09 23:44:59 +00:00
|
|
|
|
|
|
|
// This file contains the version metadata struct
|
2019-11-29 09:45:02 +00:00
|
|
|
// Used in the initial connection setup and key exchange
|
2018-06-09 23:44:59 +00:00
|
|
|
// Some of this could arguably go in wire.go instead
|
|
|
|
|
2023-03-18 12:14:32 +00:00
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"crypto/ed25519"
|
|
|
|
"encoding/binary"
|
|
|
|
)
|
2018-12-15 02:49:18 +00:00
|
|
|
|
2018-06-10 23:03:28 +00:00
|
|
|
// This is the version-specific metadata exchanged at the start of a connection.
|
2019-11-29 09:45:02 +00:00
|
|
|
// It must always begin with the 4 bytes "meta" and a wire formatted uint64 major version number.
|
|
|
|
// The current version also includes a minor version number, and the box/sig/link keys that need to be exchanged to open a connection.
|
2018-06-09 23:44:59 +00:00
|
|
|
type version_metadata struct {
|
2023-03-18 12:14:32 +00:00
|
|
|
majorVer uint16
|
|
|
|
minorVer uint16
|
|
|
|
publicKey ed25519.PublicKey
|
|
|
|
priority uint8
|
2018-06-09 23:44:59 +00:00
|
|
|
}
|
|
|
|
|
2023-03-18 12:14:32 +00:00
|
|
|
const (
|
|
|
|
ProtocolVersionMajor uint16 = 0
|
|
|
|
ProtocolVersionMinor uint16 = 5
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
metaVersionMajor uint16 = iota // uint16
|
|
|
|
metaVersionMinor // uint16
|
|
|
|
metaPublicKey // [32]byte
|
|
|
|
metaPriority // uint8
|
|
|
|
)
|
|
|
|
|
2018-06-10 23:03:28 +00:00
|
|
|
// Gets a base metadata with no keys set, but with the correct version numbers.
|
2018-06-09 23:44:59 +00:00
|
|
|
func version_getBaseMetadata() version_metadata {
|
|
|
|
return version_metadata{
|
2023-03-18 12:14:32 +00:00
|
|
|
majorVer: ProtocolVersionMajor,
|
|
|
|
minorVer: ProtocolVersionMinor,
|
2018-06-09 23:44:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-10 23:03:28 +00:00
|
|
|
// Encodes version metadata into its wire format.
|
2018-06-09 23:44:59 +00:00
|
|
|
func (m *version_metadata) encode() []byte {
|
2023-03-18 12:14:32 +00:00
|
|
|
bs := make([]byte, 0, 64)
|
|
|
|
bs = append(bs, 'm', 'e', 't', 'a')
|
|
|
|
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, metaVersionMajor)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, 2)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, m.majorVer)
|
|
|
|
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, metaVersionMinor)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, 2)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, m.minorVer)
|
|
|
|
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, metaPublicKey)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, ed25519.PublicKeySize)
|
|
|
|
bs = append(bs, m.publicKey[:]...)
|
|
|
|
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, metaPriority)
|
|
|
|
bs = binary.BigEndian.AppendUint16(bs, 1)
|
|
|
|
bs = append(bs, m.priority)
|
|
|
|
|
2018-06-09 23:44:59 +00:00
|
|
|
return bs
|
|
|
|
}
|
|
|
|
|
2018-06-10 23:03:28 +00:00
|
|
|
// Decodes version metadata from its wire format into the struct.
|
2018-06-09 23:44:59 +00:00
|
|
|
func (m *version_metadata) decode(bs []byte) bool {
|
2023-03-18 12:14:32 +00:00
|
|
|
meta := [4]byte{'m', 'e', 't', 'a'}
|
|
|
|
if !bytes.Equal(bs[:4], meta[:]) {
|
2018-06-09 23:44:59 +00:00
|
|
|
return false
|
|
|
|
}
|
2023-03-18 12:14:32 +00:00
|
|
|
for bs = bs[4:]; len(bs) >= 4; {
|
|
|
|
op := binary.BigEndian.Uint16(bs[:2])
|
|
|
|
oplen := binary.BigEndian.Uint16(bs[2:4])
|
|
|
|
if bs = bs[4:]; len(bs) < int(oplen) {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
switch op {
|
|
|
|
case metaVersionMajor:
|
|
|
|
m.majorVer = binary.BigEndian.Uint16(bs[:2])
|
|
|
|
|
|
|
|
case metaVersionMinor:
|
|
|
|
m.minorVer = binary.BigEndian.Uint16(bs[:2])
|
|
|
|
|
|
|
|
case metaPublicKey:
|
|
|
|
m.publicKey = make(ed25519.PublicKey, ed25519.PublicKeySize)
|
|
|
|
copy(m.publicKey, bs[:ed25519.PublicKeySize])
|
|
|
|
|
|
|
|
case metaPriority:
|
|
|
|
m.priority = bs[0]
|
|
|
|
}
|
|
|
|
bs = bs[oplen:]
|
|
|
|
}
|
2018-06-09 23:44:59 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2018-06-10 23:03:28 +00:00
|
|
|
// Checks that the "meta" bytes and the version numbers are the expected values.
|
2018-06-09 23:44:59 +00:00
|
|
|
func (m *version_metadata) check() bool {
|
2023-03-18 12:14:32 +00:00
|
|
|
switch {
|
|
|
|
case m.majorVer != ProtocolVersionMajor:
|
|
|
|
return false
|
|
|
|
case m.minorVer != ProtocolVersionMinor:
|
|
|
|
return false
|
|
|
|
case len(m.publicKey) != ed25519.PublicKeySize:
|
|
|
|
return false
|
|
|
|
default:
|
|
|
|
return true
|
|
|
|
}
|
2018-06-09 23:44:59 +00:00
|
|
|
}
|