12
12
from .exception import DeSerializationNotPossible
13
13
from .exception import JWKException
14
14
from .exception import UnknownKeyType
15
+ from .exception import UnsupportedAlgorithm
16
+ from .exception import UnsupportedECurve
15
17
from .exception import UpdateFailed
16
18
from .jwk .ec import ECKey
17
19
from .jwk .ec import import_private_key_from_file
36
38
# _err = json.dumps({'error': error, 'error_description': descr})
37
39
# raise excep(_err, 'application/json')
38
40
39
-
41
+ # Make sure the keys are all uppercase
40
42
K2C = {
41
43
"RSA" : RSAKey ,
42
44
"EC" : ECKey ,
43
- "oct " : SYMKey ,
45
+ "OCT " : SYMKey ,
44
46
}
45
47
46
48
MAP = {'dec' : 'enc' , 'enc' : 'enc' , 'ver' : 'sig' , 'sig' : 'sig' }
@@ -242,33 +244,39 @@ def do_keys(self, keys):
242
244
:return:
243
245
"""
244
246
for inst in keys :
245
- typ = inst ["kty" ]
247
+ inst ['kty' ] = inst ["kty" ].upper ()
248
+ _typ = inst ['kty' ]
246
249
try :
247
250
_usage = harmonize_usage (inst ['use' ])
248
251
except KeyError :
249
252
_usage = ['' ]
250
253
else :
251
254
del inst ['use' ]
252
255
253
- flag = 0
256
+ _error = ''
254
257
for _use in _usage :
255
- for _typ in [typ , typ .lower (), typ .upper ()]:
256
- try :
257
- _key = K2C [_typ ](use = _use , ** inst )
258
- except KeyError :
259
- continue
260
- except JWKException as err :
261
- LOGGER .warning ('While loading keys: %s' , err )
262
- else :
263
- if _key not in self ._keys :
264
- if not _key .kid :
265
- _key .add_kid ()
266
- self ._keys .append (_key )
267
- flag = 1
268
- break
269
- if not flag :
270
- LOGGER .warning (
271
- 'While loading keys, UnknownKeyType: %s' , typ )
258
+ try :
259
+ _key = K2C [_typ ](use = _use , ** inst )
260
+ except KeyError :
261
+ _error = 'UnknownKeyType: {}' .format (_typ )
262
+ continue
263
+ except (UnsupportedECurve , UnsupportedAlgorithm ) as err :
264
+ _error = str (err )
265
+ break
266
+ except JWKException as err :
267
+ LOGGER .warning ('While loading keys: %s' , err )
268
+ _error = str (err )
269
+ else :
270
+ if _key not in self ._keys :
271
+ if not _key .kid :
272
+ _key .add_kid ()
273
+ self ._keys .append (_key )
274
+ _error = ''
275
+ break
276
+ if _error :
277
+ LOGGER .warning ('While loading keys, %s' , _error )
278
+
279
+ self .last_updated = time .time ()
272
280
273
281
def do_local_jwk (self , filename ):
274
282
"""
@@ -282,8 +290,6 @@ def do_local_jwk(self, filename):
282
290
else :
283
291
self .do_keys ([_info ])
284
292
285
- self .last_updated = time .time ()
286
-
287
293
def do_local_der (self , filename , keytype , keyusage = None , kid = '' ):
288
294
"""
289
295
Load a DER encoded file amd create a key from it.
@@ -292,29 +298,25 @@ def do_local_der(self, filename, keytype, keyusage=None, kid=''):
292
298
:param keytype: Presently 'rsa' and 'ec' supported
293
299
:param keyusage: encryption ('enc') or signing ('sig') or both
294
300
"""
295
- if keytype .lower () == 'rsa' :
296
- _bkey = import_private_rsa_key_from_file (filename )
297
- _key = RSAKey ().load_key (_bkey )
298
- elif keytype .lower () == 'ec' :
299
- _bkey = import_private_key_from_file (filename )
300
- _key = ECKey ().load_key (_bkey )
301
+ key_args = {}
302
+ _kty = keytype .lower ()
303
+ if _kty in ['rsa' , 'ec' ]:
304
+ key_args ["kty" ] = _kty
305
+ _key = import_private_rsa_key_from_file (filename )
306
+ key_args ["priv_key" ] = _key
307
+ key_args ["pub_key" ] = _key .public_key ()
301
308
else :
302
- raise NotImplementedError ('No support for DER decoding of that key type' )
309
+ raise NotImplementedError ('No support for DER decoding of key type {}' . format ( _kty ) )
303
310
304
311
if not keyusage :
305
- keyusage = ["enc" , "sig" ]
312
+ key_args [ "use" ] = ["enc" , "sig" ]
306
313
else :
307
- keyusage = harmonize_usage (keyusage )
314
+ key_args [ "use" ] = harmonize_usage (keyusage )
308
315
309
- for use in keyusage :
310
- _key .use = use
311
- if kid :
312
- _key .kid = kid
313
- if not _key .kid :
314
- _key .add_kid ()
315
- self ._keys .append (_key )
316
+ if kid :
317
+ key_args ['kid' ] = kid
316
318
317
- self .last_updated = time . time ( )
319
+ self .do_keys ([ key_args ] )
318
320
319
321
def do_remote (self ):
320
322
"""
0 commit comments