Skip to content

Commit dc1439c

Browse files
author
zaihaoyin
committed
refactor:keep sign interface unchanged. pass keyspec as parameter to provider
Signed-off-by: zaihaoyin <[email protected]>
1 parent a2f21d6 commit dc1439c

File tree

6 files changed

+36
-54
lines changed

6 files changed

+36
-54
lines changed

signature/plugin.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
"github.com/notaryproject/notation-core-go/signature"
12+
"github.com/notaryproject/notation-core-go/signature/jws"
1213
"github.com/notaryproject/notation-go"
1314
"github.com/notaryproject/notation-go/plugin"
1415
)
@@ -25,13 +26,16 @@ type pluginSigner struct {
2526
// by delegating the one or more operations to the named plugin,
2627
// as defined in
2728
// https://github.com/notaryproject/notaryproject/blob/main/specs/plugin-extensibility.md#signing-interfaces.
28-
func NewSignerPlugin(runner plugin.Runner, keyID string, pluginConfig map[string]string, envelopeMediaType string) (notation.Signer, error) {
29+
func NewSignerPlugin(runner plugin.Runner, keyID string, pluginConfig map[string]string) (notation.Signer, error) {
2930
if runner == nil {
3031
return nil, errors.New("nil plugin runner")
3132
}
3233
if keyID == "" {
3334
return nil, errors.New("nil signing keyID")
3435
}
36+
37+
// TODO: pass media type as a parameter.
38+
envelopeMediaType := jws.MediaTypeEnvelope
3539
if err := ValidateEnvelopeMediaType(envelopeMediaType); err != nil {
3640
return nil, err
3741
}
@@ -115,8 +119,14 @@ func (s *pluginSigner) generateSignature(ctx context.Context, desc notation.Desc
115119
return nil, fmt.Errorf("envelope payload can't be marshaled: %w", err)
116120
}
117121

118-
// Create plugin signature provider
119-
s.sigProvider.SetConfig(config)
122+
// for external plugin, pass keySpec and config before signing
123+
if extProvider, ok := s.sigProvider.(*externalProvider); ok {
124+
ks, err := plugin.ParseKeySpec(key.KeySpec)
125+
if err != nil {
126+
return nil, err
127+
}
128+
extProvider.prepareSigning(config, ks)
129+
}
120130
signReq := &signature.SignRequest{
121131
Payload: signature.Payload{
122132
ContentType: notation.MediaTypePayloadV1,
@@ -125,8 +135,8 @@ func (s *pluginSigner) generateSignature(ctx context.Context, desc notation.Desc
125135
Signer: s.sigProvider,
126136
SigningTime: time.Now(),
127137
ExtendedSignedAttributes: nil,
128-
SigningAgent: notation.SigningAgent,
129138
SigningScheme: signature.SigningSchemeX509,
139+
SigningAgent: notation.SigningAgent, // TODO: include external signing plugin's name and version. https://github.com/notaryproject/notation-go/issues/80
130140
}
131141

132142
if !opts.Expiry.IsZero() {

signature/provider.go

+4-38
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ var builtInPluginMetaData = plugin.Metadata{
2424
type provider interface {
2525
plugin.Runner
2626
signature.Signer
27-
SetConfig(map[string]string)
2827
}
2928

3029
// builtinProvider is a builtin provider implementation
@@ -53,9 +52,6 @@ func (*builtinProvider) metadata() *plugin.Metadata {
5352
return &builtInPluginMetaData
5453
}
5554

56-
// SetConfig sets config when signing.
57-
func (*builtinProvider) SetConfig(map[string]string) {}
58-
5955
// Run implements the plugin workflow.
6056
//
6157
// builtinProvider only supports metadata and describe key.
@@ -96,27 +92,10 @@ func newExternalProvider(runner plugin.Runner, keyID string) provider {
9692
}
9793
}
9894

99-
// SetConfig sets up config used by signing.
100-
func (p *externalProvider) SetConfig(cfg map[string]string) {
95+
// prepareSigning sets up config and keySpec used to sign.
96+
func (p *externalProvider) prepareSigning(cfg map[string]string, keySpec signature.KeySpec) {
10197
p.config = cfg
102-
}
103-
104-
// describeKey invokes plugin's DescribeKey command.
105-
func (p *externalProvider) describeKey(ctx context.Context) (*plugin.DescribeKeyResponse, error) {
106-
req := &plugin.DescribeKeyRequest{
107-
ContractVersion: plugin.ContractVersion,
108-
KeyID: p.keyID,
109-
PluginConfig: p.config,
110-
}
111-
out, err := p.Run(ctx, req)
112-
if err != nil {
113-
return nil, fmt.Errorf("describe-key command failed: %w", err)
114-
}
115-
resp, ok := out.(*plugin.DescribeKeyResponse)
116-
if !ok {
117-
return nil, fmt.Errorf("plugin runner returned incorrect describe-key response type '%T'", out)
118-
}
119-
return resp, nil
98+
p.keySpec = keySpec
12099
}
121100

122101
// Sign signs the digest by calling the underlying plugin.
@@ -159,18 +138,5 @@ func (p *externalProvider) Sign(payload []byte) ([]byte, []*x509.Certificate, er
159138

160139
// KeySpec returns the keySpec of a keyID by calling describeKey and do some keySpec validation.
161140
func (p *externalProvider) KeySpec() (signature.KeySpec, error) {
162-
if p.keySpec != (signature.KeySpec{}) {
163-
return p.keySpec, nil
164-
}
165-
keyResp, err := p.describeKey(context.Background())
166-
if err != nil {
167-
return signature.KeySpec{}, err
168-
}
169-
170-
// Check keyID is honored.
171-
if p.keyID != keyResp.KeyID {
172-
return signature.KeySpec{}, fmt.Errorf("keyID in describeKey response %q does not match request %q", keyResp.KeyID, p.keyID)
173-
}
174-
p.keySpec, err = plugin.ParseKeySpec(keyResp.KeySpec)
175-
return p.keySpec, err
141+
return p.keySpec, nil
176142
}

signature/signer.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import (
77
"errors"
88
"fmt"
99

10+
"github.com/notaryproject/notation-core-go/signature/jws"
1011
"github.com/notaryproject/notation-go"
1112
)
1213

1314
// NewSignerFromFiles creates a signer from key, certificate files
1415
// TODO: Add tests for this method. https://github.com/notaryproject/notation-go/issues/80
15-
func NewSignerFromFiles(keyPath, certPath, envelopeMediaType string) (notation.Signer, error) {
16+
func NewSignerFromFiles(keyPath, certPath string) (notation.Signer, error) {
1617
if keyPath == "" {
1718
return nil, errors.New("key path not specified")
1819
}
@@ -39,14 +40,17 @@ func NewSignerFromFiles(keyPath, certPath, envelopeMediaType string) (notation.S
3940
}
4041

4142
// create signer
42-
return NewSigner(cert.PrivateKey, certs, envelopeMediaType)
43+
return NewSigner(cert.PrivateKey, certs)
4344
}
4445

4546
// NewSigner creates a signer with the recommended signing method and a signing key bundled
4647
// with a certificate chain.
4748
// The relation of the provided signing key and its certificate chain is not verified,
4849
// and should be verified by the caller.
49-
func NewSigner(key crypto.PrivateKey, certChain []*x509.Certificate, envelopeMediaType string) (notation.Signer, error) {
50+
func NewSigner(key crypto.PrivateKey, certChain []*x509.Certificate) (notation.Signer, error) {
51+
// TODO: pass media type as a parameter
52+
envelopeMediaType := jws.MediaTypeEnvelope
53+
5054
builtinProvider, err := newBuiltinProvider(key, certChain)
5155
if err != nil {
5256
return nil, err

signature/signer_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func testSignerFromFile(t *testing.T, keyCert *keyCertPair, envelopeType, dir st
118118
if err != nil {
119119
t.Fatalf("prepareTestKeyCertFile() failed: %v", err)
120120
}
121-
s, err := NewSignerFromFiles(keyPath, certPath, envelopeType)
121+
s, err := NewSignerFromFiles(keyPath, certPath)
122122
if err != nil {
123123
t.Fatalf("NewSignerFromFiles() failed: %v", err)
124124
}
@@ -161,7 +161,7 @@ func TestSignWithTimestamp(t *testing.T) {
161161
for _, envelopeType := range signature.RegisteredEnvelopeTypes() {
162162
for _, keyCert := range keyCertPairCollections {
163163
t.Run(fmt.Sprintf("envelopeType=%v_keySpec=%v", envelopeType, keyCert.keySpecName), func(t *testing.T) {
164-
s, err := NewSigner(keyCert.key, keyCert.certs, envelopeType)
164+
s, err := NewSigner(keyCert.key, keyCert.certs)
165165
if err != nil {
166166
t.Fatalf("NewSigner() error = %v", err)
167167
}
@@ -192,7 +192,7 @@ func TestSignWithoutExpiry(t *testing.T) {
192192
for _, envelopeType := range signature.RegisteredEnvelopeTypes() {
193193
for _, keyCert := range keyCertPairCollections {
194194
t.Run(fmt.Sprintf("envelopeType=%v_keySpec=%v", envelopeType, keyCert.keySpecName), func(t *testing.T) {
195-
s, err := NewSigner(keyCert.key, keyCert.certs, envelopeType)
195+
s, err := NewSigner(keyCert.key, keyCert.certs)
196196
if err != nil {
197197
t.Fatalf("NewSigner() error = %v", err)
198198
}
@@ -246,7 +246,7 @@ func TestExternalSigner_Sign(t *testing.T) {
246246
for _, envelopeType := range signature.RegisteredEnvelopeTypes() {
247247
for _, keyCert := range keyCertPairCollections {
248248
externalRunner := newMockProvider(keyCert.key, keyCert.certs, testKeyID)
249-
s, err := NewSignerPlugin(externalRunner, testKeyID, nil, envelopeType)
249+
s, err := NewSignerPlugin(externalRunner, testKeyID, nil)
250250
if err != nil {
251251
t.Fatalf("NewSigner() error = %v", err)
252252
}
@@ -266,7 +266,7 @@ func TestExternalSigner_SignEnvelope(t *testing.T) {
266266
t.Run(fmt.Sprintf("envelopeType=%v_keySpec=%v", envelopeType, keyCert.keySpecName), func(t *testing.T) {
267267
externalRunner := newMockEnvelopeProvider(keyCert.key, keyCert.certs, testKeyID)
268268
p := newExternalProvider(externalRunner, testKeyID)
269-
s, err := NewSignerPlugin(p, testKeyID, nil, envelopeType)
269+
s, err := NewSignerPlugin(p, testKeyID, nil)
270270
if err != nil {
271271
t.Fatalf("NewSigner() error = %v", err)
272272
}
@@ -338,7 +338,7 @@ func basicVerification(t *testing.T, sig []byte, envelopeType string, trust *x50
338338
}
339339

340340
func validateSignWithCerts(t *testing.T, envelopeType string, key crypto.PrivateKey, certs []*x509.Certificate) {
341-
s, err := NewSigner(key, certs, envelopeType)
341+
s, err := NewSigner(key, certs)
342342
if err != nil {
343343
t.Fatalf("NewSigner() error = %v", err)
344344
}

signature/verifier.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88

99
"github.com/notaryproject/notation-core-go/signature"
10+
"github.com/notaryproject/notation-core-go/signature/jws"
1011
x509n "github.com/notaryproject/notation-core-go/x509"
1112
"github.com/notaryproject/notation-go"
1213
)
@@ -51,7 +52,8 @@ func ValidatePayloadContentType(payload *signature.Payload) error {
5152
// Verify verifies the signature and returns the verified descriptor and
5253
// metadata of the signed artifact.
5354
func (v *Verifier) Verify(_ context.Context, sig []byte, opts notation.VerifyOptions) (notation.Descriptor, error) {
54-
sigEnv, err := signature.ParseEnvelope(opts.SignatureMediaType, sig)
55+
// TODO: pass media type as a parameter
56+
sigEnv, err := signature.ParseEnvelope(jws.MediaTypeEnvelope, sig)
5557
if err != nil {
5658
return notation.Descriptor{}, err
5759
}

signature/verifier_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func testVerifierFromFile(t *testing.T, keyCert *keyCertPair, envelopeType, dir
2222
if err != nil {
2323
t.Fatalf("prepare key cert file failed: %v", err)
2424
}
25-
s, err := NewSignerFromFiles(keyPath, certPath, envelopeType)
25+
s, err := NewSignerFromFiles(keyPath, certPath)
2626
if err != nil {
2727
t.Fatalf("NewSignerFromFiles() failed: %v", err)
2828
}
@@ -67,7 +67,7 @@ func TestVerifyWithCertChain(t *testing.T) {
6767
for _, envelopeType := range signature.RegisteredEnvelopeTypes() {
6868
for _, keyCert := range keyCertPairCollections {
6969
t.Run(fmt.Sprintf("envelopeType=%v_keySpec=%v", envelopeType, keyCert.keySpecName), func(t *testing.T) {
70-
s, err := NewSigner(keyCert.key, keyCert.certs, envelopeType)
70+
s, err := NewSigner(keyCert.key, keyCert.certs)
7171
if err != nil {
7272
t.Fatalf("NewSigner() error = %v", err)
7373
}

0 commit comments

Comments
 (0)