|
|
|
package wireguard
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/base64"
|
|
|
|
"errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// PrivateKeySize is the length in bytes of a Wireguard Private Key
|
|
|
|
PrivateKeySize = 32
|
|
|
|
// PublicKeySize is the length in bytes of a Wireguard Public Key
|
|
|
|
PublicKeySize = 32
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// ErrInvalidKeySize indicates the key size is wrong
|
|
|
|
ErrInvalidKeySize = errors.New("invalid key size")
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
// PrivateKey is a binary Wireguard Private Key
|
|
|
|
PrivateKey []byte
|
|
|
|
// PublicKey is a binary Wireguard Public Key
|
|
|
|
PublicKey []byte
|
|
|
|
)
|
|
|
|
|
|
|
|
func (key PrivateKey) String() string {
|
|
|
|
return encodeKey(key)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pub PublicKey) String() string {
|
|
|
|
return encodeKey(pub)
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsZero tells if the key hasn't been set
|
|
|
|
func (key PrivateKey) IsZero() bool {
|
|
|
|
return len(key) == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsZero tells if the key hasn't been set
|
|
|
|
func (pub PublicKey) IsZero() bool {
|
|
|
|
return len(pub) == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// Equal checks if two private keys are identical
|
|
|
|
func (key PrivateKey) Equal(alter PrivateKey) bool {
|
|
|
|
return bytes.Equal(key, alter)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Equal checks if two public keys are identical
|
|
|
|
func (pub PublicKey) Equal(alter PublicKey) bool {
|
|
|
|
return bytes.Equal(pub, alter)
|
|
|
|
}
|
|
|
|
|
|
|
|
// PrivateKeyFromBase64 decodes a base64-based string into
|
|
|
|
// a [PrivateKey]
|
|
|
|
func PrivateKeyFromBase64(data string) (PrivateKey, error) {
|
|
|
|
b, err := decodeKey(data, PrivateKeySize)
|
|
|
|
return b, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// PublicKeyFromBase64 decodes a base64-based string into
|
|
|
|
// a [PublicKey]
|
|
|
|
func PublicKeyFromBase64(data string) (PublicKey, error) {
|
|
|
|
b, err := decodeKey(data, PublicKeySize)
|
|
|
|
return b, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func encodeKey(b []byte) string {
|
|
|
|
switch {
|
|
|
|
case len(b) == 0:
|
|
|
|
return ""
|
|
|
|
default:
|
|
|
|
return base64.StdEncoding.EncodeToString(b)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func decodeKey(data string, size int) ([]byte, error) {
|
|
|
|
b, err := base64.StdEncoding.DecodeString(data)
|
|
|
|
switch {
|
|
|
|
case err != nil:
|
|
|
|
return []byte{}, err
|
|
|
|
case len(b) != size:
|
|
|
|
err = ErrInvalidKeySize
|
|
|
|
return []byte{}, err
|
|
|
|
default:
|
|
|
|
return b, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// KeyPair holds a Key pair
|
|
|
|
type KeyPair struct {
|
|
|
|
PrivateKey PrivateKey
|
|
|
|
PublicKey PublicKey
|
|
|
|
}
|