plugin/plugin.go (73 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
// Package plugin implements the interface [github.com/notaryproject/notation-plugin-framework-go/plugin],
// enabling its use as a library in the notation-go package and to generate executable
package plugin
import (
"context"
"github.com/aws/aws-signer-notation-plugin/internal/client"
"github.com/aws/aws-signer-notation-plugin/internal/signer"
"github.com/aws/aws-signer-notation-plugin/internal/verifier"
"github.com/aws/aws-signer-notation-plugin/internal/version"
"github.com/notaryproject/notation-plugin-framework-go/plugin"
)
const Name = "com.amazonaws.signer.notation.plugin"
// AWSSignerPlugin provides functionality for signing and verification in accordance with the NotaryProject AWSSignerPlugin contract.
type AWSSignerPlugin struct {
awssigner client.Interface
}
// NewAWSSigner creates new AWSSignerPlugin
func NewAWSSigner(s client.Interface) *AWSSignerPlugin {
return &AWSSignerPlugin{awssigner: s}
}
// NewAWSSignerForCLI creates a new AWSSignerPlugin and is intended solely for generating executables.
func NewAWSSignerForCLI() *AWSSignerPlugin {
return &AWSSignerPlugin{}
}
// VerifySignature performs the extended verification of signature by optionally calling AWS Signer.
func (sp *AWSSignerPlugin) VerifySignature(ctx context.Context, req *plugin.VerifySignatureRequest) (*plugin.VerifySignatureResponse, error) {
if req == nil {
return nil, plugin.NewValidationError("verifySignature req is nil")
}
if err := req.Validate(); err != nil {
return nil, err
}
if err := sp.setSignerClientIfNotPresent(ctx, req.PluginConfig); err != nil {
return nil, err
}
return verifier.New(sp.awssigner).Verify(ctx, req)
}
// GetMetadata returns the metadata information of the plugin.
func (sp *AWSSignerPlugin) GetMetadata(_ context.Context, _ *plugin.GetMetadataRequest) (*plugin.GetMetadataResponse, error) {
return &plugin.GetMetadataResponse{
Name: Name,
Description: "AWS Signer plugin for Notation",
Version: version.GetVersion(),
URL: "https://docs.aws.amazon.com/signer",
SupportedContractVersions: []string{plugin.ContractVersion},
Capabilities: []plugin.Capability{
plugin.CapabilityEnvelopeGenerator,
plugin.CapabilityTrustedIdentityVerifier,
plugin.CapabilityRevocationCheckVerifier,
},
}, nil
}
// DescribeKey describes the key being used for signing. This method is not supported by AWS Signer's plugin.
func (sp *AWSSignerPlugin) DescribeKey(_ context.Context, _ *plugin.DescribeKeyRequest) (*plugin.DescribeKeyResponse, error) {
return nil, plugin.NewUnsupportedError("DescribeKey operation")
}
// GenerateSignature generates the raw signature. This method is not supported by AWS Signer's plugin.
func (sp *AWSSignerPlugin) GenerateSignature(_ context.Context, _ *plugin.GenerateSignatureRequest) (*plugin.GenerateSignatureResponse, error) {
return nil, plugin.NewUnsupportedError("GenerateSignature operation")
}
// GenerateEnvelope returns the signature envelope generated by calling AWS Signer.
func (sp *AWSSignerPlugin) GenerateEnvelope(ctx context.Context, req *plugin.GenerateEnvelopeRequest) (*plugin.GenerateEnvelopeResponse, error) {
if req == nil {
return nil, plugin.NewValidationError("generateEnvelope request is nil")
}
if err := req.Validate(); err != nil {
return nil, err
}
if err := sp.setSignerClientIfNotPresent(ctx, req.PluginConfig); err != nil {
return nil, err
}
return signer.New(sp.awssigner).GenerateEnvelope(ctx, req)
}
func (sp *AWSSignerPlugin) setSignerClientIfNotPresent(ctx context.Context, plConfig map[string]string) error {
if sp.awssigner == nil {
s, err := client.NewAWSSigner(ctx, plConfig)
if err != nil {
return err
}
sp.awssigner = s
}
return nil
}