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 }