summaryrefslogtreecommitdiff
path: root/dev-python/oscrypto
diff options
context:
space:
mode:
authorroot <root@alpha.trunkmasters.com>2026-06-04 16:47:34 -0500
committerroot <root@alpha.trunkmasters.com>2026-06-04 16:47:34 -0500
commitdda948891d3731927b821ce31f9d9a2d03ba20c5 (patch)
tree99cd40be4cbb0606260da212cd81b8ab2db9da9b /dev-python/oscrypto
parenta3ceca1b4c0d9bdb550dc23f06ffbb5a8e033bc7 (diff)
downloadbaldeagleos-repo-dda948891d3731927b821ce31f9d9a2d03ba20c5.tar.gz
baldeagleos-repo-dda948891d3731927b821ce31f9d9a2d03ba20c5.tar.xz
baldeagleos-repo-dda948891d3731927b821ce31f9d9a2d03ba20c5.zip
Adding metadata
Diffstat (limited to 'dev-python/oscrypto')
-rw-r--r--dev-python/oscrypto/Manifest1
-rw-r--r--dev-python/oscrypto/files/openssl-3.0.10-fix.patch38
-rw-r--r--dev-python/oscrypto/files/py3.12.patch902
-rw-r--r--dev-python/oscrypto/metadata.xml5
-rw-r--r--dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild47
5 files changed, 993 insertions, 0 deletions
diff --git a/dev-python/oscrypto/Manifest b/dev-python/oscrypto/Manifest
new file mode 100644
index 000000000000..3007bc1fce26
--- /dev/null
+++ b/dev-python/oscrypto/Manifest
@@ -0,0 +1 @@
+DIST oscrypto-1.3.0.gh.tar.gz 313874 BLAKE2B 6dd3331978d0ca8e63a136988d55bd6e1314078256f6c5141f26d49382e8908b58974c8f8d281a98a7e5efff2e477488baf7a37e3ea4a17bf887c92f9b1d9985 SHA512 b5baf72e1a09615b267be4d1c4baf2375bb939b5bd3d717ca9ca70776541f590a8608bef95991967e23f3794e6220709ed2fe5acdedfe9bfce1921c879a74bec
diff --git a/dev-python/oscrypto/files/openssl-3.0.10-fix.patch b/dev-python/oscrypto/files/openssl-3.0.10-fix.patch
new file mode 100644
index 000000000000..a1c2e44c41fb
--- /dev/null
+++ b/dev-python/oscrypto/files/openssl-3.0.10-fix.patch
@@ -0,0 +1,38 @@
+From ebbc944485b278192b60080ea1f495e287efb4f8 Mon Sep 17 00:00:00 2001
+From: Martin Journois <BibMartin@users.noreply.github.com>
+Date: Thu, 17 Aug 2023 13:09:31 +0200
+Subject: [PATCH] MJ: Fix #75 bug with openssl 3.0.10 (#76)
+
+* MJ: Fix #75 bug with openssl 3.0.10
+* MJ: Add fix suggested by @vcunat on _libcrypto_ctypes regex
+---
+ oscrypto/_openssl/_libcrypto_cffi.py | 2 +-
+ oscrypto/_openssl/_libcrypto_ctypes.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/oscrypto/_openssl/_libcrypto_cffi.py b/oscrypto/_openssl/_libcrypto_cffi.py
+index 8aed03e..14eb576 100644
+--- a/oscrypto/_openssl/_libcrypto_cffi.py
++++ b/oscrypto/_openssl/_libcrypto_cffi.py
+@@ -37,7 +37,7 @@
+
+ is_libressl = 'LibreSSL' in version_string
+
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
+ if not version_match:
+ version_match = re.search('(?<=LibreSSL )(\\d\\.\\d(\\.\\d)?)\\b', version_string)
+ if not version_match:
+diff --git a/oscrypto/_openssl/_libcrypto_ctypes.py b/oscrypto/_openssl/_libcrypto_ctypes.py
+index e33ebbc..9cb294a 100644
+--- a/oscrypto/_openssl/_libcrypto_ctypes.py
++++ b/oscrypto/_openssl/_libcrypto_ctypes.py
+@@ -40,7 +40,7 @@
+
+ is_libressl = 'LibreSSL' in version_string
+
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
+ if not version_match:
+ version_match = re.search('(?<=LibreSSL )(\\d\\.\\d(\\.\\d)?)\\b', version_string)
+ if not version_match:
diff --git a/dev-python/oscrypto/files/py3.12.patch b/dev-python/oscrypto/files/py3.12.patch
new file mode 100644
index 000000000000..0bb8cb0cda02
--- /dev/null
+++ b/dev-python/oscrypto/files/py3.12.patch
@@ -0,0 +1,902 @@
+From 3be536e4a61ac5fbd403ee80cdb54cb666f34679 Mon Sep 17 00:00:00 2001
+From: Dominik 'Rathann' Mierzejewski <dominik@greysector.net>
+Date: Thu, 17 Aug 2023 09:05:29 +0200
+Subject: [PATCH 01/13] use `importlib` instead of deprecated `imp` module
+
+This fixes tests with python 3.12 where the `imp` module was
+[removed](https://docs.python.org/3.12/whatsnew/3.12.html#removed).
+
+This should fix issue #74.
+---
+ tests/__init__.py | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 4c65360..90bede4 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -1,7 +1,7 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, print_function
+
+-import imp
++import importlib
+ import os
+ import unittest
+
+@@ -94,8 +94,7 @@ def _import_from(mod, path, mod_dir=None):
+ return None
+
+ try:
+- mod_info = imp.find_module(mod_dir, [path])
+- return imp.load_module(mod, *mod_info)
++ return importlib.import_module(mod)
+ except ImportError:
+ return None
+
+
+From 199f07eefb9c0d1d5ad8093c012fbdae1fefa633 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 07:14:40 -0400
+Subject: [PATCH 02/13] Fix compatibility with Python 2.6
+
+---
+ tests/__init__.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 90bede4..3ca9334 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -1,10 +1,15 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, print_function
+
+-import importlib
+ import os
++import sys
+ import unittest
+
++if sys.version_info < (3,):
++ import imp as importlib
++else:
++ import importlib
++
+
+ __version__ = '1.3.0'
+ __version_info__ = (1, 3, 0)
+
+From 19de26bdad3154dc30c6661b652c459438fa9be2 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 07:25:49 -0400
+Subject: [PATCH 03/13] Fix both imp and importlib implementations
+
+---
+ tests/__init__.py | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 3ca9334..7aab84d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -6,7 +6,7 @@
+ import unittest
+
+ if sys.version_info < (3,):
+- import imp as importlib
++ import imp
+ else:
+ import importlib
+
+@@ -99,7 +99,12 @@ def _import_from(mod, path, mod_dir=None):
+ return None
+
+ try:
+- return importlib.import_module(mod)
++ if sys.version_info < (3,):
++ mod_info = imp.find_module(mod_dir, [path])
++ return imp.load_module(mod, *mod_info)
++ else:
++ mod_info = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
++ return importlib.import_module(mod, *mod_info)
+ except ImportError:
+ return None
+
+
+From 6973b915069babf665bc223979cd86b2dc262da4 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 07:34:37 -0400
+Subject: [PATCH 04/13] More importlib fixes
+
+---
+ tests/__init__.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 7aab84d..957c083 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -103,8 +103,10 @@ def _import_from(mod, path, mod_dir=None):
+ mod_info = imp.find_module(mod_dir, [path])
+ return imp.load_module(mod, *mod_info)
+ else:
+- mod_info = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
+- return importlib.import_module(mod, *mod_info)
++ spec = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
++ module = importlib.util.module_from_spec(spec)
++ sys.modules[mod] = module
++ spec.loader.exec_module(module)
+ except ImportError:
+ return None
+
+
+From 8843c89acae8435a7ba731b42750e42caef87a70 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 07:35:40 -0400
+Subject: [PATCH 05/13] Python 3.3 has a different importlib implementation
+
+---
+ tests/__init__.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 957c083..8339b5d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -5,7 +5,7 @@
+ import sys
+ import unittest
+
+-if sys.version_info < (3,):
++if sys.version_info < (3, 5):
+ import imp
+ else:
+ import importlib
+@@ -99,7 +99,7 @@ def _import_from(mod, path, mod_dir=None):
+ return None
+
+ try:
+- if sys.version_info < (3,):
++ if sys.version_info < (3, 5):
+ mod_info = imp.find_module(mod_dir, [path])
+ return imp.load_module(mod, *mod_info)
+ else:
+
+From 53fa3ca263ad6bc04e4a8a56f180b82bdc88aa03 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 08:22:21 -0400
+Subject: [PATCH 06/13] Attempt a different importlib implementation
+
+---
+ tests/__init__.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 8339b5d..0eecf2f 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -103,7 +103,12 @@ def _import_from(mod, path, mod_dir=None):
+ mod_info = imp.find_module(mod_dir, [path])
+ return imp.load_module(mod, *mod_info)
+ else:
+- spec = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
++ loader_details = (
++ importlib.machinery.SourceFileLoader,
++ importlib.machinery.SOURCE_SUFFIXES
++ )
++ finder = importlib.machinery.FileFinder(path, loader_details)
++ spec = finder.find_spec(mod_dir)
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[mod] = module
+ spec.loader.exec_module(module)
+
+From b013e440061c88dfe0301309b695c7b47bcc1e72 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Thu, 17 Aug 2023 15:52:30 -0400
+Subject: [PATCH 07/13] Hopefully some fully working Python 3.12-compatible
+ import backflips
+
+---
+ dev/_import.py | 35 ++++++++++++++++++++++++++++++++---
+ tests/__init__.py | 4 ++++
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index d64c028..016c576 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -1,12 +1,19 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, print_function
+
+-import imp
+ import sys
+ import os
+
+ from . import build_root, package_name, package_root
+
++if sys.version_info < (3, 5):
++ import imp
++else:
++ import importlib
++ import importlib.machinery
++ import importlib.util
++
++
+ if sys.version_info < (3,):
+ getcwd = os.getcwdu
+ else:
+@@ -34,6 +41,14 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ None if not loaded, otherwise the module
+ """
+
++ if mod in sys.modules:
++ return sys.modules[mod]
++
++ if mod_dir is None:
++ full_mod = mod
++ else:
++ full_mod = mod_dir
++
+ if mod_dir is None:
+ mod_dir = mod.replace('.', os.sep)
+
+@@ -49,8 +64,22 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ path = os.path.join(path, append)
+
+ try:
+- mod_info = imp.find_module(mod_dir, [path])
+- return imp.load_module(mod, *mod_info)
++ if sys.version_info < (3, 5):
++ mod_info = imp.find_module(mod_dir, [path])
++ return imp.load_module(mod, *mod_info)
++
++ else:
++ loader_details = (
++ importlib.machinery.SourceFileLoader,
++ importlib.machinery.SOURCE_SUFFIXES
++ )
++ finder = importlib.machinery.FileFinder(path, loader_details)
++ spec = finder.find_spec(full_mod)
++ module = importlib.util.module_from_spec(spec)
++ sys.modules[mod] = module
++ spec.loader.exec_module(module)
++ return module
++
+ except ImportError:
+ if allow_error:
+ raise
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 0eecf2f..9759ae3 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -89,6 +89,9 @@ def _import_from(mod, path, mod_dir=None):
+ None if not loaded, otherwise the module
+ """
+
++ if mod in sys.modules:
++ return sys.modules[mod]
++
+ if mod_dir is None:
+ mod_dir = mod
+
+@@ -112,6 +115,7 @@ def _import_from(mod, path, mod_dir=None):
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[mod] = module
+ spec.loader.exec_module(module)
++ return module
+ except ImportError:
+ return None
+
+
+From 8ec71631b5adf6f6ab34c7cc3fe8e229a2bdcbd7 Mon Sep 17 00:00:00 2001
+From: Dominik Mierzejewski <dominik@greysector.net>
+Date: Fri, 18 Aug 2023 11:18:06 +0200
+Subject: [PATCH 08/13] Use importlib with python 3.5+
+
+This fixes `python run.py ci` under python 3.12.
+---
+ dev/coverage.py | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/dev/coverage.py b/dev/coverage.py
+index bb99a4f..6e669fe 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -4,7 +4,6 @@
+ import cgi
+ import codecs
+ import coverage
+-import imp
+ import json
+ import os
+ import unittest
+@@ -33,6 +32,11 @@
+ else:
+ Pattern = re.Pattern
+
++if sys.version_info < (3, 5):
++ import imp
++else:
++ import importlib
++
+
+ def run(ci=False):
+ """
+@@ -103,8 +107,19 @@ def _load_package_tests(name):
+ if not os.path.exists(package_dir):
+ return []
+
+- tests_module_info = imp.find_module('tests', [package_dir])
+- tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
++ if sys.version_info < (3, 5):
++ tests_module_info = imp.find_module('tests', [package_dir])
++ tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
++ else:
++ loader_details = (
++ importlib.machinery.SourceFileLoader,
++ importlib.machinery.SOURCE_SUFFIXES
++ )
++ finder = importlib.machinery.FileFinder(package_dir, loader_details)
++ spec = finder.find_spec('tests')
++ test_module = importlib.util.module_from_spec(spec)
++ sys.modules['%s.tests' % name] = test_module
++ spec.loader.exec_module(test_module)
+ return tests_module.test_classes()
+
+
+
+From 23d848a500413847a63df740af543e0fdaba5558 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Tue, 22 Aug 2023 06:56:36 -0400
+Subject: [PATCH 09/13] Reuse _import_from in coverage task, fixing module name
+
+---
+ dev/coverage.py | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
+diff --git a/dev/coverage.py b/dev/coverage.py
+index 6e669fe..00684d0 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -16,6 +16,7 @@
+ from fnmatch import fnmatch
+
+ from . import package_name, package_root, other_packages
++from ._import import _import_from
+
+ if sys.version_info < (3,):
+ str_cls = unicode # noqa
+@@ -32,11 +33,6 @@
+ else:
+ Pattern = re.Pattern
+
+-if sys.version_info < (3, 5):
+- import imp
+-else:
+- import importlib
+-
+
+ def run(ci=False):
+ """
+@@ -107,20 +103,7 @@ def _load_package_tests(name):
+ if not os.path.exists(package_dir):
+ return []
+
+- if sys.version_info < (3, 5):
+- tests_module_info = imp.find_module('tests', [package_dir])
+- tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
+- else:
+- loader_details = (
+- importlib.machinery.SourceFileLoader,
+- importlib.machinery.SOURCE_SUFFIXES
+- )
+- finder = importlib.machinery.FileFinder(package_dir, loader_details)
+- spec = finder.find_spec('tests')
+- test_module = importlib.util.module_from_spec(spec)
+- sys.modules['%s.tests' % name] = test_module
+- spec.loader.exec_module(test_module)
+- return tests_module.test_classes()
++ return _import_from('%s.tests' % name, package_dir, 'tests').test_classes()
+
+
+ def _env_info():
+
+From 9941d3b96e8aa08622d00954d89005dcf6e94b94 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Tue, 22 Aug 2023 07:03:26 -0400
+Subject: [PATCH 10/13] Factor out remaining usage of imp module
+
+---
+ dev/build.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/dev/build.py b/dev/build.py
+index 4899594..f429fee 100644
+--- a/dev/build.py
++++ b/dev/build.py
+@@ -1,7 +1,6 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, print_function
+
+-import imp
+ import os
+ import tarfile
+ import zipfile
+@@ -9,6 +8,7 @@
+ import setuptools.sandbox
+
+ from . import package_root, package_name, has_tests_package
++from ._import import _import_from
+
+
+ def _list_zip(filename):
+@@ -45,8 +45,8 @@ def run():
+
+ # Trying to call setuptools.sandbox.run_setup(setup, ['--version'])
+ # resulted in a segfault, so we do this instead
+- module_info = imp.find_module('version', [os.path.join(package_root, package_name)])
+- version_mod = imp.load_module('%s.version' % package_name, *module_info)
++ package_dir = os.path.join(package_root, package_name)
++ version_mod = _import_from('%s.version' % package_name, package_dir, 'version')
+
+ pkg_name_info = (package_name, version_mod.__version__)
+ print('Building %s-%s' % pkg_name_info)
+
+From 799aa0d2f4a954d3fc120ab382c8dd4322758654 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Tue, 22 Aug 2023 16:29:39 -0400
+Subject: [PATCH 11/13] Rewrite importlib import mechanism
+
+---
+ dev/_import.py | 69 ++++++++++++++++++++++++++++++++---------
+ tests/__init__.py | 79 ++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 122 insertions(+), 26 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 016c576..20720e7 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -10,7 +10,7 @@
+ import imp
+ else:
+ import importlib
+- import importlib.machinery
++ import importlib.abc
+ import importlib.util
+
+
+@@ -20,6 +20,48 @@
+ getcwd = os.getcwd
+
+
++class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++ def setup(self):
++ self.modules = {}
++ sys.meta_path.insert(0, self)
++
++ def add_module(self, package_name, package_path):
++ if package_name not in self.modules:
++ self.modules[package_name] = package_path
++
++ def find_spec(self, fullname, path, target=None):
++ name_parts = fullname.split('.')
++ if name_parts[0] not in self.modules:
++ return None
++
++ package = name_parts[0]
++ package_path = self.modules[package]
++
++ fullpath = os.path.join(package_path, *name_parts[1:])
++
++ if os.path.isdir(fullpath):
++ filename = os.path.join(fullpath, "__init__.py")
++ submodule_locations = [fullpath]
++ else:
++ filename = fullpath + ".py"
++ submodule_locations = None
++
++ if not os.path.exists(filename):
++ return None
++
++ return importlib.util.spec_from_file_location(
++ fullname,
++ filename,
++ loader=None,
++ submodule_search_locations=submodule_locations
++ )
++
++
++if sys.version_info >= (3, 5):
++ CUSTOM_FINDER = ModCryptoMetaFinder()
++ CUSTOM_FINDER.setup()
++
++
+ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ """
+ Imports a module from a specific path
+@@ -47,7 +89,7 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ if mod_dir is None:
+ full_mod = mod
+ else:
+- full_mod = mod_dir
++ full_mod = mod_dir.replace(os.sep, '.')
+
+ if mod_dir is None:
+ mod_dir = mod.replace('.', os.sep)
+@@ -55,8 +97,11 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ if not os.path.exists(path):
+ return None
+
+- if not os.path.exists(os.path.join(path, mod_dir)) \
+- and not os.path.exists(os.path.join(path, mod_dir + '.py')):
++ source_path = os.path.join(path, mod_dir, '__init__.py')
++ if not os.path.exists(source_path):
++ source_path = os.path.join(path, mod_dir + '.py')
++
++ if not os.path.exists(source_path):
+ return None
+
+ if os.sep in mod_dir:
+@@ -69,16 +114,12 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+ return imp.load_module(mod, *mod_info)
+
+ else:
+- loader_details = (
+- importlib.machinery.SourceFileLoader,
+- importlib.machinery.SOURCE_SUFFIXES
+- )
+- finder = importlib.machinery.FileFinder(path, loader_details)
+- spec = finder.find_spec(full_mod)
+- module = importlib.util.module_from_spec(spec)
+- sys.modules[mod] = module
+- spec.loader.exec_module(module)
+- return module
++ package = mod.split('.', 1)[0]
++ package_dir = full_mod.split('.', 1)[0]
++ package_path = os.path.join(path, package_dir)
++ CUSTOM_FINDER.add_module(package, package_path)
++
++ return importlib.import_module(mod)
+
+ except ImportError:
+ if allow_error:
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 9759ae3..2e24046 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -9,6 +9,8 @@
+ import imp
+ else:
+ import importlib
++ import importlib.abc
++ import importlib.util
+
+
+ __version__ = '1.3.0'
+@@ -71,6 +73,48 @@ def local_oscrypto():
+ return (_asn1crypto_module, _oscrypto_module)
+
+
++class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++ def setup(self):
++ self.modules = {}
++ sys.meta_path.insert(0, self)
++
++ def add_module(self, package_name, package_path):
++ if package_name not in self.modules:
++ self.modules[package_name] = package_path
++
++ def find_spec(self, fullname, path, target=None):
++ name_parts = fullname.split('.')
++ if name_parts[0] not in self.modules:
++ return None
++
++ package = name_parts[0]
++ package_path = self.modules[package]
++
++ fullpath = os.path.join(package_path, *name_parts[1:])
++
++ if os.path.isdir(fullpath):
++ filename = os.path.join(fullpath, "__init__.py")
++ submodule_locations = [fullpath]
++ else:
++ filename = fullpath + ".py"
++ submodule_locations = None
++
++ if not os.path.exists(filename):
++ return None
++
++ return importlib.util.spec_from_file_location(
++ fullname,
++ filename,
++ loader=None,
++ submodule_search_locations=submodule_locations
++ )
++
++
++if sys.version_info >= (3, 5):
++ CUSTOM_FINDER = ModCryptoMetaFinder()
++ CUSTOM_FINDER.setup()
++
++
+ def _import_from(mod, path, mod_dir=None):
+ """
+ Imports a module from a specific path
+@@ -93,29 +137,40 @@ def _import_from(mod, path, mod_dir=None):
+ return sys.modules[mod]
+
+ if mod_dir is None:
+- mod_dir = mod
++ full_mod = mod
++ else:
++ full_mod = mod_dir.replace(os.sep, '.')
++
++ if mod_dir is None:
++ mod_dir = mod.replace('.', os.sep)
+
+ if not os.path.exists(path):
+ return None
+
+- if not os.path.exists(os.path.join(path, mod_dir)):
++ source_path = os.path.join(path, mod_dir, '__init__.py')
++ if not os.path.exists(source_path):
++ source_path = os.path.join(path, mod_dir + '.py')
++
++ if not os.path.exists(source_path):
+ return None
+
++ if os.sep in mod_dir:
++ append, mod_dir = mod_dir.rsplit(os.sep, 1)
++ path = os.path.join(path, append)
++
+ try:
+ if sys.version_info < (3, 5):
+ mod_info = imp.find_module(mod_dir, [path])
+ return imp.load_module(mod, *mod_info)
++
+ else:
+- loader_details = (
+- importlib.machinery.SourceFileLoader,
+- importlib.machinery.SOURCE_SUFFIXES
+- )
+- finder = importlib.machinery.FileFinder(path, loader_details)
+- spec = finder.find_spec(mod_dir)
+- module = importlib.util.module_from_spec(spec)
+- sys.modules[mod] = module
+- spec.loader.exec_module(module)
+- return module
++ package = mod.split('.', 1)[0]
++ package_dir = full_mod.split('.', 1)[0]
++ package_path = os.path.join(path, package_dir)
++ CUSTOM_FINDER.add_module(package, package_path)
++
++ return importlib.import_module(mod)
++
+ except ImportError:
+ return None
+
+
+From 8a588fa0223f08f817e702f7f2cc4ef81017af26 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Tue, 22 Aug 2023 16:35:17 -0400
+Subject: [PATCH 12/13] Fix custom importlib code for Python < 3.5
+
+---
+ dev/_import.py | 73 +++++++++++++++++++++++------------------------
+ tests/__init__.py | 58 ++++++++++++++++++-------------------
+ 2 files changed, 65 insertions(+), 66 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 20720e7..2d016db 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -19,45 +19,44 @@
+ else:
+ getcwd = os.getcwd
+
+-
+-class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
+- def setup(self):
+- self.modules = {}
+- sys.meta_path.insert(0, self)
+-
+- def add_module(self, package_name, package_path):
+- if package_name not in self.modules:
+- self.modules[package_name] = package_path
+-
+- def find_spec(self, fullname, path, target=None):
+- name_parts = fullname.split('.')
+- if name_parts[0] not in self.modules:
+- return None
+-
+- package = name_parts[0]
+- package_path = self.modules[package]
+-
+- fullpath = os.path.join(package_path, *name_parts[1:])
+-
+- if os.path.isdir(fullpath):
+- filename = os.path.join(fullpath, "__init__.py")
+- submodule_locations = [fullpath]
+- else:
+- filename = fullpath + ".py"
+- submodule_locations = None
+-
+- if not os.path.exists(filename):
+- return None
+-
+- return importlib.util.spec_from_file_location(
+- fullname,
+- filename,
+- loader=None,
+- submodule_search_locations=submodule_locations
+- )
++if sys.version_info >= (3, 5):
++ class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++ def setup(self):
++ self.modules = {}
++ sys.meta_path.insert(0, self)
++
++ def add_module(self, package_name, package_path):
++ if package_name not in self.modules:
++ self.modules[package_name] = package_path
++
++ def find_spec(self, fullname, path, target=None):
++ name_parts = fullname.split('.')
++ if name_parts[0] not in self.modules:
++ return None
++
++ package = name_parts[0]
++ package_path = self.modules[package]
++
++ fullpath = os.path.join(package_path, *name_parts[1:])
++
++ if os.path.isdir(fullpath):
++ filename = os.path.join(fullpath, "__init__.py")
++ submodule_locations = [fullpath]
++ else:
++ filename = fullpath + ".py"
++ submodule_locations = None
++
++ if not os.path.exists(filename):
++ return None
++
++ return importlib.util.spec_from_file_location(
++ fullname,
++ filename,
++ loader=None,
++ submodule_search_locations=submodule_locations
++ )
+
+
+-if sys.version_info >= (3, 5):
+ CUSTOM_FINDER = ModCryptoMetaFinder()
+ CUSTOM_FINDER.setup()
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 2e24046..e1e92e6 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -73,44 +73,44 @@ def local_oscrypto():
+ return (_asn1crypto_module, _oscrypto_module)
+
+
+-class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
+- def setup(self):
+- self.modules = {}
+- sys.meta_path.insert(0, self)
++if sys.version_info >= (3, 5):
++ class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++ def setup(self):
++ self.modules = {}
++ sys.meta_path.insert(0, self)
+
+- def add_module(self, package_name, package_path):
+- if package_name not in self.modules:
+- self.modules[package_name] = package_path
++ def add_module(self, package_name, package_path):
++ if package_name not in self.modules:
++ self.modules[package_name] = package_path
+
+- def find_spec(self, fullname, path, target=None):
+- name_parts = fullname.split('.')
+- if name_parts[0] not in self.modules:
+- return None
++ def find_spec(self, fullname, path, target=None):
++ name_parts = fullname.split('.')
++ if name_parts[0] not in self.modules:
++ return None
+
+- package = name_parts[0]
+- package_path = self.modules[package]
++ package = name_parts[0]
++ package_path = self.modules[package]
+
+- fullpath = os.path.join(package_path, *name_parts[1:])
++ fullpath = os.path.join(package_path, *name_parts[1:])
+
+- if os.path.isdir(fullpath):
+- filename = os.path.join(fullpath, "__init__.py")
+- submodule_locations = [fullpath]
+- else:
+- filename = fullpath + ".py"
+- submodule_locations = None
++ if os.path.isdir(fullpath):
++ filename = os.path.join(fullpath, "__init__.py")
++ submodule_locations = [fullpath]
++ else:
++ filename = fullpath + ".py"
++ submodule_locations = None
+
+- if not os.path.exists(filename):
+- return None
++ if not os.path.exists(filename):
++ return None
+
+- return importlib.util.spec_from_file_location(
+- fullname,
+- filename,
+- loader=None,
+- submodule_search_locations=submodule_locations
+- )
++ return importlib.util.spec_from_file_location(
++ fullname,
++ filename,
++ loader=None,
++ submodule_search_locations=submodule_locations
++ )
+
+
+-if sys.version_info >= (3, 5):
+ CUSTOM_FINDER = ModCryptoMetaFinder()
+ CUSTOM_FINDER.setup()
+
+
+From d9f8e2ff88e722e3af6bf592c097298505a40381 Mon Sep 17 00:00:00 2001
+From: wbond <will@wbond.net>
+Date: Tue, 22 Aug 2023 16:45:45 -0400
+Subject: [PATCH 13/13] Fix test loading
+
+---
+ dev/_import.py | 1 -
+ dev/coverage.py | 2 +-
+ tests/__init__.py | 1 -
+ 3 files changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 2d016db..c0a1983 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -56,7 +56,6 @@ def find_spec(self, fullname, path, target=None):
+ submodule_search_locations=submodule_locations
+ )
+
+-
+ CUSTOM_FINDER = ModCryptoMetaFinder()
+ CUSTOM_FINDER.setup()
+
+diff --git a/dev/coverage.py b/dev/coverage.py
+index 00684d0..98f140b 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -103,7 +103,7 @@ def _load_package_tests(name):
+ if not os.path.exists(package_dir):
+ return []
+
+- return _import_from('%s.tests' % name, package_dir, 'tests').test_classes()
++ return _import_from('%s_tests' % name, package_dir, 'tests').test_classes()
+
+
+ def _env_info():
+diff --git a/tests/__init__.py b/tests/__init__.py
+index e1e92e6..3ae721d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -110,7 +110,6 @@ def find_spec(self, fullname, path, target=None):
+ submodule_search_locations=submodule_locations
+ )
+
+-
+ CUSTOM_FINDER = ModCryptoMetaFinder()
+ CUSTOM_FINDER.setup()
+
diff --git a/dev-python/oscrypto/metadata.xml b/dev-python/oscrypto/metadata.xml
new file mode 100644
index 000000000000..5f33304011d5
--- /dev/null
+++ b/dev-python/oscrypto/metadata.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://docs.baldeagleos.com/dtd/metadata.dtd">
+<pkgmetadata>
+ <origin>baldeagleos-repo</origin>
+</pkgmetadata>
diff --git a/dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild b/dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild
new file mode 100644
index 000000000000..e9b43ccae20e
--- /dev/null
+++ b/dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild
@@ -0,0 +1,47 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+DISTUTILS_USE_PEP517=setuptools
+inherit edo distutils-r1 optfeature
+
+DESCRIPTION="TLS sockets, key generation, encryption, decryption, signing, verification"
+HOMEPAGE="
+ https://pypi.org/project/oscrypto/
+ https://github.com/wbond/oscrypto
+"
+SRC_URI="https://github.com/wbond/${PN}/archive/${PV}.tar.gz -> ${P}.gh.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+RDEPEND="
+ dev-libs/openssl
+ >=dev-python/asn1crypto-1.5.1[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ test? (
+ $(python_gen_cond_dep 'dev-python/cffi[${PYTHON_USEDEP}]' 'python*')
+ )
+"
+
+DOCS=( docs {changelog,readme}.md )
+
+PATCHES=(
+ "${FILESDIR}"/openssl-3.0.10-fix.patch
+ "${FILESDIR}"/py3.12.patch
+)
+
+distutils_enable_tests unittest
+
+python_test() {
+ local -x OSCRYPTO_SKIP_INTERNET_TESTS="true"
+ edo ${EPYTHON} -m tests
+}
+
+pkg_postinst() {
+ optfeature "faster FFI" virtual/python-cffi
+}