aboutsummaryrefslogtreecommitdiffstats
path: root/kube2msb/src/kube2msb/vendor/github.com/coreos/go-oidc/key/manager.go
blob: 476ab6a8d2b9261aa3d51c979683d6137d1ea8ca (plain)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package key

import (
	"errors"
	"time"

	"github.com/jonboulle/clockwork"

	"github.com/coreos/go-oidc/jose"
	"github.com/coreos/pkg/health"
)

type PrivateKeyManager interface {
	ExpiresAt() time.Time
	Signer() (jose.Signer, error)
	JWKs() ([]jose.JWK, error)
	PublicKeys() ([]PublicKey, error)

	WritableKeySetRepo
	health.Checkable
}

func NewPrivateKeyManager() PrivateKeyManager {
	return &privateKeyManager{
		clock: clockwork.NewRealClock(),
	}
}

type privateKeyManager struct {
	keySet *PrivateKeySet
	clock  clockwork.Clock
}

func (m *privateKeyManager) ExpiresAt() time.Time {
	if m.keySet == nil {
		return m.clock.Now().UTC()
	}

	return m.keySet.ExpiresAt()
}

func (m *privateKeyManager) Signer() (jose.Signer, error) {
	if err := m.Healthy(); err != nil {
		return nil, err
	}

	return m.keySet.Active().Signer(), nil
}

func (m *privateKeyManager) JWKs() ([]jose.JWK, error) {
	if err := m.Healthy(); err != nil {
		return nil, err
	}

	keys := m.keySet.Keys()
	jwks := make([]jose.JWK, len(keys))
	for i, k := range keys {
		jwks[i] = k.JWK()
	}
	return jwks, nil
}

func (m *privateKeyManager) PublicKeys() ([]PublicKey, error) {
	jwks, err := m.JWKs()
	if err != nil {
		return nil, err
	}
	keys := make([]PublicKey, len(jwks))
	for i, jwk := range jwks {
		keys[i] = *NewPublicKey(jwk)
	}
	return keys, nil
}

func (m *privateKeyManager) Healthy() error {
	if m.keySet == nil {
		return errors.New("private key manager uninitialized")
	}

	if len(m.keySet.Keys()) == 0 {
		return errors.New("private key manager zero keys")
	}

	if m.keySet.ExpiresAt().Before(m.clock.Now().UTC()) {
		return errors.New("private key manager keys expired")
	}

	return nil
}

func (m *privateKeyManager) Set(keySet KeySet) error {
	privKeySet, ok := keySet.(*PrivateKeySet)
	if !ok {
		return errors.New("unable to cast to PrivateKeySet")
	}

	m.keySet = privKeySet
	return nil
}