-
Notifications
You must be signed in to change notification settings - Fork 109
/
composite_signer.go
75 lines (64 loc) · 2.03 KB
/
composite_signer.go
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
// Package composite provides a composite signer.
package composite
import (
"errors"
"io"
"github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
)
// SignerName is the name used to identify the composite signer.
const SignerName = "composite"
// FactoryConfig is the composite factory configuration.
type FactoryConfig map[signature.SignerRole]signature.SignerFactory
// SignerFactory is a SignerFactory that is a composite of multiple other
// SignerFactory(s).
type SignerFactory struct {
inner FactoryConfig
}
// EnsureRole ensures that the SignerFactory is configured for the given
// role.
func (sf *SignerFactory) EnsureRole(role signature.SignerRole) error {
for k := range sf.inner {
if k == role {
return nil
}
}
return signature.ErrRoleMismatch
}
// Generate will generate and persist an new private key corresponding to
// the provided role, and return a Signer ready for use.
func (sf *SignerFactory) Generate(role signature.SignerRole, rng io.Reader) (signature.Signer, error) {
factory, ok := sf.inner[role]
if !ok {
return nil, signature.ErrRoleMismatch
}
return factory.Generate(role, rng)
}
// Load will load the private key corresponding to the role, and return a Signer
// ready for use.
func (sf *SignerFactory) Load(role signature.SignerRole) (signature.Signer, error) {
factory, ok := sf.inner[role]
if !ok {
return nil, signature.ErrRoleMismatch
}
return factory.Load(role)
}
// NewFactory creates a new factory with the specified roles, with the
// specified pre-created SignerFactory(s).
func NewFactory(config interface{}, roles ...signature.SignerRole) (signature.SignerFactory, error) {
cfg, ok := config.(FactoryConfig)
if !ok {
return nil, errors.New("signature/signer/composite: invalid composite signer configuration provided")
}
sf := &SignerFactory{
inner: make(FactoryConfig),
}
// Treat the roles vector as canonical.
for _, v := range roles {
factory, ok := cfg[v]
if !ok || factory == nil {
return nil, signature.ErrRoleMismatch
}
sf.inner[v] = factory
}
return sf, nil
}