package mldsa
import (
"crypto"
"crypto/internal/fips140/mldsa"
"errors"
"io"
)
type PrivateKey struct {
k mldsa .PrivateKey
}
var errInvalidParameters = errors .New ("mldsa: invalid parameters" )
func GenerateKey (params Parameters ) (*PrivateKey , error ) {
switch params {
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 NewPrivateKey (params Parameters , seed []byte ) (*PrivateKey , error ) {
var err error
var k *mldsa .PrivateKey
switch params {
case MLDSA44 ():
k , err = mldsa .NewPrivateKey44 (seed )
case MLDSA65 ():
k , err = mldsa .NewPrivateKey65 (seed )
case MLDSA87 ():
k , err = mldsa .NewPrivateKey87 (seed )
default :
return nil , errInvalidParameters
}
if err != nil {
return nil , err
}
return &PrivateKey {k : *k }, nil
}
func (sk *PrivateKey ) Public () crypto .PublicKey {
return sk .PublicKey ()
}
func (sk *PrivateKey ) Equal (x crypto .PrivateKey ) bool {
other , ok := x .(*PrivateKey )
if !ok || other == nil {
return false
}
return sk .k .Equal (&other .k )
}
func (sk *PrivateKey ) PublicKey () *PublicKey {
return &PublicKey {p : *sk .k .PublicKey ()}
}
func (sk *PrivateKey ) Bytes () []byte {
return sk .k .Bytes ()
}
var errInvalidSignerOpts = errors .New ("mldsa: invalid SignerOpts" )
func (sk *PrivateKey ) Sign (_ io .Reader , message []byte , opts crypto .SignerOpts ) (signature []byte , err error ) {
if sk .k == (mldsa .PrivateKey {}) {
return nil , errors .New ("mldsa: zero private key" )
}
if opts == nil {
opts = &Options {}
}
switch opts .HashFunc () {
case 0 :
var context string
if opts , ok := opts .(*Options ); ok && opts != nil {
context = opts .Context
}
return mldsa .Sign (&sk .k , message , context )
case crypto .MLDSAMu :
return mldsa .SignExternalMu (&sk .k , message )
default :
return nil , errInvalidSignerOpts
}
}
func (sk *PrivateKey ) SignDeterministic (message []byte , opts crypto .SignerOpts ) (signature []byte , err error ) {
if sk .k == (mldsa .PrivateKey {}) {
return nil , errors .New ("mldsa: zero private key" )
}
if opts == nil {
opts = &Options {}
}
switch opts .HashFunc () {
case 0 :
var context string
if opts , ok := opts .(*Options ); ok && opts != nil {
context = opts .Context
}
return mldsa .SignDeterministic (&sk .k , message , context )
case crypto .MLDSAMu :
return mldsa .SignExternalMuDeterministic (&sk .k , message )
default :
return nil , errInvalidSignerOpts
}
}
type PublicKey struct {
p mldsa .PublicKey
}
func NewPublicKey (params Parameters , encoding []byte ) (*PublicKey , error ) {
return newPublicKey (&PublicKey {}, params , encoding )
}
func newPublicKey(pub *PublicKey , params Parameters , encoding []byte ) (*PublicKey , error ) {
var err error
var pk *mldsa .PublicKey
switch params {
case MLDSA44 ():
pk , err = mldsa .NewPublicKey44 (encoding )
case MLDSA65 ():
pk , err = mldsa .NewPublicKey65 (encoding )
case MLDSA87 ():
pk , err = mldsa .NewPublicKey87 (encoding )
default :
return nil , errInvalidParameters
}
if err != nil {
return nil , err
}
pub .p = *pk
return pub , nil
}
func (pk *PublicKey ) Bytes () []byte {
return pk .p .Bytes ()
}
func (pk *PublicKey ) Equal (x crypto .PublicKey ) bool {
other , ok := x .(*PublicKey )
if !ok || other == nil {
return false
}
return pk .p .Equal (&other .p )
}
func (pk *PublicKey ) Parameters () Parameters {
switch pk .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 Verify (pk *PublicKey , message []byte , signature []byte , opts *Options ) error {
if pk == nil {
return errors .New ("mldsa: nil public key" )
}
if pk .p == (mldsa .PublicKey {}) {
return errors .New ("mldsa: zero public key" )
}
if opts == nil {
opts = &Options {}
}
return mldsa .Verify (&pk .p , message , signature , opts .Context )
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .