github.com/ewagmig/fabric@v2.1.1+incompatible/cmd/common/signer/signer_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package signer
     8  
     9  import (
    10  	"crypto/ecdsa"
    11  	"crypto/x509"
    12  	"encoding/pem"
    13  	"io/ioutil"
    14  	"os"
    15  	"path/filepath"
    16  	"testing"
    17  
    18  	"github.com/hyperledger/fabric/bccsp/utils"
    19  	"github.com/hyperledger/fabric/common/util"
    20  	"github.com/stretchr/testify/assert"
    21  )
    22  
    23  func TestSigner(t *testing.T) {
    24  	conf := Config{
    25  		MSPID:        "SampleOrg",
    26  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
    27  		KeyPath:      filepath.Join("testdata", "signer", "8150cb2d09628ccc89727611ebb736189f6482747eff9b8aaaa27e9a382d2e93_sk"),
    28  	}
    29  
    30  	signer, err := NewSigner(conf)
    31  	assert.NoError(t, err)
    32  
    33  	msg := []byte("foo")
    34  	sig, err := signer.Sign(msg)
    35  	assert.NoError(t, err)
    36  
    37  	r, s, err := utils.UnmarshalECDSASignature(sig)
    38  	ecdsa.Verify(&signer.key.PublicKey, util.ComputeSHA256(msg), r, s)
    39  }
    40  
    41  func TestSignerDifferentFormats(t *testing.T) {
    42  	key := `-----BEGIN EC PRIVATE KEY-----
    43  MHcCAQEEIOwCtOQIkowasuWoDQpXHgC547VHq+aBFaSyPOoV8mnGoAoGCCqGSM49
    44  AwEHoUQDQgAEEsrroAkPez9reWvJukufUqyfouJjakrKuhNBYuclkldqsLZ/TO+w
    45  ZsQXrlIqlmNalfYPX+NDDELqlpXQBeEqnA==
    46  -----END EC PRIVATE KEY-----`
    47  
    48  	pemBlock, _ := pem.Decode([]byte(key))
    49  	assert.NotNil(t, pemBlock)
    50  
    51  	ecPK, err := x509.ParseECPrivateKey(pemBlock.Bytes)
    52  	assert.NoError(t, err)
    53  
    54  	ec1, err := x509.MarshalECPrivateKey(ecPK)
    55  	assert.NoError(t, err)
    56  
    57  	pkcs8, err := x509.MarshalPKCS8PrivateKey(ecPK)
    58  	assert.NoError(t, err)
    59  
    60  	for _, testCase := range []struct {
    61  		description string
    62  		keyBytes    []byte
    63  	}{
    64  		{
    65  			description: "EC1",
    66  			keyBytes:    pem.EncodeToMemory(&pem.Block{Type: "EC Private Key", Bytes: ec1}),
    67  		},
    68  		{
    69  			description: "PKCS8",
    70  			keyBytes:    pem.EncodeToMemory(&pem.Block{Type: "Private Key", Bytes: pkcs8}),
    71  		},
    72  	} {
    73  		t.Run(testCase.description, func(t *testing.T) {
    74  			tmpFile, err := ioutil.TempFile("", "key")
    75  			assert.NoError(t, err)
    76  
    77  			defer os.Remove(tmpFile.Name())
    78  
    79  			err = ioutil.WriteFile(tmpFile.Name(), []byte(testCase.keyBytes), 0600)
    80  			assert.NoError(t, err)
    81  
    82  			signer, err := NewSigner(Config{
    83  				MSPID:        "MSPID",
    84  				IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
    85  				KeyPath:      tmpFile.Name(),
    86  			})
    87  
    88  			assert.NoError(t, err)
    89  			assert.NotNil(t, signer)
    90  		})
    91  	}
    92  }
    93  
    94  func TestSignerBadConfig(t *testing.T) {
    95  	conf := Config{
    96  		MSPID:        "SampleOrg",
    97  		IdentityPath: filepath.Join("testdata", "signer", "non_existent_cert"),
    98  	}
    99  
   100  	signer, err := NewSigner(conf)
   101  	assert.EqualError(t, err, "open testdata/signer/non_existent_cert: no such file or directory")
   102  	assert.Nil(t, signer)
   103  
   104  	conf = Config{
   105  		MSPID:        "SampleOrg",
   106  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   107  		KeyPath:      filepath.Join("testdata", "signer", "non_existent_cert"),
   108  	}
   109  
   110  	signer, err = NewSigner(conf)
   111  	assert.EqualError(t, err, "open testdata/signer/non_existent_cert: no such file or directory")
   112  	assert.Nil(t, signer)
   113  
   114  	conf = Config{
   115  		MSPID:        "SampleOrg",
   116  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   117  		KeyPath:      filepath.Join("testdata", "signer", "broken_private_key"),
   118  	}
   119  
   120  	signer, err = NewSigner(conf)
   121  	assert.EqualError(t, err, "failed to decode PEM block from testdata/signer/broken_private_key")
   122  	assert.Nil(t, signer)
   123  
   124  	conf = Config{
   125  		MSPID:        "SampleOrg",
   126  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   127  		KeyPath:      filepath.Join("testdata", "signer", "empty_private_key"),
   128  	}
   129  
   130  	signer, err = NewSigner(conf)
   131  	assert.EqualError(t, err, "failed to parse private key: x509: failed to parse EC private key: asn1: syntax error: sequence truncated")
   132  	assert.Nil(t, signer)
   133  }