63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
// i2p_keys.go
|
|
package i2pkeys
|
|
|
|
import (
|
|
"crypto"
|
|
"crypto/ed25519"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
var (
|
|
ErrInvalidKeyType = errors.New("invalid key type")
|
|
ErrSigningFailed = errors.New("signing operation failed")
|
|
)
|
|
|
|
// KeyType represents supported key algorithms
|
|
type KeyType int
|
|
|
|
const (
|
|
KeyTypeEd25519 KeyType = iota
|
|
KeyTypeElgamal
|
|
// Add other key types as needed
|
|
)
|
|
|
|
// SecretKeyProvider extends the basic crypto interfaces
|
|
type SecretKeyProvider interface {
|
|
crypto.Signer
|
|
Type() KeyType
|
|
Raw() []byte
|
|
}
|
|
|
|
// Ed25519SecretKey provides a type-safe wrapper
|
|
type Ed25519SecretKey struct {
|
|
key ed25519.PrivateKey
|
|
}
|
|
|
|
func NewEd25519SecretKey(key ed25519.PrivateKey) (*Ed25519SecretKey, error) {
|
|
if len(key) != ed25519.PrivateKeySize {
|
|
return nil, fmt.Errorf("%w: invalid Ed25519 key size", ErrInvalidKeyType)
|
|
}
|
|
return &Ed25519SecretKey{key: key}, nil
|
|
}
|
|
|
|
func (k *Ed25519SecretKey) Type() KeyType {
|
|
return KeyTypeEd25519
|
|
}
|
|
|
|
func (k *Ed25519SecretKey) Raw() []byte {
|
|
return k.key
|
|
}
|
|
|
|
func (k *Ed25519SecretKey) Public() crypto.PublicKey {
|
|
return k.key.Public()
|
|
}
|
|
|
|
func (k *Ed25519SecretKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
|
|
if k == nil || len(k.key) != ed25519.PrivateKeySize {
|
|
return nil, fmt.Errorf("%w: invalid key state", ErrInvalidKeyType)
|
|
}
|
|
return k.key.Sign(rand, digest, opts)
|
|
}
|