From 249b99f46f466e68ecd678b8616ce181228126e7 Mon Sep 17 00:00:00 2001 From: Elara6331 Date: Sat, 9 Mar 2024 21:43:17 -0800 Subject: [PATCH] Add LoadPrivateKey(s) functions --- keys.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/keys.go b/keys.go index 19bbea8..f3249b9 100644 --- a/keys.go +++ b/keys.go @@ -102,3 +102,44 @@ func generateKeys(path string) (ed25519.PublicKey, ed25519.PrivateKey, error) { return pub, priv, nil } + +// LoadPrivateKeys loads the private keys at all the provided paths. +// +// Any invalid keys are skipped. +func LoadPrivateKeys(paths ...string) []ed25519.PrivateKey { + out := make([]ed25519.PrivateKey, len(paths)) + for i, path := range paths { + privkey, err := LoadPrivateKey(path) + if err != nil { + continue + } + out[i] = privkey + } + return out +} + +// LoadPrivateKey loads a private Ed25519 key from the given path. +func LoadPrivateKey(path string) (ed25519.PrivateKey, error) { + privData, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + privBlock, _ := pem.Decode(privData) + + if privBlock == nil { + return nil, errors.New("invalid private key data") + } + + privkey, err := x509.ParsePKCS8PrivateKey(privBlock.Bytes) + if err != nil { + return nil, err + } + + priv, ok := privkey.(ed25519.PrivateKey) + if !ok { + return nil, errors.New("invalid private key type") + } + + return priv, nil +}