Files
i2pkeys/I2PSecretKey.go

74 lines
1.7 KiB
Go
Raw Normal View History

2024-11-29 18:21:01 -05:00
// i2p_secret_key.go
2024-11-29 18:14:03 -05:00
package i2pkeys
import (
"crypto"
"crypto/ed25519"
"crypto/rand"
2024-11-29 18:21:01 -05:00
"errors"
2024-11-29 18:14:03 -05:00
"fmt"
"io"
)
2024-11-29 18:21:01 -05:00
// SecretKey returns a type-safe secret key implementation
func (k I2PKeys) SecretKey() (SecretKeyProvider, error) {
rawKey := k.Private()
if len(rawKey) != ed25519.PrivateKeySize {
return nil, fmt.Errorf("%w: expected Ed25519 key", ErrInvalidKeyType)
}
return NewEd25519SecretKey(ed25519.PrivateKey(rawKey))
2024-11-29 18:14:03 -05:00
}
2024-11-29 18:21:01 -05:00
// PrivateKey returns the crypto.PrivateKey interface implementation
func (k I2PKeys) PrivateKey() (crypto.PrivateKey, error) {
sk, err := k.SecretKey()
if err != nil {
return nil, fmt.Errorf("getting secret key: %w", err)
}
return sk, nil
2024-11-29 18:14:03 -05:00
}
2024-11-29 18:21:01 -05:00
// Ed25519PrivateKey safely converts to ed25519.PrivateKey
func (k I2PKeys) Ed25519PrivateKey() (ed25519.PrivateKey, error) {
sk, err := k.SecretKey()
if err != nil {
return nil, err
}
if sk.Type() != KeyTypeEd25519 {
return nil, fmt.Errorf("%w: not an Ed25519 key", ErrInvalidKeyType)
}
return ed25519.PrivateKey(sk.Raw()), nil
2024-11-29 18:14:03 -05:00
}
2024-11-29 18:21:01 -05:00
// Sign implements crypto.Signer
func (k I2PKeys) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
sk, err := k.SecretKey()
if err != nil {
return nil, fmt.Errorf("getting secret key: %w", err)
}
sig, err := sk.Sign(rand, digest, opts)
if err != nil {
return nil, fmt.Errorf("%w: %v", ErrSigningFailed, err)
}
return sig, nil
2024-11-29 18:14:03 -05:00
}
2024-11-29 18:21:01 -05:00
// HostnameEntry creates a signed hostname entry
2024-11-29 18:14:03 -05:00
func (k I2PKeys) HostnameEntry(hostname string, opts crypto.SignerOpts) (string, error) {
if hostname == "" {
return "", errors.New("empty hostname")
}
sig, err := k.Sign(rand.Reader, []byte(hostname), opts)
if err != nil {
return "", fmt.Errorf("signing hostname: %w", err)
}
return string(sig), nil
}