aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatti Picus <matti.picus@gmail.com>2022-05-16 22:04:38 +0300
committerMichał Górny <mgorny@gentoo.org>2022-05-17 09:31:30 +0200
commitb7b63edf88a7f97c9ae404964833a8088d511771 (patch)
tree307128a925f333b63fdc4572d8b8626e476977ce
parentmerge py3.8 (diff)
downloadpypy-gentoo-3.9-7.3.9_p1.tar.gz
pypy-gentoo-3.9-7.3.9_p1.tar.bz2
pypy-gentoo-3.9-7.3.9_p1.zip
commit e2ce39f3ebb5a61c70a7fb55444fe2ea99612cfb Author: Matti Picus <matti.picus@gmail.com> Date: 2022-05-16 21:02:23 +0200 use EVP_MD_do_all_provided on OpenSSL3 to list only supported algorithms in hashlib.algorithms_available (BPO-47101) (issue 3741)
-rw-r--r--lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py2
-rw-r--r--lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py6
-rw-r--r--lib_pypy/_hashlib/__init__.py31
3 files changed, 30 insertions, 9 deletions
diff --git a/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py b/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py
index 456b869260..e06af80c02 100644
--- a/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py
+++ b/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py
@@ -59,6 +59,8 @@ ffi = build_ffi_for_binding(
# This goes first so we can define some cryptography-wide symbols.
"cryptography",
+ # Provider comes early as well so we define OSSL_LIB_CTX
+ "provider",
"aes",
"asn1",
"bignum",
diff --git a/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py b/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
index 4552505f18..04a4b15af2 100644
--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
+++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
@@ -63,9 +63,9 @@ int EVP_DigestFinalXOF(EVP_MD_CTX *, unsigned char *, size_t);
const EVP_MD *EVP_get_digestbyname(const char *);
int EVP_MD_size(const EVP_MD *);
void EVP_MD_do_all(void (*) (const EVP_MD *, const char *, const char *, void *), void *);
+void EVP_MD_do_all_provided(OSSL_LIB_CTX *, void (*)(EVP_MD *, void *), void *);
int EVP_MD_nid(const EVP_MD *);
-
EVP_PKEY *EVP_PKEY_new(void);
void EVP_PKEY_free(EVP_PKEY *);
int EVP_PKEY_type(int);
@@ -210,6 +210,10 @@ int (*EVP_PKEY_set1_tls_encodedpoint)(EVP_PKEY *, const unsigned char *,
size_t) = NULL;
#endif
+#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_300
+void (*EVP_MD_do_all_provided)(OSSL_LIB_CTX *, void (*)(EVP_MD *, void *), void *) = NULL;
+#endif
+
#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111
static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 0;
static const long Cryptography_HAS_RAW_KEY = 0;
diff --git a/lib_pypy/_hashlib/__init__.py b/lib_pypy/_hashlib/__init__.py
index a099cc05bb..73e55b6778 100644
--- a/lib_pypy/_hashlib/__init__.py
+++ b/lib_pypy/_hashlib/__init__.py
@@ -144,7 +144,11 @@ class NameFetcher:
def _fetch_names():
name_fetcher = NameFetcher()
handle = ffi.new_handle(name_fetcher)
- lib.EVP_MD_do_all(hash_name_mapper_callback, handle)
+ if lib.OPENSSL_VERSION_NUMBER >= int(0x30000000):
+ lib.EVP_MD_do_all_provided(ffi.cast("OSSL_LIB_CTX*", 0),
+ _openssl_hash_name_mapper, handle)
+ else:
+ lib.EVP_MD_do_all(_openssl_hash_name_mapper, handle)
if name_fetcher.error:
raise name_fetcher.error
meth_names = name_fetcher.meth_names
@@ -153,17 +157,28 @@ def _fetch_names():
name_mapping = {
'blake2s256': 'blake2s',
- 'blake2b512': 'blake2b'
+ 'blake2b512': 'blake2b',
+ 'shake128': 'shake_128',
+ 'shake256': 'shake_256',
}
-@ffi.callback("void(EVP_MD*, const char *, const char *, void*)")
-def hash_name_mapper_callback(evp_md, from_name, to_name, userdata):
+if lib.OPENSSL_VERSION_NUMBER >= int(0x30000000):
+ @ffi.callback("void(EVP_MD*, void*)")
+ def _openssl_hash_name_mapper(evp_md, userdata):
+ return __openssl_hash_name_mapper(evp_md, userdata)
+
+else:
+ @ffi.callback("void(EVP_MD*, const char *, const char *, void*)")
+ def _openssl_hash_name_mapper(evp_md, from_name, to_name, userdata):
+ return __openssl_hash_name_mapper(evp_md, userdata)
+
+def __openssl_hash_name_mapper(evp_md, userdata):
if not evp_md:
return
- # Ignore aliased names, they pollute the list and OpenSSL appears
- # to have a its own definition of alias as the resulting list
- # still contains duplicate and alternate names for several
- # algorithms.
+ nid = lib.EVP_MD_nid(evp_md)
+ if nid == lib.NID_undef:
+ return
+ from_name = lib.OBJ_nid2ln(nid)
lowered = _str_from_buf(from_name).lower().replace('-', '_')
name = name_mapping.get(lowered, lowered)
if name in ('blake2b512', 'sha3-512'):