...
1
5 package dsse
6
7 import (
8 "context"
9 "encoding/base64"
10 "errors"
11 )
12
13
14 var ErrNoSigners = errors.New("no signers provided")
15
16
17 type EnvelopeSigner struct {
18 providers []Signer
19 }
20
21
25 func NewEnvelopeSigner(p ...Signer) (*EnvelopeSigner, error) {
26 var providers []Signer
27
28 for _, s := range p {
29 if s != nil {
30 providers = append(providers, s)
31 }
32 }
33
34 if len(providers) == 0 {
35 return nil, ErrNoSigners
36 }
37
38 return &EnvelopeSigner{
39 providers: providers,
40 }, nil
41 }
42
43
50 func NewMultiEnvelopeSigner(threshold int, p ...Signer) (*EnvelopeSigner, error) {
51 return NewEnvelopeSigner(p...)
52 }
53
54
60 func (es *EnvelopeSigner) SignPayload(ctx context.Context, payloadType string, body []byte) (*Envelope, error) {
61 var e = Envelope{
62 Payload: base64.StdEncoding.EncodeToString(body),
63 PayloadType: payloadType,
64 }
65
66 paeEnc := PAE(payloadType, body)
67
68 for _, signer := range es.providers {
69 sig, err := signer.Sign(ctx, paeEnc)
70 if err != nil {
71 return nil, err
72 }
73 keyID, err := signer.KeyID()
74 if err != nil {
75 keyID = ""
76 }
77
78 e.Signatures = append(e.Signatures, Signature{
79 KeyID: keyID,
80 Sig: base64.StdEncoding.EncodeToString(sig),
81 })
82 }
83
84 return &e, nil
85 }
86
View as plain text