25
25
basestring = str
26
26
27
27
28
- __version__ = '0.3.2 '
28
+ __version__ = '0.4 '
29
29
__all__ = ['encode' , 'decode' , 'DecodeError' ]
30
30
31
31
@@ -76,35 +76,68 @@ def prepare_HS_key(key):
76
76
}
77
77
78
78
try :
79
- from Crypto .Signature import PKCS1_v1_5
80
- from Crypto .Hash import SHA256
81
- from Crypto .Hash import SHA384
82
- from Crypto .Hash import SHA512
83
- from Crypto .PublicKey import RSA
79
+ from cryptography .hazmat .primitives import interfaces , hashes
80
+ from cryptography .hazmat .primitives .serialization import (
81
+ load_pem_private_key , load_pem_public_key , load_ssh_public_key
82
+ )
83
+ from cryptography .hazmat .primitives .asymmetric import ec , rsa , padding
84
+ from cryptography .hazmat .backends import default_backend
85
+ from cryptography .exceptions import InvalidSignature
86
+
87
+ def sign_rsa (msg , key , hashalg ):
88
+ signer = key .signer (
89
+ padding .PKCS1v15 (),
90
+ hashalg
91
+ )
92
+
93
+ signer .update (msg )
94
+ return signer .finalize ()
95
+
96
+ def verify_rsa (msg , key , hashalg , sig ):
97
+ verifier = key .verifier (
98
+ sig ,
99
+ padding .PKCS1v15 (),
100
+ hashalg
101
+ )
102
+
103
+ verifier .update (msg )
104
+
105
+ try :
106
+ verifier .verify ()
107
+ return True
108
+ except InvalidSignature :
109
+ return False
84
110
85
111
signing_methods .update ({
86
- 'RS256' : lambda msg , key : PKCS1_v1_5 . new ( key ). sign ( SHA256 . new ( msg )),
87
- 'RS384' : lambda msg , key : PKCS1_v1_5 . new ( key ). sign ( SHA384 . new ( msg )),
88
- 'RS512' : lambda msg , key : PKCS1_v1_5 . new ( key ). sign ( SHA512 . new ( msg ))
112
+ 'RS256' : lambda msg , key : sign_rsa ( msg , key , hashes . SHA256 ( )),
113
+ 'RS384' : lambda msg , key : sign_rsa ( msg , key , hashes . SHA384 ( )),
114
+ 'RS512' : lambda msg , key : sign_rsa ( msg , key , hashes . SHA512 ( ))
89
115
})
90
116
91
117
verify_methods .update ({
92
- 'RS256' : lambda msg , key , sig : PKCS1_v1_5 . new ( key ). verify ( SHA256 . new ( msg ), sig ),
93
- 'RS384' : lambda msg , key , sig : PKCS1_v1_5 . new ( key ). verify ( SHA384 . new ( msg ), sig ),
94
- 'RS512' : lambda msg , key , sig : PKCS1_v1_5 . new ( key ). verify ( SHA512 . new ( msg ), sig )
118
+ 'RS256' : lambda msg , key , sig : verify_rsa ( msg , key , hashes . SHA256 ( ), sig ),
119
+ 'RS384' : lambda msg , key , sig : verify_rsa ( msg , key , hashes . SHA384 ( ), sig ),
120
+ 'RS512' : lambda msg , key , sig : verify_rsa ( msg , key , hashes . SHA512 ( ), sig )
95
121
})
96
122
97
123
def prepare_RS_key (key ):
98
- if isinstance (key , RSA ._RSAobj ):
124
+ if isinstance (key , interfaces .RSAPrivateKey ) or \
125
+ isinstance (key , interfaces .RSAPublicKey ):
99
126
return key
100
127
101
128
if isinstance (key , basestring ):
102
129
if isinstance (key , unicode ):
103
130
key = key .encode ('utf-8' )
104
131
105
- key = RSA .importKey (key )
132
+ try :
133
+ if key .startswith (b'ssh-rsa' ):
134
+ key = load_ssh_public_key (key , backend = default_backend ())
135
+ else :
136
+ key = load_pem_private_key (key , password = None , backend = default_backend ())
137
+ except ValueError :
138
+ key = load_pem_public_key (key , backend = default_backend ())
106
139
else :
107
- raise TypeError ('Expecting a PEM- or RSA- formatted key.' )
140
+ raise TypeError ('Expecting a PEM-formatted key.' )
108
141
109
142
return key
110
143
@@ -114,27 +147,38 @@ def prepare_RS_key(key):
114
147
'RS512' : prepare_RS_key
115
148
})
116
149
117
- except ImportError :
118
- pass
150
+ def sign_ecdsa ( msg , key , hashalg ) :
151
+ signer = key . signer ( ec . ECDSA ( hashalg ))
119
152
120
- try :
121
- import ecdsa
153
+ signer .update (msg )
154
+ return signer .finalize ()
155
+
156
+ def verify_ecdsa (msg , key , hashalg , sig ):
157
+ verifier = key .verifier (sig , ec .ECDSA (hashalg ))
158
+
159
+ verifier .update (msg )
160
+
161
+ try :
162
+ verifier .verify ()
163
+ return True
164
+ except InvalidSignature :
165
+ return False
122
166
123
167
signing_methods .update ({
124
- 'ES256' : lambda msg , key : key . sign (msg , hashfunc = hashlib . sha256 , sigencode = ecdsa . util . sigencode_der ),
125
- 'ES384' : lambda msg , key : key . sign (msg , hashfunc = hashlib . sha384 , sigencode = ecdsa . util . sigencode_der ),
126
- 'ES512' : lambda msg , key : key . sign (msg , hashfunc = hashlib . sha512 , sigencode = ecdsa . util . sigencode_der ),
168
+ 'ES256' : lambda msg , key : sign_ecdsa (msg , key , hashes . SHA256 () ),
169
+ 'ES384' : lambda msg , key : sign_ecdsa (msg , key , hashes . SHA384 () ),
170
+ 'ES512' : lambda msg , key : sign_ecdsa (msg , key , hashes . SHA512 () ),
127
171
})
128
172
129
173
verify_methods .update ({
130
- 'ES256' : lambda msg , key , sig : key . verify ( sig , msg , hashfunc = hashlib . sha256 , sigdecode = ecdsa . util . sigdecode_der ),
131
- 'ES384' : lambda msg , key , sig : key . verify ( sig , msg , hashfunc = hashlib . sha384 , sigdecode = ecdsa . util . sigdecode_der ),
132
- 'ES512' : lambda msg , key , sig : key . verify ( sig , msg , hashfunc = hashlib . sha512 , sigdecode = ecdsa . util . sigdecode_der ),
174
+ 'ES256' : lambda msg , key , sig : verify_ecdsa ( msg , key , hashes . SHA256 (), sig ),
175
+ 'ES384' : lambda msg , key , sig : verify_ecdsa ( msg , key , hashes . SHA384 (), sig ),
176
+ 'ES512' : lambda msg , key , sig : verify_ecdsa ( msg , key , hashes . SHA512 (), sig ),
133
177
})
134
178
135
179
def prepare_ES_key (key ):
136
- if isinstance (key , ecdsa . SigningKey ) or \
137
- isinstance (key , ecdsa . VerifyingKey ):
180
+ if isinstance (key , interfaces . EllipticCurvePrivateKey ) or \
181
+ isinstance (key , interfaces . EllipticCurvePublicKey ):
138
182
return key
139
183
140
184
if isinstance (key , basestring ):
@@ -145,12 +189,10 @@ def prepare_ES_key(key):
145
189
# a Signing Key or a Verifying Key, so we try
146
190
# the Verifying Key first.
147
191
try :
148
- key = ecdsa .VerifyingKey .from_pem (key )
149
- except ecdsa .der .UnexpectedDER :
150
- try :
151
- key = ecdsa .SigningKey .from_pem (key )
152
- except :
153
- raise
192
+ key = load_pem_public_key (key , backend = default_backend ())
193
+ except ValueError :
194
+ key = load_pem_private_key (key , password = None , backend = default_backend ())
195
+
154
196
else :
155
197
raise TypeError ('Expecting a PEM-formatted key.' )
156
198
0 commit comments