3
3
Minimum implementation based on this spec:
4
4
http://self-issued.info/docs/draft-jones-json-web-token-01.html
5
5
6
- Taken from: https://github.com/progrium/pyjwt @ 6b1e5e0
6
+ Taken from: https://github.com/progrium/pyjwt @ 3bade27
7
7
"""
8
8
from __future__ import unicode_literals
9
9
import base64
16
16
from calendar import timegm
17
17
from collections import Mapping
18
18
19
- from Crypto .Signature import PKCS1_v1_5
20
- from Crypto .Hash import SHA256
21
- from Crypto .Hash import SHA384
22
- from Crypto .Hash import SHA512
23
-
24
19
try :
25
20
import json
26
21
except ImportError :
@@ -44,20 +39,34 @@ class ExpiredSignature(Exception):
44
39
signing_methods = {
45
40
'HS256' : lambda msg , key : hmac .new (key , msg , hashlib .sha256 ).digest (),
46
41
'HS384' : lambda msg , key : hmac .new (key , msg , hashlib .sha384 ).digest (),
47
- 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest (),
48
- 'RS256' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA256 .new (msg )),
49
- 'RS384' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA384 .new (msg )),
50
- 'RS512' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA512 .new (msg )),
51
- }
42
+ 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest ()
43
+ }
52
44
53
45
verify_methods = {
54
46
'HS256' : lambda msg , key : hmac .new (key , msg , hashlib .sha256 ).digest (),
55
47
'HS384' : lambda msg , key : hmac .new (key , msg , hashlib .sha384 ).digest (),
56
- 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest (),
57
- 'RS256' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA256 .new (msg ), sig ),
58
- 'RS384' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA384 .new (msg ), sig ),
59
- 'RS512' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA512 .new (msg ), sig ),
60
- }
48
+ 'HS512' : lambda msg , key : hmac .new (key , msg , hashlib .sha512 ).digest ()
49
+ }
50
+
51
+ try :
52
+ from Crypto .Signature import PKCS1_v1_5
53
+ from Crypto .Hash import SHA256
54
+ from Crypto .Hash import SHA384
55
+ from Crypto .Hash import SHA512
56
+
57
+ signing_methods .update ({
58
+ 'RS256' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA256 .new (msg )),
59
+ 'RS384' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA384 .new (msg )),
60
+ 'RS512' : lambda msg , key : PKCS1_v1_5 .new (key ).sign (SHA512 .new (msg ))
61
+ })
62
+
63
+ verify_methods .update ({
64
+ 'RS256' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA256 .new (msg ), sig ),
65
+ 'RS384' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA384 .new (msg ), sig ),
66
+ 'RS512' : lambda msg , key , sig : PKCS1_v1_5 .new (key ).verify (SHA512 .new (msg ), sig )
67
+ })
68
+ except ImportError :
69
+ pass
61
70
62
71
63
72
def constant_time_compare (val1 , val2 ):
@@ -179,4 +188,4 @@ def decode(jwt, key='', verify=True, verify_expiration=True, leeway=0):
179
188
utc_timestamp = timegm (datetime .utcnow ().utctimetuple ())
180
189
if payload ['exp' ] < (utc_timestamp - leeway ):
181
190
raise ExpiredSignature ("Signature has expired" )
182
- return payload
191
+ return payload
0 commit comments