@@ -67,7 +67,8 @@ using the current algorithm, and the key used (if applicable).
6767For an example see EcdsaSigner in sign_test.go.
6868*/
6969type Signer interface {
70- Sign (data []byte ) ([]byte , string , error )
70+ Sign (data []byte ) ([]byte , error )
71+ KeyID () (string , error )
7172}
7273
7374// SignVerifer provides both the signing and verification interface.
@@ -79,14 +80,25 @@ type SignVerifier interface {
7980// EnvelopeSigner creates signed Envelopes.
8081type EnvelopeSigner struct {
8182 providers []SignVerifier
82- ev EnvelopeVerifier
83+ ev * envelopeVerifier
8384}
8485
8586/*
8687NewEnvelopeSigner creates an EnvelopeSigner that uses 1+ Signer
8788algorithms to sign the data.
89+ Creates a verifier with threshold=1, at least one of the providers must validate signitures successfully.
8890*/
8991func 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 ) {
90102 var providers []SignVerifier
91103
92104 for _ , sv := range p {
@@ -104,11 +116,14 @@ func NewEnvelopeSigner(p ...SignVerifier) (*EnvelopeSigner, error) {
104116 evps = append (evps , p .(Verifier ))
105117 }
106118
119+ ev , err := NewMultiEnvelopeVerifier (threshold , evps ... )
120+ if err != nil {
121+ return nil , err
122+ }
123+
107124 return & EnvelopeSigner {
108125 providers : providers ,
109- ev : EnvelopeVerifier {
110- providers : evps ,
111- },
126+ ev : ev ,
112127 }, nil
113128}
114129
@@ -127,10 +142,14 @@ func (es *EnvelopeSigner) SignPayload(payloadType string, body []byte) (*Envelop
127142 paeEnc := PAE (payloadType , body )
128143
129144 for _ , signer := range es .providers {
130- sig , keyID , err := signer .Sign (paeEnc )
145+ sig , err := signer .Sign (paeEnc )
131146 if err != nil {
132147 return nil , err
133148 }
149+ keyID , err := signer .KeyID ()
150+ if err != nil {
151+ keyID = ""
152+ }
134153
135154 e .Signatures = append (e .Signatures , Signature {
136155 KeyID : keyID ,
@@ -145,8 +164,9 @@ func (es *EnvelopeSigner) SignPayload(payloadType string, body []byte) (*Envelop
145164Verify decodes the payload and verifies the signature.
146165Any domain specific validation such as parsing the decoded body and
147166validating 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.
148168*/
149- func (es * EnvelopeSigner ) Verify (e * Envelope ) error {
169+ func (es * EnvelopeSigner ) Verify (e * Envelope ) ([] AcceptedKey , error ) {
150170 return es .ev .Verify (e )
151171}
152172
0 commit comments