Skip to content

Commit 9e1a44e

Browse files
authored
Merge pull request #7 from scribe-security/feature/multi_sign
Feature/multi sign
2 parents 994000d + 1509a8f commit 9e1a44e

File tree

6 files changed

+405
-111
lines changed

6 files changed

+405
-111
lines changed

dsse/sign.go

+27-7
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ using the current algorithm, and the key used (if applicable).
6767
For an example see EcdsaSigner in sign_test.go.
6868
*/
6969
type 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.
8081
type EnvelopeSigner struct {
8182
providers []SignVerifier
82-
ev EnvelopeVerifier
83+
ev *envelopeVerifier
8384
}
8485

8586
/*
8687
NewEnvelopeSigner creates an EnvelopeSigner that uses 1+ Signer
8788
algorithms to sign the data.
89+
Creates a verifier with threshold=1, at least one of the providers must validate signitures successfully.
8890
*/
8991
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) {
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
145164
Verify decodes the payload and verifies the signature.
146165
Any domain specific validation such as parsing the decoded body and
147166
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.
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

Comments
 (0)