github.com/cloudflare/circl@v1.5.0/sign/eddilithium2/signapi.go (about) 1 package eddilithium2 2 3 import ( 4 "crypto/rand" 5 "encoding/asn1" 6 7 "github.com/cloudflare/circl/sign" 8 ) 9 10 var sch sign.Scheme = &scheme{} 11 12 // Scheme returns a signature interface. 13 func Scheme() sign.Scheme { return sch } 14 15 type scheme struct{} 16 17 func (*scheme) Name() string { return "Ed25519-Dilithium2" } 18 func (*scheme) PublicKeySize() int { return PublicKeySize } 19 func (*scheme) PrivateKeySize() int { return PrivateKeySize } 20 func (*scheme) SignatureSize() int { return SignatureSize } 21 func (*scheme) SeedSize() int { return SeedSize } 22 func (*scheme) TLSIdentifier() uint { return 0xfe61 /* temp*/ } 23 func (*scheme) SupportsContext() bool { return false } 24 func (*scheme) Oid() asn1.ObjectIdentifier { 25 return asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 44363, 45, 9} 26 } 27 28 func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { 29 return GenerateKey(rand.Reader) 30 } 31 32 func (*scheme) Sign( 33 sk sign.PrivateKey, 34 message []byte, 35 opts *sign.SignatureOpts, 36 ) []byte { 37 priv, ok := sk.(*PrivateKey) 38 if !ok { 39 panic(sign.ErrTypeMismatch) 40 } 41 if opts != nil && opts.Context != "" { 42 panic(sign.ErrContextNotSupported) 43 } 44 var sig [SignatureSize]byte 45 SignTo(priv, message, sig[:]) 46 return sig[:] 47 } 48 49 func (*scheme) Verify( 50 pk sign.PublicKey, 51 message, signature []byte, 52 opts *sign.SignatureOpts, 53 ) bool { 54 pub, ok := pk.(*PublicKey) 55 if !ok { 56 panic(sign.ErrTypeMismatch) 57 } 58 if opts != nil && opts.Context != "" { 59 panic(sign.ErrContextNotSupported) 60 } 61 return Verify(pub, message, signature) 62 } 63 64 func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { 65 if len(seed) != SeedSize { 66 panic(sign.ErrSeedSize) 67 } 68 var tmp [SeedSize]byte 69 copy(tmp[:], seed) 70 return NewKeyFromSeed(&tmp) 71 } 72 73 func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { 74 if len(buf) != PublicKeySize { 75 return nil, sign.ErrPubKeySize 76 } 77 var tmp [PublicKeySize]byte 78 copy(tmp[:], buf) 79 var ret PublicKey 80 ret.Unpack(&tmp) 81 return &ret, nil 82 } 83 84 func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { 85 if len(buf) != PrivateKeySize { 86 return nil, sign.ErrPrivKeySize 87 } 88 var tmp [PrivateKeySize]byte 89 copy(tmp[:], buf) 90 var ret PrivateKey 91 ret.Unpack(&tmp) 92 return &ret, nil 93 }