1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
/*
* Copyright (c) 2020. Ant Group. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
package signature
import (
"encoding/base64"
"fmt"
"os"
"github.com/pkg/errors"
"github.com/containerd/nydus-snapshotter/pkg/label"
"github.com/containerd/nydus-snapshotter/pkg/utils/signer"
)
type Verifier struct {
signer *signer.Signer
force bool
}
func NewVerifier(publicKeyFile string, validateSignature bool) (*Verifier, error) {
res := &Verifier{
force: validateSignature,
}
if !validateSignature {
return res, nil
}
if publicKeyFile == "" {
return nil, errors.New("publicKeyFile is required")
}
if _, err := os.Stat(publicKeyFile); err != nil {
return nil, fmt.Errorf("failed to find publicKeyFile %q", publicKeyFile)
}
publicKeyByte, err := os.ReadFile(publicKeyFile)
if err != nil {
return nil, errors.Wrapf(err, "failed to read from publicKeyFile %q", publicKeyFile)
}
sign, err := signer.New(publicKeyByte)
if err != nil {
return nil, errors.Wrap(err, "failed to initialize signer")
}
res.signer = sign
return res, nil
}
func (v *Verifier) Verify(label map[string]string, bootstrapFile string) error {
signature, err := getFromLabel(label)
if err != nil {
return err
}
if signature == nil {
if v.force {
return errors.New("bootstrap signature is required when force validation")
}
return nil
}
if v.signer == nil {
return nil
}
f, err := os.Open(bootstrapFile)
if err != nil {
return err
}
defer f.Close()
return v.signer.Verify(f, signature)
}
func getFromLabel(labels map[string]string) ([]byte, error) {
if s, ok := labels[label.NydusSignature]; ok {
res, err := base64.StdEncoding.DecodeString(s)
if err != nil {
return nil, err
}
return res, nil
}
return nil, nil
}
// func Verify(label map[string]string, bootstrapFile, publicKey string, force bool) error {
// signature, err := getFromLabel(label)
// if err != nil {
// return err
// }
// // if we found signature on image manifest, we should verify it
// if signature == nil {
// if force {
// return errors.New("bootstrap signature is required when force validation")
// }
// return nil
// }
//
// publicKeyByte, err := ioutil.ReadFile(publicKey)
// if err != nil {
// return err
// }
// sign, err := signer.New(publicKeyByte)
// if err != nil {
// return err
// }
// f, err := os.Open(bootstrapFile)
// if err != nil {
// return err
// }
// defer f.Close()
// return sign.Verify(f, signature)
// }
|