@@ -8,9 +8,9 @@ pub mod _hashlib {
8
8
use crate :: vm:: {
9
9
builtins:: { PyBytes , PyStrRef , PyTypeRef } ,
10
10
convert:: ToPyObject ,
11
- function:: { ArgBytesLike , FuncArgs , OptionalArg } ,
11
+ function:: { ArgBytesLike , ArgStrOrBytesLike , FuncArgs , OptionalArg } ,
12
12
protocol:: PyBuffer ,
13
- AsObject , PyObjectRef , PyPayload , PyResult , VirtualMachine ,
13
+ PyObjectRef , PyPayload , PyResult , VirtualMachine ,
14
14
} ;
15
15
use blake2:: { Blake2b512 , Blake2s256 } ;
16
16
use digest:: { core_api:: BlockSizeUser , DynDigest } ;
@@ -23,7 +23,7 @@ pub mod _hashlib {
23
23
24
24
#[ derive( FromArgs , Debug ) ]
25
25
#[ allow( unused) ]
26
- pub struct NewHashArgs {
26
+ struct NewHashArgs {
27
27
#[ pyarg( positional) ]
28
28
name : PyStrRef ,
29
29
#[ pyarg( any, optional) ]
@@ -98,7 +98,7 @@ pub mod _hashlib {
98
98
99
99
#[ pyclass]
100
100
impl PyHasher {
101
- pub fn new ( name : & str , d : HashWrapper ) -> Self {
101
+ fn new ( name : & str , d : HashWrapper ) -> Self {
102
102
PyHasher {
103
103
name : name. to_owned ( ) ,
104
104
ctx : PyRwLock :: new ( d) ,
@@ -162,7 +162,7 @@ pub mod _hashlib {
162
162
163
163
#[ pyclass]
164
164
impl PyHasherXof {
165
- pub fn new ( name : & str , d : HashXofWrapper ) -> Self {
165
+ fn new ( name : & str , d : HashXofWrapper ) -> Self {
166
166
PyHasherXof {
167
167
name : name. to_owned ( ) ,
168
168
ctx : PyRwLock :: new ( d) ,
@@ -213,127 +213,115 @@ pub mod _hashlib {
213
213
#[ pyfunction( name = "new" ) ]
214
214
fn hashlib_new ( args : NewHashArgs , vm : & VirtualMachine ) -> PyResult < PyObjectRef > {
215
215
match args. name . as_str ( ) . to_lowercase ( ) . as_str ( ) {
216
- "md5" => Ok ( md5 ( args. into ( ) ) . into_pyobject ( vm) ) ,
217
- "sha1" => Ok ( sha1 ( args. into ( ) ) . into_pyobject ( vm) ) ,
218
- "sha224" => Ok ( sha224 ( args. into ( ) ) . into_pyobject ( vm) ) ,
219
- "sha256" => Ok ( sha256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
220
- "sha384" => Ok ( sha384 ( args. into ( ) ) . into_pyobject ( vm) ) ,
221
- "sha512" => Ok ( sha512 ( args. into ( ) ) . into_pyobject ( vm) ) ,
222
- "sha3_224" => Ok ( sha3_224 ( args. into ( ) ) . into_pyobject ( vm) ) ,
223
- "sha3_256" => Ok ( sha3_256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
224
- "sha3_384" => Ok ( sha3_384 ( args. into ( ) ) . into_pyobject ( vm) ) ,
225
- "sha3_512" => Ok ( sha3_512 ( args. into ( ) ) . into_pyobject ( vm) ) ,
226
- "shake_128" => Ok ( shake_128 ( args. into ( ) ) . into_pyobject ( vm) ) ,
227
- "shake_256" => Ok ( shake_256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
228
- "blake2b" => Ok ( blake2b ( args. into ( ) ) . into_pyobject ( vm) ) ,
229
- "blake2s" => Ok ( blake2s ( args. into ( ) ) . into_pyobject ( vm) ) ,
216
+ "md5" => Ok ( local_md5 ( args. into ( ) ) . into_pyobject ( vm) ) ,
217
+ "sha1" => Ok ( local_sha1 ( args. into ( ) ) . into_pyobject ( vm) ) ,
218
+ "sha224" => Ok ( local_sha224 ( args. into ( ) ) . into_pyobject ( vm) ) ,
219
+ "sha256" => Ok ( local_sha256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
220
+ "sha384" => Ok ( local_sha384 ( args. into ( ) ) . into_pyobject ( vm) ) ,
221
+ "sha512" => Ok ( local_sha512 ( args. into ( ) ) . into_pyobject ( vm) ) ,
222
+ "sha3_224" => Ok ( local_sha3_224 ( args. into ( ) ) . into_pyobject ( vm) ) ,
223
+ "sha3_256" => Ok ( local_sha3_256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
224
+ "sha3_384" => Ok ( local_sha3_384 ( args. into ( ) ) . into_pyobject ( vm) ) ,
225
+ "sha3_512" => Ok ( local_sha3_512 ( args. into ( ) ) . into_pyobject ( vm) ) ,
226
+ "shake_128" => Ok ( local_shake_128 ( args. into ( ) ) . into_pyobject ( vm) ) ,
227
+ "shake_256" => Ok ( local_shake_256 ( args. into ( ) ) . into_pyobject ( vm) ) ,
228
+ "blake2b" => Ok ( local_blake2b ( args. into ( ) ) . into_pyobject ( vm) ) ,
229
+ "blake2s" => Ok ( local_blake2s ( args. into ( ) ) . into_pyobject ( vm) ) ,
230
230
other => Err ( vm. new_value_error ( format ! ( "Unknown hashing algorithm: {other}" ) ) ) ,
231
231
}
232
232
}
233
233
234
234
#[ pyfunction( name = "openssl_md5" ) ]
235
- fn md5 ( args : HashArgs ) -> PyHasher {
235
+ pub fn local_md5 ( args : HashArgs ) -> PyHasher {
236
236
PyHasher :: new ( "md5" , HashWrapper :: new :: < Md5 > ( args. string ) )
237
237
}
238
238
239
239
#[ pyfunction( name = "openssl_sha1" ) ]
240
- fn sha1 ( args : HashArgs ) -> PyHasher {
240
+ pub fn local_sha1 ( args : HashArgs ) -> PyHasher {
241
241
PyHasher :: new ( "sha1" , HashWrapper :: new :: < Sha1 > ( args. string ) )
242
242
}
243
243
244
244
#[ pyfunction( name = "openssl_sha224" ) ]
245
- fn sha224 ( args : HashArgs ) -> PyHasher {
245
+ pub fn local_sha224 ( args : HashArgs ) -> PyHasher {
246
246
PyHasher :: new ( "sha224" , HashWrapper :: new :: < Sha224 > ( args. string ) )
247
247
}
248
248
249
249
#[ pyfunction( name = "openssl_sha256" ) ]
250
- fn sha256 ( args : HashArgs ) -> PyHasher {
250
+ pub fn local_sha256 ( args : HashArgs ) -> PyHasher {
251
251
PyHasher :: new ( "sha256" , HashWrapper :: new :: < Sha256 > ( args. string ) )
252
252
}
253
253
254
254
#[ pyfunction( name = "openssl_sha384" ) ]
255
- fn sha384 ( args : HashArgs ) -> PyHasher {
255
+ pub fn local_sha384 ( args : HashArgs ) -> PyHasher {
256
256
PyHasher :: new ( "sha384" , HashWrapper :: new :: < Sha384 > ( args. string ) )
257
257
}
258
258
259
259
#[ pyfunction( name = "openssl_sha512" ) ]
260
- fn sha512 ( args : HashArgs ) -> PyHasher {
260
+ pub fn local_sha512 ( args : HashArgs ) -> PyHasher {
261
261
PyHasher :: new ( "sha512" , HashWrapper :: new :: < Sha512 > ( args. string ) )
262
262
}
263
263
264
264
#[ pyfunction( name = "openssl_sha3_224" ) ]
265
- fn sha3_224 ( args : HashArgs ) -> PyHasher {
265
+ pub fn local_sha3_224 ( args : HashArgs ) -> PyHasher {
266
266
PyHasher :: new ( "sha3_224" , HashWrapper :: new :: < Sha3_224 > ( args. string ) )
267
267
}
268
268
269
269
#[ pyfunction( name = "openssl_sha3_256" ) ]
270
- fn sha3_256 ( args : HashArgs ) -> PyHasher {
270
+ pub fn local_sha3_256 ( args : HashArgs ) -> PyHasher {
271
271
PyHasher :: new ( "sha3_256" , HashWrapper :: new :: < Sha3_256 > ( args. string ) )
272
272
}
273
273
274
274
#[ pyfunction( name = "openssl_sha3_384" ) ]
275
- fn sha3_384 ( args : HashArgs ) -> PyHasher {
275
+ pub fn local_sha3_384 ( args : HashArgs ) -> PyHasher {
276
276
PyHasher :: new ( "sha3_384" , HashWrapper :: new :: < Sha3_384 > ( args. string ) )
277
277
}
278
278
279
279
#[ pyfunction( name = "openssl_sha3_512" ) ]
280
- fn sha3_512 ( args : HashArgs ) -> PyHasher {
280
+ pub fn local_sha3_512 ( args : HashArgs ) -> PyHasher {
281
281
PyHasher :: new ( "sha3_512" , HashWrapper :: new :: < Sha3_512 > ( args. string ) )
282
282
}
283
283
284
284
#[ pyfunction( name = "openssl_shake_128" ) ]
285
- fn shake_128 ( args : HashArgs ) -> PyHasherXof {
285
+ pub fn local_shake_128 ( args : HashArgs ) -> PyHasherXof {
286
286
PyHasherXof :: new ( "shake_128" , HashXofWrapper :: new_shake_128 ( args. string ) )
287
287
}
288
288
289
289
#[ pyfunction( name = "openssl_shake_256" ) ]
290
- fn shake_256 ( args : HashArgs ) -> PyHasherXof {
290
+ pub fn local_shake_256 ( args : HashArgs ) -> PyHasherXof {
291
291
PyHasherXof :: new ( "shake_256" , HashXofWrapper :: new_shake_256 ( args. string ) )
292
292
}
293
293
294
294
#[ pyfunction( name = "openssl_blake2b" ) ]
295
- fn blake2b ( args : BlakeHashArgs ) -> PyHasher {
295
+ pub fn local_blake2b ( args : BlakeHashArgs ) -> PyHasher {
296
296
PyHasher :: new ( "blake2b" , HashWrapper :: new :: < Blake2b512 > ( args. data ) )
297
297
}
298
298
299
299
#[ pyfunction( name = "openssl_blake2s" ) ]
300
- fn blake2s ( args : BlakeHashArgs ) -> PyHasher {
300
+ pub fn local_blake2s ( args : BlakeHashArgs ) -> PyHasher {
301
301
PyHasher :: new ( "blake2s" , HashWrapper :: new :: < Blake2s256 > ( args. data ) )
302
302
}
303
303
304
304
#[ pyfunction]
305
305
fn compare_digest (
306
- a : PyObjectRef ,
307
- b : PyObjectRef ,
306
+ a : ArgStrOrBytesLike ,
307
+ b : ArgStrOrBytesLike ,
308
308
vm : & VirtualMachine ,
309
309
) -> PyResult < PyObjectRef > {
310
- // Suported types:
311
- // PyStrRef
312
- // PyBytesRef
313
310
314
- let _py_str = vm. ctx . types . str_type ;
311
+ fn is_str ( arg : & ArgStrOrBytesLike ) -> bool {
312
+ matches ! ( arg, ArgStrOrBytesLike :: Str ( _) )
313
+ }
315
314
316
- if a . class ( ) . is ( _py_str ) != b . class ( ) . is ( _py_str ) {
315
+ if is_str ( & a ) != is_str ( & b ) {
317
316
return Err ( vm. new_type_error ( format ! (
318
- "different types in compare_digest {} and {} " ,
319
- a. class( ) . name( ) ,
320
- b. class( ) . name( )
317
+ "a bytes-like object is required, not '{}'" ,
318
+ b. as_object( ) . class( ) . name( )
321
319
) ) ) ;
322
320
}
323
321
324
- let a_hash = match a. class ( ) . is ( _py_str) {
325
- true => a. try_to_value :: < & str > ( vm) ?. as_bytes ( ) . to_vec ( ) ,
326
- _ => b. try_to_value :: < PyBytes > ( vm) ?. as_bytes ( ) . to_vec ( ) ,
327
- } ;
328
-
329
- let b_hash = match b. class ( ) . is ( _py_str) {
330
- true => b. try_to_value :: < & str > ( vm) ?. as_bytes ( ) . to_vec ( ) ,
331
- _ => b. try_to_value :: < PyBytes > ( vm) ?. as_bytes ( ) . to_vec ( ) ,
332
- } ;
322
+ let a_hash = a. borrow_bytes ( ) . to_vec ( ) ;
323
+ let b_hash = b. borrow_bytes ( ) . to_vec ( ) ;
333
324
334
- println ! ( "\n a: {:?}" , a_hash) ;
335
- println ! ( "b: {:?}" , b_hash) ;
336
- println ! ( "equal: {}" , ( a_hash == b_hash) ) ;
337
325
Ok ( ( a_hash == b_hash) . to_pyobject ( vm) )
338
326
}
339
327
0 commit comments