Crash in hashlib with OpenSSL 3 when loading deprecated algorithm (e.g. md4)
pypy crashes in hashlib when using OpenSSL 3 (3.0.3 here) and trying to load a deprecated algorithm like md4. Originally noticed in Gentoo when running Gemato's test suite with pypy3.9.
One of the tests segfaulted when trying to load md4 (also ripemd160, whirlpool) and it boils down to:
$ pypy3 --version
Python 3.9.12 (05fbe3aa5b0845e6c37239768aa455451aa5faba, May 08 2022, 01:14:37)
[PyPy 7.3.9 with GCC 12.1.0]
$ pypy3 -c 'import hashlib; m=hashlib.new("md4");m.update(b"foo");print(m.hexdigest())'
Segmentation fault (core dumped)
Python backtrace from Gemato's tests (shows hashlib to blame):
tests/test_hash.py::test_hash_bytes[TEST_STRING-sha384-True-test_hashes4] PASSED [ 86/1253]
tests/test_hash.py::test_hash_bytes[TEST_STRING-sha512-True-test_hashes5] PASSED [ 87/1253]
tests/test_hash.py::test_hash_bytes[TEST_STRING-md4-False-test_hashes6] Fatal Python error: Segmentation fault
Stack (most recent call first, approximate line numbers):
File "/usr/lib/pypy3.9/_hashlib/__init__.py", line 66 in update
File "/var/tmp/portage/app-portage/gemato-16.2/work/gemato-16.2/gemato/hash.py", line 47 in hash_file
File "/var/tmp/portage/app-portage/gemato-16.2/work/gemato-16.2/gemato/hash.py", line 84 in hash_bytes
File "/var/tmp/portage/app-portage/gemato-16.2/work/gemato-16.2/tests/test_hash.py", line 158 in test_hash_bytes
File "/usr/lib/pypy3.9/site-packages/_pytest/python.py", line 185 in pytest_pyfunc_call
File "/usr/lib/pypy3.9/site-packages/pluggy/_callers.py", line 9 in _multicall
File "/usr/lib/pypy3.9/site-packages/pluggy/_manager.py", line 77 in _hookexec
File "/usr/lib/pypy3.9/site-packages/pluggy/_hooks.py", line 244 in __call__
File "/usr/lib/pypy3.9/site-packages/_pytest/python.py", line 1759 in runtest
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 157 in pytest_runtest_call
File "/usr/lib/pypy3.9/site-packages/pluggy/_callers.py", line 9 in _multicall
File "/usr/lib/pypy3.9/site-packages/pluggy/_manager.py", line 77 in _hookexec
File "/usr/lib/pypy3.9/site-packages/pluggy/_hooks.py", line 244 in __call__
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 259 in <lambda>
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 315 in from_call
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 244 in call_runtest_hook
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 216 in call_and_report
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 116 in runtestprotocol
File "/usr/lib/pypy3.9/site-packages/_pytest/runner.py", line 108 in pytest_runtest_protocol
File "/usr/lib/pypy3.9/site-packages/pluggy/_callers.py", line 9 in _multicall
File "/usr/lib/pypy3.9/site-packages/pluggy/_manager.py", line 77 in _hookexec
File "/usr/lib/pypy3.9/site-packages/pluggy/_hooks.py", line 244 in __call__
File "/usr/lib/pypy3.9/site-packages/_pytest/main.py", line 335 in pytest_runtestloop
File "/usr/lib/pypy3.9/site-packages/pluggy/_callers.py", line 9 in _multicall
File "/usr/lib/pypy3.9/site-packages/pluggy/_manager.py", line 77 in _hookexec
File "/usr/lib/pypy3.9/site-packages/pluggy/_hooks.py", line 244 in __call__
File "/usr/lib/pypy3.9/site-packages/_pytest/main.py", line 318 in _main
File "/usr/lib/pypy3.9/site-packages/_pytest/main.py", line 255 in wrap_session
File "/usr/lib/pypy3.9/site-packages/_pytest/main.py", line 314 in pytest_cmdline_main
File "/usr/lib/pypy3.9/site-packages/pluggy/_callers.py", line 9 in _multicall
File "/usr/lib/pypy3.9/site-packages/pluggy/_manager.py", line 77 in _hookexec
File "/usr/lib/pypy3.9/site-packages/pluggy/_hooks.py", line 244 in __call__
File "/usr/lib/pypy3.9/site-packages/_pytest/config/__init__.py", line 132 in main
File "/usr/lib/pypy3.9/site-packages/_pytest/config/__init__.py", line 180 in console_main
File "/usr/lib/pypy3.9/site-packages/pytest/__main__.py", line 1 in <module>
File "/usr/lib/pypy3.9/runpy.py", line 64 in _run_code
File "/usr/lib/pypy3.9/runpy.py", line 175 in _run_module_as_main
File "<builtin>/app_main.py", line 109 in run_toplevel
File "<builtin>/app_main.py", line 668 in run_command_line
File "<builtin>/app_main.py", line 1056 in entry_point
/var/tmp/portage/app-portage/gemato-16.2/temp/environment: line 2056: 71 Segmentation fault (core dumped) "${@}"
* ERROR: app-portage/gemato-16.2::gentoo failed (test phase):
* pytest failed with pypy3
*
Backtrace:
Starting program: /usr/bin/pypy3 -c import\ hashlib\;\ m=hashlib.new\(\"md4\"\)\;m.update\(b\"foo\"\)\;print\(m.hexdigest\(\)\)
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff7e593ea in ffi_call_unix64 () at /usr/src/debug/dev-libs/libffi-3.4.2-r1/libffi-3.4.2/src/x86/unix64.S:105
#2 0x00007ffff7e587a4 in ffi_call_int (cif=<optimized out>, fn=<optimized out>, rvalue=<optimized out>, avalue=<optimized out>, closure=<optimized out>)
at /usr/src/debug/dev-libs/libffi-3.4.2-r1/libffi-3.4.2/src/x86/ffi64.c:672
#3 0x0000555556813150 in pypy_g_ccall_ffi_call__ffi_cifPtr_arrayPtr_arrayPtr_arr (l_a0_45=l_a0_45@entry=0x555559551e60, l_a1_32=0x7ffff72abbd0 <_cffi_d_EVP_DigestUpdate>,
l_a2_16=0x5555594f3f98, l_a3_4=l_a3_4@entry=0x5555594f3f80) at implement_2.c:45332
#4 0x000055555777ee37 in pypy_g_jit_ffi_call_impl_any (l_exchange_buffer_9=0x5555594f3f80 "\250?OYUU", l_func_addr_9=<optimized out>, l_cif_description_15=0x555559551e60)
at rpython_rlib.c:41867
#5 pypy_g__do_ffi_call_sint (l_cif_description_2=l_cif_description_2@entry=0x555559551e60, l_func_addr_2=<optimized out>,
l_exchange_buffer_10=l_exchange_buffer_10@entry=0x5555594f3f80 "\250?OYUU") at rpython_rlib.c:41881
#6 0x000055555777f03f in pypy_g_jit_ffi_call (l_cif_description_14=l_cif_description_14@entry=0x555559551e60, l_func_addr_0=l_func_addr_0@entry=0x7ffff72abbd0 <_cffi_d_EVP_DigestUpdate>,
l_exchange_buffer_0=l_exchange_buffer_0@entry=0x5555594f3f80 "\250?OYUU") at rpython_rlib.c:30863
#7 0x0000555556c3f4c3 in pypy_g_W_CTypeFunc__call (l_self_15257=<optimized out>, l_funcaddr_44=0x7ffff72abbd0 <_cffi_d_EVP_DigestUpdate> "\351\353\307\377\377ff.\017\037\204",
l_args_w_105=<optimized out>) at pypy_module__cffi_backend.c:59345
#8 0x0000555556c5aa5d in pypy_g_W_FunctionWrapper_descr_call (l_self_15354=<optimized out>, l_args_w_108=<optimized out>) at pypy_module__cffi_backend_1.c:28055
#9 0x0000555556912718 in pypy_g_BuiltinActivation_UwS_W_FunctionWrapper_args_w__ (l_self_12901=<optimized out>, l_scope_w_1175=<optimized out>) at implement_7.c:51513
#10 0x00005555569c3a5a in pypy_g_BuiltinCode_funcrun_obj (l_self_13353=<optimized out>, l_func_1581=<optimized out>, l_w_obj_3434=<optimized out>, l_args_244=<optimized out>)
at pypy_interpreter.c:26486
#11 0x0000555556a63198 in pypy_g_call_valuestack__AccessDirect_None (l_w_func_86=<optimized out>, l_nargs_21=<optimized out>, l_frame_110=0x7ffff79bd308, l_methodcall_6=<optimized out>)
at pypy_interpreter_3.c:57529
#12 0x00005555572da94a in pypy_g_CALL_METHOD__AccessDirect_star_1 (l_v1407443=l_v1407443@entry=0x7ffff79bd308, l_oparg_90=3, l_stararg0_5668=l_stararg0_5668@entry=74)
at pypy_objspace_std_9.c:17067
#13 0x0000555556a69e5a in pypy_g_dispatch_bytecode__AccessDirect_None (l_self_13837=0x7ffff79bd308, l_co_code_3=0x7ffff75fd3c8, l_next_instr_98=<optimized out>, l_ec_46=0x7ffff75e6020)
at pypy_interpreter_3.c:35594
#14 0x0000555556a31f40 in pypy_g_handle_bytecode__AccessDirect_None (l_self_13739=l_self_13739@entry=0x7ffff79bd308, l_co_code_2=<optimized out>, l_next_instr_86=<optimized out>,
l_ec_42=<optimized out>) at pypy_interpreter_2.c:53861
#15 0x00005555570b6956 in pypy_g_portal_7 (l_next_instr_164=l_next_instr_164@entry=0, l_is_being_profiled_11=l_is_being_profiled_11@entry=false, l_pycode_25=<optimized out>,
l_self_4901=0x7ffff79bd308, l_ec_15=<optimized out>) at pypy_module_pypyjit.c:79
#16 0x000055555745624a in pypy_g_ll_portal_runner__Unsigned_Bool_pypy_interpreter (l_stararg0_5714=0, l_v1570273=<optimized out>, l_v1570272=<optimized out>,
l_stararg3_730=<optimized out>, l_stararg3_730@entry=0x7ffff79bd308, l_v1570271=<optimized out>) at rpython_jit_metainterp.c:8632
#17 0x00005555570b68f8 in pypy_g_PyFrame_dispatch (l_self_3310=l_self_3310@entry=0x7ffff79bd308, l_pycode_24=<optimized out>, l_next_instr_162=l_next_instr_162@entry=0,
l_ec_72=l_ec_72@entry=0x7ffff75e6020) at pypy_module_pypyjit.c:31
#18 0x00005555569f638e in pypy_g_execute_frame (l_self_13536=l_self_13536@entry=0x7ffff79bd308, l_w_arg_or_err_9=<optimized out>, l_w_arg_or_err_9@entry=0x0) at pypy_interpreter_1.c:43132
#19 0x000055555786eb48 in __vmprof_eval_vmprof (l_stararg0_6284=0x7ffff79bd308, l_stararg1_5122=0x0) at rpython_rlib_rvmprof.c:91
#20 0x00005555572da94a in pypy_g_CALL_METHOD__AccessDirect_star_1 (l_v1407443=l_v1407443@entry=0x7ffff74e4be8, l_oparg_90=1, l_stararg0_5668=l_stararg0_5668@entry=26)
at pypy_objspace_std_9.c:17067
#21 0x0000555556a69e5a in pypy_g_dispatch_bytecode__AccessDirect_None (l_self_13837=0x7ffff74e4be8, l_co_code_3=0x7ffff75a29b0, l_next_instr_98=<optimized out>, l_ec_46=0x7ffff75e6020)
--Type <RET> for more, q to quit, c to continue without paging--
at pypy_interpreter_3.c:35594
#22 0x0000555556a31f40 in pypy_g_handle_bytecode__AccessDirect_None (l_self_13739=l_self_13739@entry=0x7ffff7992518, l_co_code_2=<optimized out>, l_next_instr_86=<optimized out>,
l_ec_42=<optimized out>) at pypy_interpreter_2.c:53861
#23 0x00005555570b6956 in pypy_g_portal_7 (l_next_instr_164=l_next_instr_164@entry=0, l_is_being_profiled_11=l_is_being_profiled_11@entry=false, l_pycode_25=<optimized out>,
l_self_4901=0x7ffff7992518, l_ec_15=<optimized out>) at pypy_module_pypyjit.c:79
#24 0x000055555745624a in pypy_g_ll_portal_runner__Unsigned_Bool_pypy_interpreter (l_stararg0_5714=0, l_v1570273=<optimized out>, l_v1570272=<optimized out>,
l_stararg3_730=<optimized out>, l_stararg3_730@entry=0x7ffff7992518, l_v1570271=<optimized out>) at rpython_jit_metainterp.c:8632
#25 0x00005555570b68f8 in pypy_g_PyFrame_dispatch (l_self_3310=l_self_3310@entry=0x7ffff7992518, l_pycode_24=<optimized out>, l_next_instr_162=l_next_instr_162@entry=0,
l_ec_72=l_ec_72@entry=0x7ffff75e6020) at pypy_module_pypyjit.c:31
#26 0x00005555569f638e in pypy_g_execute_frame (l_self_13536=l_self_13536@entry=0x7ffff7992518, l_w_arg_or_err_9=<optimized out>, l_w_arg_or_err_9@entry=0x0) at pypy_interpreter_1.c:43132
#27 0x000055555786eb48 in __vmprof_eval_vmprof (l_stararg0_6284=0x7ffff7992518, l_stararg1_5122=l_stararg1_5122@entry=0x0) at rpython_rlib_rvmprof.c:91
#28 0x00005555569cd13e in pypy_g_Code_exec_code (l_self_13363=<optimized out>, l_w_globals_23=<optimized out>, l_w_locals_13=<optimized out>) at pypy_interpreter.c:31008
#29 0x0000555556a44a51 in pypy_g_PyFrame_exec_ (l_self_13795=<optimized out>, l_w_prog_3=<optimized out>, l_w_globals_27=<optimized out>, l_w_locals_15=<optimized out>)
at pypy_interpreter_3.c:13290
#30 0x0000555556bfcb45 in pypy_g_exec_ (l_w_prog_5=<optimized out>, l_w_globals_32=<optimized out>, l_w_locals_23=<optimized out>) at pypy_module___builtin__.c:19752
#31 0x00005555567c082a in pypy_g_BuiltinActivation_UwS_ObjSpace_W_Root_W_Root_W_R_1 (l_self_1754=0x555558453870 <pypy_g_pypy_interpreter_gateway_BuiltinActivation_UwS_O_237>,
l_scope_w_133=0x7ffff798bc28) at implement.c:62644
#32 0x00005555569c3a5a in pypy_g_BuiltinCode_funcrun_obj (l_self_13353=<optimized out>, l_func_1581=<optimized out>, l_w_obj_3434=<optimized out>, l_args_244=<optimized out>)
at pypy_interpreter.c:26486
#33 0x0000555556a6369d in pypy_g_CALL_FUNCTION_EX__AccessDirect_None (l_self_13915=<optimized out>, l_self_13915@entry=0x7ffff798b828, l_has_kwarg_1=<optimized out>,
l_next_instr_143=l_next_instr_143@entry=56) at pypy_interpreter_3.c:59460
#34 0x0000555556a6a38a in pypy_g_dispatch_bytecode__AccessDirect_None (l_self_13837=0x7ffff798b828, l_co_code_3=0x55555824d720 <pypy_g_rpy_string_6012>, l_next_instr_98=<optimized out>,
l_ec_46=0x7ffff75e6020) at pypy_interpreter_3.c:35576
#35 0x0000555556a31f40 in pypy_g_handle_bytecode__AccessDirect_None (l_self_13739=l_self_13739@entry=0x7ffff798b828, l_co_code_2=<optimized out>, l_next_instr_86=<optimized out>,
l_ec_42=<optimized out>) at pypy_interpreter_2.c:53861
#36 0x00005555570b6956 in pypy_g_portal_7 (l_next_instr_164=l_next_instr_164@entry=0, l_is_being_profiled_11=l_is_being_profiled_11@entry=false, l_pycode_25=<optimized out>,
l_self_4901=0x7ffff798b828, l_ec_15=<optimized out>) at pypy_module_pypyjit.c:79
#37 0x000055555745624a in pypy_g_ll_portal_runner__Unsigned_Bool_pypy_interpreter (l_stararg0_5714=0, l_v1570273=<optimized out>, l_v1570272=<optimized out>,
l_stararg3_730=<optimized out>, l_stararg3_730@entry=0x7ffff798b828, l_v1570271=<optimized out>) at rpython_jit_metainterp.c:8632
#38 0x00005555570b68f8 in pypy_g_PyFrame_dispatch (l_self_3310=l_self_3310@entry=0x7ffff798b828, l_pycode_24=<optimized out>, l_next_instr_162=l_next_instr_162@entry=0,
l_ec_72=l_ec_72@entry=0x7ffff75e6020) at pypy_module_pypyjit.c:31
#39 0x00005555569f638e in pypy_g_execute_frame (l_self_13536=l_self_13536@entry=0x7ffff798b828, l_w_arg_or_err_9=<optimized out>, l_w_arg_or_err_9@entry=0x0) at pypy_interpreter_1.c:43132
#40 0x000055555786eb48 in __vmprof_eval_vmprof (l_stararg0_6284=0x7ffff798b828, l_stararg1_5122=0x0) at rpython_rlib_rvmprof.c:91
#41 0x0000555556a64520 in pypy_g_CALL_FUNCTION__AccessDirect_None (l_self_13917=l_self_13917@entry=0x7ffff75e57b0, l_oparg_67=<optimized out>, l_next_instr_145=l_next_instr_145@entry=860)
at pypy_interpreter_3.c:60708
#42 0x0000555556a69fdf in pypy_g_dispatch_bytecode__AccessDirect_None (l_self_13837=0x7ffff75e57b0, l_co_code_3=0x5555581dbbe0 <pypy_g_rpy_string_5958>, l_next_instr_98=<optimized out>,
l_ec_46=0x7ffff75e6020) at pypy_interpreter_3.c:35540
--Type <RET> for more, q to quit, c to continue without paging--
#43 0x0000555556a31f40 in pypy_g_handle_bytecode__AccessDirect_None (l_self_13739=l_self_13739@entry=0x7ffff75e57b0, l_co_code_2=<optimized out>, l_next_instr_86=<optimized out>,
l_ec_42=<optimized out>) at pypy_interpreter_2.c:53861
#44 0x00005555570b6956 in pypy_g_portal_7 (l_next_instr_164=l_next_instr_164@entry=0, l_is_being_profiled_11=l_is_being_profiled_11@entry=false, l_pycode_25=<optimized out>,
l_self_4901=0x7ffff75e57b0, l_ec_15=<optimized out>) at pypy_module_pypyjit.c:79
#45 0x000055555745624a in pypy_g_ll_portal_runner__Unsigned_Bool_pypy_interpreter (l_stararg0_5714=0, l_v1570273=<optimized out>, l_v1570272=<optimized out>,
l_stararg3_730=<optimized out>, l_stararg3_730@entry=0x7ffff79b3f90, l_v1570271=<optimized out>) at rpython_jit_metainterp.c:8632
#46 0x00005555570b68f8 in pypy_g_PyFrame_dispatch (l_self_3310=l_self_3310@entry=0x7ffff79b3f90, l_pycode_24=<optimized out>, l_next_instr_162=l_next_instr_162@entry=0,
l_ec_72=l_ec_72@entry=0x7ffff75e6020) at pypy_module_pypyjit.c:31
#47 0x00005555569f638e in pypy_g_execute_frame (l_self_13536=l_self_13536@entry=0x7ffff79b3f90, l_w_arg_or_err_9=<optimized out>, l_w_arg_or_err_9@entry=0x0) at pypy_interpreter_1.c:43132
#48 0x000055555786eb48 in __vmprof_eval_vmprof (l_stararg0_6284=0x7ffff79b3f90, l_stararg1_5122=0x0) at rpython_rlib_rvmprof.c:91
#49 0x0000555556a6369d in pypy_g_CALL_FUNCTION_EX__AccessDirect_None (l_self_13915=<optimized out>, l_self_13915@entry=0x7ffff75e48a8, l_has_kwarg_1=<optimized out>,
l_next_instr_143=l_next_instr_143@entry=156) at pypy_interpreter_3.c:59460
#50 0x0000555556a6a38a in pypy_g_dispatch_bytecode__AccessDirect_None (l_self_13837=0x7ffff75e48a8, l_co_code_3=0x5555580d1880 <pypy_g_rpy_string_568>, l_next_instr_98=<optimized out>,
l_ec_46=0x7ffff75e6020) at pypy_interpreter_3.c:35576
#51 0x0000555556a31f40 in pypy_g_handle_bytecode__AccessDirect_None (l_self_13739=l_self_13739@entry=0x7ffff7982410, l_co_code_2=<optimized out>, l_next_instr_86=<optimized out>,
l_ec_42=<optimized out>) at pypy_interpreter_2.c:53861
#52 0x00005555570b6956 in pypy_g_portal_7 (l_next_instr_164=l_next_instr_164@entry=0, l_is_being_profiled_11=l_is_being_profiled_11@entry=false, l_pycode_25=<optimized out>,
l_self_4901=0x7ffff7982410, l_ec_15=<optimized out>) at pypy_module_pypyjit.c:79
#53 0x000055555745624a in pypy_g_ll_portal_runner__Unsigned_Bool_pypy_interpreter (l_stararg0_5714=0, l_v1570273=<optimized out>, l_v1570272=<optimized out>,
l_stararg3_730=<optimized out>, l_stararg3_730@entry=0x7ffff7982410, l_v1570271=<optimized out>) at rpython_jit_metainterp.c:8632
#54 0x00005555570b68f8 in pypy_g_PyFrame_dispatch (l_self_3310=l_self_3310@entry=0x7ffff7982410, l_pycode_24=<optimized out>, l_next_instr_162=l_next_instr_162@entry=0,
l_ec_72=l_ec_72@entry=0x7ffff794c9d8) at pypy_module_pypyjit.c:31
#55 0x00005555569f638e in pypy_g_execute_frame (l_self_13536=l_self_13536@entry=0x7ffff7982410, l_w_arg_or_err_9=<optimized out>, l_w_arg_or_err_9@entry=0x0) at pypy_interpreter_1.c:43132
#56 0x000055555786eb48 in __vmprof_eval_vmprof (l_stararg0_6284=0x7ffff7982410, l_stararg1_5122=0x0) at rpython_rlib_rvmprof.c:91
#57 0x00005555569c5e1b in pypy_g_call_function__star_3 (l_w_func_54=<optimized out>, l_stararg0_5023=<optimized out>, l_stararg1_3844=<optimized out>, l_stararg2_1805=<optimized out>)
at pypy_interpreter.c:2090
#58 0x00005555569a4148 in pypy_g_entry_point (l_l1_70=<optimized out>) at pypy_goal.c:2187
#59 0x00005555579757b2 in pypy_g_entrypoint_wrapper (l_argc_1=l_argc_1@entry=3, l_argv_5=l_argv_5@entry=0x7fffffffd848) at rpython_translator_c.c:60
#60 0x00005555579a28c0 in pypy_main_function (argc=3, argv=0x7fffffffd848) at entrypoint.c:87
#61 0x00007ffff7bda2cc in ?? () from /usr/lib64/libc.so.6
#62 0x00007ffff7bda385 in __libc_start_main () from /usr/lib64/libc.so.6
#63 0x00005555567901d1 in _start ()
Meanwhile in cpython land (EDIT: Python 3.10 (and Python 3.8) have a backport pending for the commit @mgorny linked (https://github.com/python/cpython/commit/48e2010d92076b472922fa632fffc98ee150004f) to hide md4 and other deprecated algos. from the available list):
$ python3.10 --version
Python 3.10.4
$ python3.10 -c 'import hashlib; m=hashlib.new("md4");m.update(b"foo");print(m.hexdigest())'
Traceback (most recent call last):
File "/usr/lib/python3.10/hashlib.py", line 160, in __hash_new
return _hashlib.new(name, data, **kwargs)
ValueError: [digital envelope routines] unsupported
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.10/hashlib.py", line 166, in __hash_new
return __get_builtin_constructor(name)(data)
File "/usr/lib/python3.10/hashlib.py", line 123, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md4
Let me know if I can provide any other information. Thanks!