Files
overlord/Overlord-Client/cmd/agent/config/identity.go
T
2026-03-20 22:38:17 -05:00

53 lines
1.2 KiB
Go

package config
import (
"crypto/ed25519"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"io"
"log"
"golang.org/x/crypto/hkdf"
)
type Identity struct {
PublicKey ed25519.PublicKey
PrivateKey ed25519.PrivateKey
Fingerprint string // hex SHA256 of public key
}
func DeriveIdentity() Identity {
hwid := deriveHWID()
machineID := platformMachineID()
if machineID == "" {
log.Printf("[identity] WARNING: no OS-specific machine ID available, using HWID-only derivation")
machineID = hwid
}
hkdfReader := hkdf.New(sha256.New, []byte(machineID), []byte(hwid), []byte("overlord-identity"))
seed := make([]byte, ed25519.SeedSize)
if _, err := io.ReadFull(hkdfReader, seed); err != nil {
log.Fatalf("[identity] HKDF derivation failed: %v", err)
}
privateKey := ed25519.NewKeyFromSeed(seed)
publicKey := privateKey.Public().(ed25519.PublicKey)
fp := sha256.Sum256(publicKey)
return Identity{
PublicKey: publicKey,
PrivateKey: privateKey,
Fingerprint: hex.EncodeToString(fp[:]),
}
}
func (id *Identity) Sign(data []byte) []byte {
return ed25519.Sign(id.PrivateKey, data)
}
func (id *Identity) PublicKeyBase64() string {
return base64.StdEncoding.EncodeToString(id.PublicKey)
}