105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
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
|
||
}
|