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  }