github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/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/osdi23p228/fabric/bccsp/utils"
    19  	"github.com/osdi23p228/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  	assert.NoError(t, err)
    39  	ecdsa.Verify(&signer.key.PublicKey, util.ComputeSHA256(msg), r, s)
    40  }
    41  
    42  func TestSignerDifferentFormats(t *testing.T) {
    43  	key := `-----BEGIN EC PRIVATE KEY-----
    44  MHcCAQEEIOwCtOQIkowasuWoDQpXHgC547VHq+aBFaSyPOoV8mnGoAoGCCqGSM49
    45  AwEHoUQDQgAEEsrroAkPez9reWvJukufUqyfouJjakrKuhNBYuclkldqsLZ/TO+w
    46  ZsQXrlIqlmNalfYPX+NDDELqlpXQBeEqnA==
    47  -----END EC PRIVATE KEY-----`
    48  
    49  	pemBlock, _ := pem.Decode([]byte(key))
    50  	assert.NotNil(t, pemBlock)
    51  
    52  	ecPK, err := x509.ParseECPrivateKey(pemBlock.Bytes)
    53  	assert.NoError(t, err)
    54  
    55  	ec1, err := x509.MarshalECPrivateKey(ecPK)
    56  	assert.NoError(t, err)
    57  
    58  	pkcs8, err := x509.MarshalPKCS8PrivateKey(ecPK)
    59  	assert.NoError(t, err)
    60  
    61  	for _, testCase := range []struct {
    62  		description string
    63  		keyBytes    []byte
    64  	}{
    65  		{
    66  			description: "EC1",
    67  			keyBytes:    pem.EncodeToMemory(&pem.Block{Type: "EC Private Key", Bytes: ec1}),
    68  		},
    69  		{
    70  			description: "PKCS8",
    71  			keyBytes:    pem.EncodeToMemory(&pem.Block{Type: "Private Key", Bytes: pkcs8}),
    72  		},
    73  	} {
    74  		t.Run(testCase.description, func(t *testing.T) {
    75  			tmpFile, err := ioutil.TempFile("", "key")
    76  			assert.NoError(t, err)
    77  
    78  			defer os.Remove(tmpFile.Name())
    79  
    80  			err = ioutil.WriteFile(tmpFile.Name(), []byte(testCase.keyBytes), 0600)
    81  			assert.NoError(t, err)
    82  
    83  			signer, err := NewSigner(Config{
    84  				MSPID:        "MSPID",
    85  				IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
    86  				KeyPath:      tmpFile.Name(),
    87  			})
    88  
    89  			assert.NoError(t, err)
    90  			assert.NotNil(t, signer)
    91  		})
    92  	}
    93  }
    94  
    95  func TestSignerBadConfig(t *testing.T) {
    96  	conf := Config{
    97  		MSPID:        "SampleOrg",
    98  		IdentityPath: filepath.Join("testdata", "signer", "non_existent_cert"),
    99  	}
   100  
   101  	signer, err := NewSigner(conf)
   102  	assert.EqualError(t, err, "open testdata/signer/non_existent_cert: no such file or directory")
   103  	assert.Nil(t, signer)
   104  
   105  	conf = Config{
   106  		MSPID:        "SampleOrg",
   107  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   108  		KeyPath:      filepath.Join("testdata", "signer", "non_existent_cert"),
   109  	}
   110  
   111  	signer, err = NewSigner(conf)
   112  	assert.EqualError(t, err, "open testdata/signer/non_existent_cert: no such file or directory")
   113  	assert.Nil(t, signer)
   114  
   115  	conf = Config{
   116  		MSPID:        "SampleOrg",
   117  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   118  		KeyPath:      filepath.Join("testdata", "signer", "broken_private_key"),
   119  	}
   120  
   121  	signer, err = NewSigner(conf)
   122  	assert.EqualError(t, err, "failed to decode PEM block from testdata/signer/broken_private_key")
   123  	assert.Nil(t, signer)
   124  
   125  	conf = Config{
   126  		MSPID:        "SampleOrg",
   127  		IdentityPath: filepath.Join("testdata", "signer", "cert.pem"),
   128  		KeyPath:      filepath.Join("testdata", "signer", "empty_private_key"),
   129  	}
   130  
   131  	signer, err = NewSigner(conf)
   132  	assert.EqualError(t, err, "failed to parse private key: x509: failed to parse EC private key: asn1: syntax error: sequence truncated")
   133  	assert.Nil(t, signer)
   134  }