diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-04-14 20:06:14 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-04-14 20:06:14 -0400 |
| commit | b86e733f6bfeeb9b7fcf7616be61bcaf42684659 (patch) | |
| tree | 092674734f648cf072c8fb51f74594ba14839d8e /key/sig.go | |
| parent | 19586853713277cdfe7cf3322037c72c40b75b85 (diff) | |
| download | hose-b86e733f6bfeeb9b7fcf7616be61bcaf42684659.zip | |
load public signature verification key from disc
Diffstat (limited to 'key/sig.go')
| -rw-r--r-- | key/sig.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/key/sig.go b/key/sig.go new file mode 100644 index 0000000..c0bc515 --- /dev/null +++ b/key/sig.go @@ -0,0 +1,54 @@ +package key + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" +) + +// SigPublicKey is a public NaCl signature verification key. +type SigPublicKey [32]byte + +// SigPrivateKey is a private NaCl signing key. +type SigPrivateKey [64]byte + +// LoadSigPublicKey reads the public signature verification key from disc, +// or generates a new keypair if it does not already exist. +func LoadSigPublicKey() (SigPublicKey, error) { + // Generate keypair if it doesn't already exist. + err := generateSigKeypairIfNotExist() + if err != nil { + return SigPublicKey{}, err + } + + // Open public key file. + f, err := os.Open(sigPubKeyFile) + if err != nil { + return SigPublicKey{}, err + } + defer f.Close() + + // Read key from file. + buf, err := io.ReadAll(f) + if err != nil { + return SigPublicKey{}, err + } + + // Decode key. + var key SigPublicKey + if hex.DecodedLen(len(buf)) != len(key) { + return SigPublicKey{}, fmt.Errorf("malformed key: expected %d bytes; got %d", + len(key), hex.DecodedLen(len(buf))) + } + if _, err := hex.Decode(key[:], buf); err != nil { + return SigPublicKey{}, err + } + + return key, nil +} + +func (spk1 SigPublicKey) Compare(spk2 SigPublicKey) int { + return bytes.Compare(spk1[:], spk2[:]) +} |