wormhole/node/pkg/common/nodekey.go

55 lines
1.1 KiB
Go

package common
import (
"fmt"
"os"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
"go.uber.org/zap"
)
func GetOrCreateNodeKey(logger *zap.Logger, path string) (crypto.PrivKey, error) {
b, err := os.ReadFile(path)
if err != nil {
if os.IsNotExist(err) {
logger.Info("No node key found, generating a new one...", zap.String("path", path))
priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, -1)
if err != nil {
panic(err)
}
s, err := crypto.MarshalPrivateKey(priv)
if err != nil {
panic(err)
}
err = os.WriteFile(path, s, 0600)
if err != nil {
return nil, fmt.Errorf("failed to write node key: %w", err)
}
return priv, nil
} else {
return nil, fmt.Errorf("failed to read node key: %w", err)
}
}
priv, err := crypto.UnmarshalPrivateKey(b)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal node key: %w", err)
}
peerID, err := peer.IDFromPrivateKey(priv)
if err != nil {
panic(err)
}
logger.Info("Found existing node key",
zap.String("path", path),
zap.Stringer("peerID", peerID))
return priv, nil
}