go_study/fabric-main/protoutil/signeddata_test.go

184 lines
5.2 KiB
Go

/*
Copyright IBM Corp. 2016 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package protoutil_test
import (
"bytes"
"encoding/pem"
"io/ioutil"
"path/filepath"
"testing"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric-protos-go/msp"
"github.com/hyperledger/fabric/protoutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
)
// More duplicate utility which should go away, but the utils are a bit of a mess right now with import cycles
func marshalOrPanic(msg proto.Message) []byte {
data, err := proto.Marshal(msg)
if err != nil {
panic("Error marshaling")
}
return data
}
func TestNilConfigEnvelopeAsSignedData(t *testing.T) {
var ce *common.ConfigUpdateEnvelope
_, err := protoutil.ConfigUpdateEnvelopeAsSignedData(ce)
if err == nil {
t.Fatalf("Should have errored trying to convert a nil signed config item to signed data")
}
}
func TestConfigEnvelopeAsSignedData(t *testing.T) {
configBytes := []byte("Foo")
signatures := [][]byte{[]byte("Signature1"), []byte("Signature2")}
identities := [][]byte{[]byte("Identity1"), []byte("Identity2")}
configSignatures := make([]*common.ConfigSignature, len(signatures))
for i := range configSignatures {
configSignatures[i] = &common.ConfigSignature{
SignatureHeader: marshalOrPanic(&common.SignatureHeader{
Creator: identities[i],
}),
Signature: signatures[i],
}
}
ce := &common.ConfigUpdateEnvelope{
ConfigUpdate: configBytes,
Signatures: configSignatures,
}
signedData, err := protoutil.ConfigUpdateEnvelopeAsSignedData(ce)
if err != nil {
t.Fatalf("Unexpected error: %s", err)
}
for i, sigData := range signedData {
if !bytes.Equal(sigData.Identity, identities[i]) {
t.Errorf("Expected identity to match at index %d", i)
}
if !bytes.Equal(sigData.Data, append(configSignatures[i].SignatureHeader, configBytes...)) {
t.Errorf("Expected signature over concatenation of config item bytes and signature header")
}
if !bytes.Equal(sigData.Signature, signatures[i]) {
t.Errorf("Expected signature to match at index %d", i)
}
}
}
func TestNilEnvelopeAsSignedData(t *testing.T) {
var env *common.Envelope
_, err := protoutil.EnvelopeAsSignedData(env)
if err == nil {
t.Fatalf("Should have errored trying to convert a nil envelope")
}
}
func TestEnvelopeAsSignedData(t *testing.T) {
identity := []byte("Foo")
sig := []byte("Bar")
shdrbytes, err := proto.Marshal(&common.SignatureHeader{Creator: identity})
if err != nil {
t.Fatalf("%s", err)
}
env := &common.Envelope{
Payload: marshalOrPanic(&common.Payload{
Header: &common.Header{
SignatureHeader: shdrbytes,
},
}),
Signature: sig,
}
signedData, err := protoutil.EnvelopeAsSignedData(env)
if err != nil {
t.Fatalf("Unexpected error converting envelope to SignedData: %s", err)
}
if len(signedData) != 1 {
t.Fatalf("Expected 1 entry of signed data, but got %d", len(signedData))
}
if !bytes.Equal(signedData[0].Identity, identity) {
t.Errorf("Wrong identity bytes")
}
if !bytes.Equal(signedData[0].Data, env.Payload) {
t.Errorf("Wrong data bytes")
}
if !bytes.Equal(signedData[0].Signature, sig) {
t.Errorf("Wrong data bytes")
}
}
func TestLogMessageForSerializedIdentity(t *testing.T) {
pem, err := readPemFile(filepath.Join("testdata", "peer-expired.pem"))
require.NoError(t, err, "Unexpected error reading pem file")
serializedIdentity := &msp.SerializedIdentity{
Mspid: "MyMSP",
IdBytes: pem,
}
serializedIdentityBytes, err := proto.Marshal(serializedIdentity)
require.NoError(t, err, "Unexpected error marshaling")
identityLogMessage := protoutil.LogMessageForSerializedIdentity(serializedIdentityBytes)
expected := "(mspid=MyMSP subject=CN=peer0.org1.example.com,L=San Francisco,ST=California,C=US issuer=CN=ca.org1.example.com,O=org1.example.com,L=San Francisco,ST=California,C=US serialnumber=216422593083731187380743188920914963441)"
require.Equal(t, expected, identityLogMessage)
signedDatas := []*protoutil.SignedData{
{
Data: nil,
Identity: serializedIdentityBytes,
Signature: nil,
},
{
Data: nil,
Identity: serializedIdentityBytes,
Signature: nil,
},
}
identitiesLogMessage := protoutil.LogMessageForSerializedIdentities(signedDatas)
expected =
"(mspid=MyMSP subject=CN=peer0.org1.example.com,L=San Francisco,ST=California,C=US issuer=CN=ca.org1.example.com,O=org1.example.com,L=San Francisco,ST=California,C=US serialnumber=216422593083731187380743188920914963441), " +
"(mspid=MyMSP subject=CN=peer0.org1.example.com,L=San Francisco,ST=California,C=US issuer=CN=ca.org1.example.com,O=org1.example.com,L=San Francisco,ST=California,C=US serialnumber=216422593083731187380743188920914963441)"
require.Equal(t, expected, identitiesLogMessage)
}
func readFile(file string) ([]byte, error) {
fileCont, err := ioutil.ReadFile(file)
if err != nil {
return nil, errors.Wrapf(err, "could not read file %s", file)
}
return fileCont, nil
}
func readPemFile(file string) ([]byte, error) {
bytes, err := readFile(file)
if err != nil {
return nil, errors.Wrapf(err, "reading from file %s failed", file)
}
b, _ := pem.Decode(bytes)
if b == nil {
return nil, errors.Errorf("no pem content for file %s", file)
}
return bytes, nil
}