sample_chain/proto/util/commonutils.go

105 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package util
import (
"crypto/rand"
"fmt"
"schain/common/identity"
pb "schain/proto"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
)
// MarshalOrPanic 序列化一个proto消息如果错误则抛出panic
func MarshalOrPanic(pb proto.Message) []byte {
data, err := proto.Marshal(pb)
if err != nil {
panic(err)
}
return data
}
// Marshal 序列化一个proto消息
func Marshal(pb proto.Message) ([]byte, error) {
return proto.Marshal(pb)
}
// CreateNonceOrPanic 创建一个nonce如果错误则抛出panic
func CreateNonceOrPanic() []byte {
nonce, err := CreateNonce()
if err != nil {
panic(err)
}
return nonce
}
// CreateNonce 创建一个nonce
func CreateNonce() ([]byte, error) {
nonce, err := getRandomNonce()
return nonce, errors.WithMessage(err, "error generating random nonce")
}
// getRandomNonce 获取一个随机的nonce
func getRandomNonce() ([]byte, error) {
key := make([]byte, 24)
_, err := rand.Read(key)
if err != nil {
return nil, errors.Wrap(err, "error getting random bytes")
}
return key, nil
}
// MakeSignatureHeader 创建一个SignatureHeader
func MakeSignatureHeader(serializedCreatorCertChain []byte, nonce []byte) *pb.SignatureHeader {
return &pb.SignatureHeader{
Creator: serializedCreatorCertChain,
Nonce: nonce,
}
}
// NewSignatureHeader 创建一个SignatureHeader 签名头
func NewSignatureHeader(id identity.Serializer) (*pb.SignatureHeader, error) {
creator, err := id.Serialize()
if err != nil {
return nil, err
}
nonce, err := CreateNonce()
if err != nil {
return nil, err
}
return &pb.SignatureHeader{
Creator: creator,
Nonce: nonce,
}, nil
}
// NewSignatureHeaderOrPanic 创建一个SignatureHeader如果错误则抛出panic
func NewSignatureHeaderOrPanic(id identity.Serializer) *pb.SignatureHeader {
if id == nil {
panic(errors.New("invalid signer. cannot be nil"))
}
signatureHeader, err := NewSignatureHeader(id)
if err != nil {
panic(fmt.Errorf("failed generating a new SignatureHeader: %s", err))
}
return signatureHeader
}
// SignOrPanic 给消息签名如果错误则抛出panic
func SignOrPanic(signer identity.Signer, msg []byte) []byte {
if signer == nil {
panic(errors.New("invalid signer. cannot be nil"))
}
sigma, err := signer.Sign(msg)
if err != nil {
panic(fmt.Errorf("failed generating signature: %s", err))
}
return sigma
}