github.com/MetalBlockchain/metalgo@v1.11.9/utils/crypto/bls/signature.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package bls 5 6 import ( 7 "errors" 8 9 blst "github.com/supranational/blst/bindings/go" 10 ) 11 12 const SignatureLen = blst.BLST_P2_COMPRESS_BYTES 13 14 var ( 15 ErrFailedSignatureDecompress = errors.New("couldn't decompress signature") 16 errInvalidSignature = errors.New("invalid signature") 17 errNoSignatures = errors.New("no signatures") 18 errFailedSignatureAggregation = errors.New("couldn't aggregate signatures") 19 ) 20 21 type ( 22 Signature = blst.P2Affine 23 AggregateSignature = blst.P2Aggregate 24 ) 25 26 // SignatureToBytes returns the compressed big-endian format of the signature. 27 func SignatureToBytes(sig *Signature) []byte { 28 return sig.Compress() 29 } 30 31 // SignatureFromBytes parses the compressed big-endian format of the signature 32 // into a signature. 33 func SignatureFromBytes(sigBytes []byte) (*Signature, error) { 34 sig := new(Signature).Uncompress(sigBytes) 35 if sig == nil { 36 return nil, ErrFailedSignatureDecompress 37 } 38 if !sig.SigValidate(false) { 39 return nil, errInvalidSignature 40 } 41 return sig, nil 42 } 43 44 // AggregateSignatures aggregates a non-zero number of signatures into a single 45 // aggregated signature. 46 // Invariant: all [sigs] have been validated. 47 func AggregateSignatures(sigs []*Signature) (*Signature, error) { 48 if len(sigs) == 0 { 49 return nil, errNoSignatures 50 } 51 52 var agg AggregateSignature 53 if !agg.Aggregate(sigs, false) { 54 return nil, errFailedSignatureAggregation 55 } 56 return agg.ToAffine(), nil 57 }