1212
1313from Crypto .PublicKey import RSA
1414from Crypto .Signature import PKCS1_v1_5
15+ from Crypto .Util .asn1 import DerSequence
1516
1617import ecdsa
1718
@@ -188,18 +189,24 @@ def __init__(self, key, algorithm):
188189 return
189190
190191 if isinstance (key , dict ):
191- self .prepared_key = self . _process_jwk (key )
192+ self ._process_jwk (key )
192193 return
193194
194195 if isinstance (key , six .string_types ):
195196 if isinstance (key , six .text_type ):
196197 key = key .encode ('utf-8' )
197198
199+ if key .startswith (b'-----BEGIN CERTIFICATE-----' ):
200+ try :
201+ self ._process_cert (key )
202+ except Exception as e :
203+ raise JWKError (e )
204+ return
205+
198206 try :
199207 self .prepared_key = RSA .importKey (key )
200208 except Exception as e :
201209 raise JWKError (e )
202-
203210 return
204211
205212 raise JWKError ('Unable to parse an RSA_JWK from key: %s' % key )
@@ -214,6 +221,16 @@ def _process_jwk(self, jwk_dict):
214221 self .prepared_key = RSA .construct ((n , e ))
215222 return self .prepared_key
216223
224+ def _process_cert (self , key ):
225+ pemLines = key .replace (b' ' , b'' ).split ()
226+ certDer = base64url_decode (b'' .join (pemLines [1 :- 1 ]))
227+ certSeq = DerSequence ()
228+ certSeq .decode (certDer )
229+ tbsSeq = DerSequence ()
230+ tbsSeq .decode (certSeq [0 ])
231+ self .prepared_key = RSA .importKey (tbsSeq [6 ])
232+ return
233+
217234 def sign (self , msg ):
218235 try :
219236 return PKCS1_v1_5 .new (self .prepared_key ).sign (self .hash_alg .new (msg ))
0 commit comments