1.5.0 update
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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)
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
//go:build android
|
||||
|
||||
package config
|
||||
|
||||
func platformMachineID() string {
|
||||
return ""
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
//go:build darwin
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func platformMachineID() string {
|
||||
out, err := exec.Command("ioreg", "-rd1", "-c", "IOPlatformExpertDevice").Output()
|
||||
if err != nil {
|
||||
log.Printf("[identity] WARNING: failed to run ioreg: %v", err)
|
||||
return ""
|
||||
}
|
||||
for _, line := range strings.Split(string(out), "\n") {
|
||||
if strings.Contains(line, "IOPlatformUUID") {
|
||||
parts := strings.SplitN(line, "=", 2)
|
||||
if len(parts) == 2 {
|
||||
return strings.Trim(strings.TrimSpace(parts[1]), `"`)
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Printf("[identity] WARNING: IOPlatformUUID not found in ioreg output")
|
||||
return ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
//go:build linux && !android
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func platformMachineID() string {
|
||||
data, err := os.ReadFile("/etc/machine-id")
|
||||
if err != nil {
|
||||
log.Printf("[identity] WARNING: failed to read /etc/machine-id: %v", err)
|
||||
return ""
|
||||
}
|
||||
return strings.TrimSpace(string(data))
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
//go:build windows
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"golang.org/x/sys/windows/registry"
|
||||
)
|
||||
|
||||
func platformMachineID() string {
|
||||
k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Cryptography`, registry.QUERY_VALUE)
|
||||
if err != nil {
|
||||
log.Printf("[identity] WARNING: failed to open Cryptography registry key: %v", err)
|
||||
return ""
|
||||
}
|
||||
defer k.Close()
|
||||
|
||||
val, _, err := k.GetStringValue("MachineGuid")
|
||||
if err != nil {
|
||||
log.Printf("[identity] WARNING: failed to read MachineGuid: %v", err)
|
||||
return ""
|
||||
}
|
||||
return val
|
||||
}
|
||||
Reference in New Issue
Block a user