@@ -66,8 +66,11 @@ type StandardECCrypto struct {
66
66
type keylist map [string ]any
67
67
68
68
type StandardCrypto struct {
69
- // Lists of keys first sorted by algorithm
70
- keys map [string ]keylist
69
+ // Lists of keysByAlg first sorted by algorithm
70
+ keysByAlg map [string ]keylist
71
+
72
+ // Lists all keys by identifier.
73
+ keysByID keylist
71
74
}
72
75
73
76
// NewStandardCrypto Create a new instance of standard crypto
@@ -83,20 +86,26 @@ func NewStandardCrypto(cfg StandardConfig) (*StandardCrypto, error) {
83
86
}
84
87
85
88
func loadKeys (ks []KeyPairInfo ) (* StandardCrypto , error ) {
86
- keys := make (map [string ]keylist )
89
+ keysByAlg := make (map [string ]keylist )
90
+ keysByID := make (keylist )
87
91
for _ , k := range ks {
88
92
slog .Info ("crypto cfg loading" , "id" , k .KID , "alg" , k .Algorithm )
89
- if _ , ok := keys [k .Algorithm ]; ! ok {
90
- keys [k .Algorithm ] = make (map [string ]any )
93
+ if _ , ok := keysByID [k .KID ]; ok {
94
+ return nil , fmt .Errorf ("duplicate key identifier [%s]" , k .KID )
95
+ }
96
+ if _ , ok := keysByAlg [k .Algorithm ]; ! ok {
97
+ keysByAlg [k .Algorithm ] = make (map [string ]any )
91
98
}
92
99
loadedKey , err := loadKey (k )
93
100
if err != nil {
94
101
return nil , err
95
102
}
96
- keys [k.Algorithm ][k.KID ] = loadedKey
103
+ keysByAlg [k.Algorithm ][k.KID ] = loadedKey
104
+ keysByID [k .KID ] = loadedKey
97
105
}
98
106
return & StandardCrypto {
99
- keys : keys ,
107
+ keysByAlg : keysByAlg ,
108
+ keysByID : keysByID ,
100
109
}, nil
101
110
}
102
111
@@ -139,13 +148,14 @@ func loadKey(k KeyPairInfo) (any, error) {
139
148
}
140
149
141
150
func loadDeprecatedKeys (rsaKeys map [string ]StandardKeyInfo , ecKeys map [string ]StandardKeyInfo ) (* StandardCrypto , error ) {
142
- keys := make (map [string ]keylist )
151
+ keysByAlg := make (map [string ]keylist )
152
+ keysByID := make (keylist )
143
153
144
154
if len (ecKeys ) > 0 {
145
- keys [AlgorithmECP256R1 ] = make (map [string ]any )
155
+ keysByAlg [AlgorithmECP256R1 ] = make (map [string ]any )
146
156
}
147
157
if len (rsaKeys ) > 0 {
148
- keys [AlgorithmRSA2048 ] = make (map [string ]any )
158
+ keysByAlg [AlgorithmRSA2048 ] = make (map [string ]any )
149
159
}
150
160
151
161
for id , kasInfo := range rsaKeys {
@@ -169,7 +179,7 @@ func loadDeprecatedKeys(rsaKeys map[string]StandardKeyInfo, ecKeys map[string]St
169
179
return nil , fmt .Errorf ("ocrypto.NewAsymEncryption failed: %w" , err )
170
180
}
171
181
172
- keys [ AlgorithmRSA2048 ][ id ] = StandardRSACrypto {
182
+ k : = StandardRSACrypto {
173
183
KeyPairInfo : KeyPairInfo {
174
184
Algorithm : AlgorithmRSA2048 ,
175
185
KID : id ,
@@ -179,6 +189,8 @@ func loadDeprecatedKeys(rsaKeys map[string]StandardKeyInfo, ecKeys map[string]St
179
189
asymDecryption : asymDecryption ,
180
190
asymEncryption : asymEncryption ,
181
191
}
192
+ keysByAlg [AlgorithmRSA2048 ][id ] = k
193
+ keysByID [id ] = k
182
194
}
183
195
for id , kasInfo := range ecKeys {
184
196
slog .Info ("cfg.ECKeys" , "id" , id , "kasInfo" , kasInfo )
@@ -192,7 +204,7 @@ func loadDeprecatedKeys(rsaKeys map[string]StandardKeyInfo, ecKeys map[string]St
192
204
if err != nil {
193
205
return nil , fmt .Errorf ("failed to EC certificate file: %w" , err )
194
206
}
195
- keys [ AlgorithmECP256R1 ][ id ] = StandardECCrypto {
207
+ k : = StandardECCrypto {
196
208
KeyPairInfo : KeyPairInfo {
197
209
Algorithm : AlgorithmRSA2048 ,
198
210
KID : id ,
@@ -202,15 +214,18 @@ func loadDeprecatedKeys(rsaKeys map[string]StandardKeyInfo, ecKeys map[string]St
202
214
ecPrivateKeyPem : string (privatePemData ),
203
215
ecCertificatePEM : string (ecCertificatePEM ),
204
216
}
217
+ keysByAlg [AlgorithmECP256R1 ][id ] = k
218
+ keysByID [id ] = k
205
219
}
206
220
207
221
return & StandardCrypto {
208
- keys : keys ,
222
+ keysByAlg : keysByAlg ,
223
+ keysByID : keysByID ,
209
224
}, nil
210
225
}
211
226
212
227
func (s StandardCrypto ) FindKID (alg string ) string {
213
- if ks , ok := s .keys [alg ]; ok && len (ks ) > 0 {
228
+ if ks , ok := s .keysByAlg [alg ]; ok && len (ks ) > 0 {
214
229
for kid := range ks {
215
230
return kid
216
231
}
@@ -219,17 +234,13 @@ func (s StandardCrypto) FindKID(alg string) string {
219
234
}
220
235
221
236
func (s StandardCrypto ) RSAPublicKey (kid string ) (string , error ) {
222
- rsaKeys , ok := s .keys [AlgorithmRSA2048 ]
223
- if ! ok || len (rsaKeys ) == 0 {
224
- return "" , ErrCertNotFound
225
- }
226
- k , ok := rsaKeys [kid ]
237
+ k , ok := s .keysByID [kid ]
227
238
if ! ok {
228
- return "" , ErrCertNotFound
239
+ return "" , fmt . Errorf ( "no rsa key with id [%s]: %w" , kid , ErrCertNotFound )
229
240
}
230
241
rsa , ok := k .(StandardRSACrypto )
231
242
if ! ok {
232
- return "" , ErrCertNotFound
243
+ return "" , fmt . Errorf ( "key with id [%s] is not an RSA key: %w" , kid , ErrCertNotFound )
233
244
}
234
245
235
246
pem , err := rsa .asymEncryption .PublicKeyInPemFormat ()
@@ -241,27 +252,19 @@ func (s StandardCrypto) RSAPublicKey(kid string) (string, error) {
241
252
}
242
253
243
254
func (s StandardCrypto ) ECCertificate (kid string ) (string , error ) {
244
- ecKeys , ok := s .keys [AlgorithmECP256R1 ]
245
- if ! ok || len (ecKeys ) == 0 {
246
- return "" , ErrCertNotFound
247
- }
248
- k , ok := ecKeys [kid ]
255
+ k , ok := s .keysByID [kid ]
249
256
if ! ok {
250
- return "" , ErrCertNotFound
257
+ return "" , fmt . Errorf ( "no ec key with id [%s]: %w" , kid , ErrCertNotFound )
251
258
}
252
259
ec , ok := k .(StandardECCrypto )
253
260
if ! ok {
254
- return "" , ErrCertNotFound
261
+ return "" , fmt . Errorf ( "key with id [%s] is not an EC key: %w" , kid , ErrCertNotFound )
255
262
}
256
263
return ec .ecCertificatePEM , nil
257
264
}
258
265
259
266
func (s StandardCrypto ) ECPublicKey (kid string ) (string , error ) {
260
- ecKeys , ok := s .keys [AlgorithmECP256R1 ]
261
- if ! ok || len (ecKeys ) == 0 {
262
- return "" , ErrCertNotFound
263
- }
264
- k , ok := ecKeys [kid ]
267
+ k , ok := s .keysByID [kid ]
265
268
if ! ok {
266
269
return "" , ErrCertNotFound
267
270
}
@@ -293,11 +296,7 @@ func (s StandardCrypto) ECPublicKey(kid string) (string, error) {
293
296
}
294
297
295
298
func (s StandardCrypto ) RSADecrypt (_ crypto.Hash , kid string , _ string , ciphertext []byte ) ([]byte , error ) {
296
- rsaKeys , ok := s .keys [AlgorithmRSA2048 ]
297
- if ! ok || len (rsaKeys ) == 0 {
298
- return nil , ErrCertNotFound
299
- }
300
- k , ok := rsaKeys [kid ]
299
+ k , ok := s .keysByID [kid ]
301
300
if ! ok {
302
301
return nil , ErrCertNotFound
303
302
}
@@ -315,11 +314,10 @@ func (s StandardCrypto) RSADecrypt(_ crypto.Hash, kid string, _ string, cipherte
315
314
}
316
315
317
316
func (s StandardCrypto ) RSAPublicKeyAsJSON (kid string ) (string , error ) {
318
- rsaKeys , ok := s .keys [ AlgorithmRSA2048 ]
319
- if ! ok || len ( rsaKeys ) == 0 {
317
+ k , ok := s .keysByID [ kid ]
318
+ if ! ok {
320
319
return "" , ErrCertNotFound
321
320
}
322
- k , ok := rsaKeys [kid ]
323
321
if ! ok {
324
322
return "" , ErrCertNotFound
325
323
}
@@ -357,11 +355,7 @@ func (s StandardCrypto) GenerateNanoTDFSymmetricKey(kasKID string, ephemeralPubl
357
355
}
358
356
ephemeralECDSAPublicKeyPEM := pem .EncodeToMemory (pemBlock )
359
357
360
- ecKeys , ok := s .keys [AlgorithmECP256R1 ]
361
- if ! ok || len (ecKeys ) == 0 {
362
- return nil , ErrNoKeys
363
- }
364
- k , ok := ecKeys [kasKID ]
358
+ k , ok := s .keysByID [kasKID ]
365
359
if ! ok {
366
360
return nil , ErrKeyPairInfoNotFound
367
361
}
0 commit comments