1111from calendar import timegm
1212from collections import Mapping
1313
14+ from Crypto .Signature import PKCS1_v1_5
15+ from Crypto .Hash import SHA256
16+
1417try :
1518 import json
1619except ImportError :
@@ -31,7 +34,15 @@ class ExpiredSignature(Exception):
3134 'HS256' : lambda msg , key : hmac .new (key , msg , hashlib .sha256 ).digest (),
3235 'HS384' : lambda msg , key : hmac .new (key , msg , hashlib .sha384 ).digest (),
3336 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest (),
34- }
37+ 'RS256' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA256 .new (msg )),
38+ }
39+
40+ verify_methods = {
41+ 'HS256' : lambda msg , key : hmac .new (key , msg , hashlib .sha256 ).digest (),
42+ 'HS384' : lambda msg , key : hmac .new (key , msg , hashlib .sha384 ).digest (),
43+ 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest (),
44+ 'RS256' : lambda msg , key : PKCS1_v1_5 .new (key ).verify (SHA256 .new (msg )),
45+ }
3546
3647
3748def constant_time_compare (val1 , val2 ):
@@ -126,7 +137,7 @@ def decode(jwt, key='', verify=True, verify_expiration=True, leeway=0):
126137 try :
127138 if isinstance (key , unicode ):
128139 key = key .encode ('utf-8' )
129- expected = signing_methods [header ['alg' ]](signing_input , key )
140+ expected = verify_methods [header ['alg' ]](signing_input , key )
130141 if not constant_time_compare (signature , expected ):
131142 raise DecodeError ("Signature verification failed" )
132143 except KeyError :
0 commit comments