@@ -67,7 +67,8 @@ using the current algorithm, and the key used (if applicable).
67
67
For an example see EcdsaSigner in sign_test.go.
68
68
*/
69
69
type Signer interface {
70
- Sign (data []byte ) ([]byte , string , error )
70
+ Sign (data []byte ) ([]byte , error )
71
+ KeyID () (string , error )
71
72
}
72
73
73
74
// SignVerifer provides both the signing and verification interface.
@@ -79,14 +80,25 @@ type SignVerifier interface {
79
80
// EnvelopeSigner creates signed Envelopes.
80
81
type EnvelopeSigner struct {
81
82
providers []SignVerifier
82
- ev EnvelopeVerifier
83
+ ev * envelopeVerifier
83
84
}
84
85
85
86
/*
86
87
NewEnvelopeSigner creates an EnvelopeSigner that uses 1+ Signer
87
88
algorithms to sign the data.
89
+ Creates a verifier with threshold=1, at least one of the providers must validate signitures successfully.
88
90
*/
89
91
func NewEnvelopeSigner (p ... SignVerifier ) (* EnvelopeSigner , error ) {
92
+ return NewMultiEnvelopeSigner (1 , p ... )
93
+ }
94
+
95
+ /*
96
+ NewMultiEnvelopeSigner creates an EnvelopeSigner that uses 1+ Signer
97
+ algorithms to sign the data.
98
+ Creates a verifier with threshold.
99
+ threashold indicates the amount of providers that must validate the envelope.
100
+ */
101
+ func NewMultiEnvelopeSigner (threshold int , p ... SignVerifier ) (* EnvelopeSigner , error ) {
90
102
var providers []SignVerifier
91
103
92
104
for _ , sv := range p {
@@ -104,11 +116,14 @@ func NewEnvelopeSigner(p ...SignVerifier) (*EnvelopeSigner, error) {
104
116
evps = append (evps , p .(Verifier ))
105
117
}
106
118
119
+ ev , err := NewMultiEnvelopeVerifier (threshold , evps ... )
120
+ if err != nil {
121
+ return nil , err
122
+ }
123
+
107
124
return & EnvelopeSigner {
108
125
providers : providers ,
109
- ev : EnvelopeVerifier {
110
- providers : evps ,
111
- },
126
+ ev : ev ,
112
127
}, nil
113
128
}
114
129
@@ -127,10 +142,14 @@ func (es *EnvelopeSigner) SignPayload(payloadType string, body []byte) (*Envelop
127
142
paeEnc := PAE (payloadType , body )
128
143
129
144
for _ , signer := range es .providers {
130
- sig , keyID , err := signer .Sign (paeEnc )
145
+ sig , err := signer .Sign (paeEnc )
131
146
if err != nil {
132
147
return nil , err
133
148
}
149
+ keyID , err := signer .KeyID ()
150
+ if err != nil {
151
+ keyID = ""
152
+ }
134
153
135
154
e .Signatures = append (e .Signatures , Signature {
136
155
KeyID : keyID ,
@@ -145,8 +164,9 @@ func (es *EnvelopeSigner) SignPayload(payloadType string, body []byte) (*Envelop
145
164
Verify decodes the payload and verifies the signature.
146
165
Any domain specific validation such as parsing the decoded body and
147
166
validating the payload type is left out to the caller.
167
+ Verify returns a list of accepted keys each including a keyid, public and signiture of the accepted provider keys.
148
168
*/
149
- func (es * EnvelopeSigner ) Verify (e * Envelope ) error {
169
+ func (es * EnvelopeSigner ) Verify (e * Envelope ) ([] AcceptedKey , error ) {
150
170
return es .ev .Verify (e )
151
171
}
152
172
0 commit comments