@@ -76,56 +76,25 @@ func (sks *privateKeyStorageMultiAlg) initKeyRotation(pks *pkCollection, pksOnCh
76
76
77
77
// Load loads the private keys from disk and if necessary generates missing keys
78
78
func (sks * privateKeyStorageMultiAlg ) Load (pks * pkCollection , pksOnChange func () error ) error {
79
- populatePKFromSK := false
79
+ addPublicKeysToJWKS := false
80
80
if sks .signers == nil {
81
81
sks .signers = make (map [jwa.SignatureAlgorithm ]crypto.Signer )
82
82
}
83
83
if len (pks .jwks ) == 0 {
84
84
pks .jwks = []JWKS {NewJWKS ()}
85
- populatePKFromSK = true
85
+ addPublicKeysToJWKS = true
86
86
}
87
87
pksChanged := false
88
- // load oidc keys
88
+
89
89
for _ , alg := range sks .algs {
90
- filePath := sks .keyFilePath (alg , false )
91
- signer , err := readSignerFromFile (filePath , alg )
90
+ signer , changed , err := sks .loadOrGenerateSigner (alg , pks , addPublicKeysToJWKS )
92
91
if err != nil {
93
- // could not load key, generating a new one for this alg
94
- sk , pk , err := generateKeyPair (
95
- alg , sks .rsaKeyLen , keyLifetimeConf {
96
- NowIssued : true ,
97
- Expires : sks .rollover .Enabled ,
98
- Lifetime : sks .rollover .Interval .Duration (),
99
- },
100
- )
101
- if err != nil {
102
- return err
103
- }
104
- if err = writeSignerToFile (sk , sks .keyFilePath (alg , false )); err != nil {
105
- return err
106
- }
107
- if err = pks .jwks [0 ].AddKey (pk ); err != nil {
108
- return errors .WithStack (err )
109
- }
110
- pksChanged = true
111
- signer = sk
112
- } else if populatePKFromSK {
113
- pk , err := signerToPublicJWK (
114
- signer , alg , keyLifetimeConf {
115
- NowIssued : false ,
116
- Expires : sks .rollover .Enabled ,
117
- Lifetime : sks .rollover .Interval .Duration (),
118
- },
119
- )
120
- if err != nil {
121
- return err
122
- }
123
- if err = pks .jwks [0 ].AddKey (pk ); err != nil {
124
- return errors .WithStack (err )
125
- }
92
+ return err
126
93
}
94
+ pksChanged = pksChanged || changed
127
95
sks .signers [alg ] = signer
128
96
97
+ // Ensure the next key file exists for rollover
129
98
if ! fileutils .FileExists (sks .keyFilePath (alg , true )) {
130
99
_ , err = generateStoreAndSetNextPrivateKey (
131
100
pks , alg , sks .rsaKeyLen , keyLifetimeConf {
@@ -140,7 +109,8 @@ func (sks *privateKeyStorageMultiAlg) Load(pks *pkCollection, pksOnChange func()
140
109
}
141
110
}
142
111
}
143
- if populatePKFromSK || pksChanged {
112
+
113
+ if addPublicKeysToJWKS || pksChanged {
144
114
if err := pksOnChange (); err != nil {
145
115
return err
146
116
}
@@ -149,6 +119,49 @@ func (sks *privateKeyStorageMultiAlg) Load(pks *pkCollection, pksOnChange func()
149
119
return nil
150
120
}
151
121
122
+ // loadOrGenerateSigner loads a signer from disk or generates a new one if it doesn't exist.
123
+ // If addPublicKeysToJWKS is true, it also adds the public key to the pkCollection.
124
+ func (sks * privateKeyStorageMultiAlg ) loadOrGenerateSigner (
125
+ alg jwa.SignatureAlgorithm , pks * pkCollection , addPublicKeysToJWKS bool ,
126
+ ) (crypto.Signer , bool , error ) {
127
+ filePath := sks .keyFilePath (alg , false )
128
+ signer , err := readSignerFromFile (filePath , alg )
129
+ if err != nil {
130
+ // Could not load key, generating a new one for this alg
131
+ sk , pk , err := generateKeyPair (
132
+ alg ,
133
+ sks .rsaKeyLen ,
134
+ keyLifetimeConf {
135
+ NowIssued : true ,
136
+ Expires : sks .rollover .Enabled ,
137
+ Lifetime : sks .rollover .Interval .Duration (),
138
+ },
139
+ )
140
+ if err != nil {
141
+ return nil , false , err
142
+ }
143
+ if err = writeSignerToFile (sk , filePath ); err != nil {
144
+ return nil , false , err
145
+ }
146
+ pks .addCurrentJWK (pk )
147
+ return sk , true , nil
148
+ }
149
+ if addPublicKeysToJWKS {
150
+ pk , err := signerToPublicJWK (
151
+ signer , alg , keyLifetimeConf {
152
+ NowIssued : false ,
153
+ Expires : sks .rollover .Enabled ,
154
+ Lifetime : sks .rollover .Interval .Duration (),
155
+ },
156
+ )
157
+ if err != nil {
158
+ return nil , false , err
159
+ }
160
+ pks .addCurrentJWK (pk )
161
+ }
162
+ return signer , addPublicKeysToJWKS , nil
163
+ }
164
+
152
165
// GenerateNewKeys generates a new set of keys
153
166
func (sks * privateKeyStorageMultiAlg ) GenerateNewKeys (pks * pkCollection , pksOnChange func () error ) error {
154
167
futureKeys := NewJWKS ()
0 commit comments