From 2933ba510c7ac41e39b54667e3cb5f11fdea929d Mon Sep 17 00:00:00 2001 From: Rasmus Dahlberg Date: Thu, 13 Oct 2022 17:47:14 +0200 Subject: Add hs_ed25519_secret_key_parsing --- pkg/okey/okey.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 pkg/okey/okey.go (limited to 'pkg/okey/okey.go') diff --git a/pkg/okey/okey.go b/pkg/okey/okey.go new file mode 100644 index 0000000..aba4f3e --- /dev/null +++ b/pkg/okey/okey.go @@ -0,0 +1,29 @@ +// Package okey provides access to onion service private keys +package okey + +import ( + "crypto" + "fmt" + "os" + + bed25519 "github.com/cretz/bine/torutil/ed25519" +) + +// New parses the content of Tor's hs_ed25519_secret_key file by interpretting +// bytes 32..96 as the 64-byte expanded seed. For reference, see: +// https://gitlab.torproject.org/tpo/core/tor/-/blob/main/src/feature/keymgt/loadkey.c#L379 +func New(b []byte) (crypto.Signer, error) { + if len(b) != 96 { + return nil, fmt.Errorf("invalid key file size: %d", len(b)) + } + return bed25519.PrivateKey(b[32:96]), nil +} + +// NewFromHSDir reads and parses the hs_ed25519_secret_key file in a given directory +func NewFromHSDir(dir string) (crypto.Signer, error) { + b, err := os.ReadFile(dir + "/hs_ed25519_secret_key") + if err != nil { + return nil, err + } + return New(b) +} -- cgit v1.2.3