package mldsa
import (
)
type PrivateKey struct {
k mldsa.PrivateKey
}
var errInvalidParameters = errors.New("mldsa: invalid parameters")
func ( Parameters) (*PrivateKey, error) {
switch {
case MLDSA44():
return &PrivateKey{k: *mldsa.GenerateKey44()}, nil
case MLDSA65():
return &PrivateKey{k: *mldsa.GenerateKey65()}, nil
case MLDSA87():
return &PrivateKey{k: *mldsa.GenerateKey87()}, nil
default:
return nil, errInvalidParameters
}
}
func ( Parameters, []byte) (*PrivateKey, error) {
var error
var *mldsa.PrivateKey
switch {
case MLDSA44():
, = mldsa.NewPrivateKey44()
case MLDSA65():
, = mldsa.NewPrivateKey65()
case MLDSA87():
, = mldsa.NewPrivateKey87()
default:
return nil, errInvalidParameters
}
if != nil {
return nil,
}
return &PrivateKey{k: *}, nil
}
func ( *PrivateKey) () crypto.PublicKey {
return .PublicKey()
}
func ( *PrivateKey) ( crypto.PrivateKey) bool {
, := .(*PrivateKey)
if ! || == nil {
return false
}
return .k.Equal(&.k)
}
func ( *PrivateKey) () *PublicKey {
return &PublicKey{p: *.k.PublicKey()}
}
func ( *PrivateKey) () []byte {
return .k.Bytes()
}
var errInvalidSignerOpts = errors.New("mldsa: invalid SignerOpts")
func ( *PrivateKey) ( io.Reader, []byte, crypto.SignerOpts) ( []byte, error) {
if .k == (mldsa.PrivateKey{}) {
return nil, errors.New("mldsa: zero private key")
}
if == nil {
= &Options{}
}
switch .HashFunc() {
case 0:
var string
if , := .(*Options); && != nil {
= .Context
}
return mldsa.Sign(&.k, , )
case crypto.MLDSAMu:
return mldsa.SignExternalMu(&.k, )
default:
return nil, errInvalidSignerOpts
}
}
func ( *PrivateKey) ( []byte, crypto.SignerOpts) ( []byte, error) {
if .k == (mldsa.PrivateKey{}) {
return nil, errors.New("mldsa: zero private key")
}
if == nil {
= &Options{}
}
switch .HashFunc() {
case 0:
var string
if , := .(*Options); && != nil {
= .Context
}
return mldsa.SignDeterministic(&.k, , )
case crypto.MLDSAMu:
return mldsa.SignExternalMuDeterministic(&.k, )
default:
return nil, errInvalidSignerOpts
}
}
type PublicKey struct {
p mldsa.PublicKey
}
func ( Parameters, []byte) (*PublicKey, error) {
return newPublicKey(&PublicKey{}, , )
}
func ( *PublicKey, Parameters, []byte) (*PublicKey, error) {
var error
var *mldsa.PublicKey
switch {
case MLDSA44():
, = mldsa.NewPublicKey44()
case MLDSA65():
, = mldsa.NewPublicKey65()
case MLDSA87():
, = mldsa.NewPublicKey87()
default:
return nil, errInvalidParameters
}
if != nil {
return nil,
}
.p = *
return , nil
}
func ( *PublicKey) () []byte {
return .p.Bytes()
}
func ( *PublicKey) ( crypto.PublicKey) bool {
, := .(*PublicKey)
if ! || == nil {
return false
}
return .p.Equal(&.p)
}
func ( *PublicKey) () Parameters {
switch .p.Parameters() {
case "ML-DSA-44":
return MLDSA44()
case "ML-DSA-65":
return MLDSA65()
case "ML-DSA-87":
return MLDSA87()
default:
panic("mldsa: invalid parameters in public key")
}
}
func ( *PublicKey, []byte, []byte, *Options) error {
if == nil {
return errors.New("mldsa: nil public key")
}
if .p == (mldsa.PublicKey{}) {
return errors.New("mldsa: zero public key")
}
if == nil {
= &Options{}
}
return mldsa.Verify(&.p, , , .Context)
}