package herumi import ( "fmt" bls12 "github.com/herumi/bls-eth-go-binary/bls" "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/shared/bls/iface" "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/params" ) // bls12SecretKey used in the BLS signature scheme. type bls12SecretKey struct { p *bls12.SecretKey } // RandKey creates a new private key using a random method provided as an io.Reader. func RandKey() iface.SecretKey { secKey := &bls12.SecretKey{} secKey.SetByCSPRNG() return &bls12SecretKey{secKey} } // SecretKeyFromBytes creates a BLS private key from a BigEndian byte slice. func SecretKeyFromBytes(privKey []byte) (iface.SecretKey, error) { if len(privKey) != params.BeaconConfig().BLSSecretKeyLength { return nil, fmt.Errorf("secret key must be %d bytes", params.BeaconConfig().BLSSecretKeyLength) } secKey := &bls12.SecretKey{} err := secKey.Deserialize(privKey) if err != nil { return nil, errors.Wrap(err, "could not unmarshal bytes into secret key") } return &bls12SecretKey{p: secKey}, err } // PublicKey obtains the public key corresponding to the BLS secret key. func (s *bls12SecretKey) PublicKey() iface.PublicKey { return &PublicKey{p: s.p.GetPublicKey()} } // Sign a message using a secret key - in a beacon/validator client. // // In IETF draft BLS specification: // Sign(SK, message) -> signature: a signing algorithm that generates // a deterministic signature given a secret key SK and a message. // // In ETH2.0 specification: // def Sign(SK: int, message: Bytes) -> BLSSignature func (s *bls12SecretKey) Sign(msg []byte) iface.Signature { if featureconfig.Get().SkipBLSVerify { return &Signature{} } signature := s.p.SignByte(msg) return &Signature{s: signature} } // Marshal a secret key into a LittleEndian byte slice. func (s *bls12SecretKey) Marshal() []byte { keyBytes := s.p.Serialize() if len(keyBytes) < params.BeaconConfig().BLSSecretKeyLength { emptyBytes := make([]byte, params.BeaconConfig().BLSSecretKeyLength-len(keyBytes)) keyBytes = append(emptyBytes, keyBytes...) } return keyBytes }