diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ddb22edce..98cc45d6e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -37,7 +37,7 @@ repos:
- id: check-yaml
# Leave black at the bottom so all touchups are done before it is run.
- repo: https://github.com/psf/black
- rev: 26.1.0
+ rev: 26.5.1
hooks:
- id: black
language_version: python3
diff --git a/azure-pipelines/requirements.txt b/azure-pipelines/requirements.txt
index 745d34ef1..10d18907e 100644
--- a/azure-pipelines/requirements.txt
+++ b/azure-pipelines/requirements.txt
@@ -14,12 +14,10 @@ attrs==22.2.0
# Twisted
# Must match the version bundled in pkgs.zip/src/ for each Python version.
# A version mismatch causes a sys.modules conflict at runtime (see SG-42304).
-Twisted==22.10.0 ; python_version < "3.9"
-Twisted==24.10.0 ; python_version >= "3.9" and python_version < "3.13"
+Twisted==24.10.0 ; python_version < "3.13"
Twisted~=24.11.0 ; python_version >= "3.13"
#-------------------------------------------------------------------------------
# websocket-client
# Test-only dependency (not bundled in pkgs.zip).
-websocket-client==1.6.1 ; python_version < "3.9" # Last version supporting Python 3.7
-websocket-client~=1.9.0 ; python_version >= "3.9"
+websocket-client~=1.9.0
diff --git a/info.yml b/info.yml
index 983a6a19d..ee1e81bb8 100644
--- a/info.yml
+++ b/info.yml
@@ -27,3 +27,4 @@ description: "Provides the server used to listen to Flow Production Tracking cli
# Required minimum versions for this item to run
requires_shotgun_version:
requires_core_version: "v0.19.18"
+minimum_python_version: "3.9"
diff --git a/resources/python/README.md b/resources/python/README.md
index 6a3146978..d5fedd891 100644
--- a/resources/python/README.md
+++ b/resources/python/README.md
@@ -53,19 +53,16 @@ skipped when `System.PullRequest.SourceBranch` ends with `-automated` or
Officially Supported Python Versions:
- macOS
- - 3.7.16
- 3.9.16
- 3.10.13
- 3.11.9
- 3.13
- Windows
- - 3.7.9
- 3.9.13
- 3.10.11
- 3.11.9
- 3.13
- Linux:
- - 3.7.16
- 3.9.16
- 3.10.13
- 3.11.9
@@ -143,40 +140,38 @@ Linux and macOS:
We highly recommend to use [pyenv](https://github.com/pyenv/pyenv).
```shell
-rm -Rf $HOME/venv/tk-framework-desktopserver-37
-pyenv install 3.7.16
-pyenv shell 3.7.16
+pyenv install 3.9.16
+pyenv shell 3.9.16
python -m pip install -U pip virtualenv
-python -m virtualenv $HOME/venv/tk-framework-desktopserver-37
+python -m virtualenv $HOME/venv/tk-framework-desktopserver-39
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
Windows:
- Use an admin powershell console.
- - Install python 3.7.9 from https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64.exe in C:\python\3.7.9
- Install python 3.9.13 from https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe in C:\python\3.9.13
- Install python 3.10.11 from https://www.python.org/ftp/python/3.10.11/python-3.10.11-amd64.exe in C:\python\3.10.11
```shell
-if (test-path $HOME\venv\tk-framework-desktopserver-37) {
- Remove-Item $HOME\venv\tk-framework-desktopserver-37 -Recurse -Force
+if (test-path $HOME\venv\tk-framework-desktopserver-39) {
+ Remove-Item $HOME\venv\tk-framework-desktopserver-39 -Recurse -Force
}
-C:\python\3.7.9\python.exe -m pip install -U pip virtualenv
-C:\python\3.7.9\python.exe -m virtualenv $HOME\venv\tk-framework-desktopserver-37
+C:\python\3.9.13\python.exe -m pip install -U pip virtualenv
+C:\python\3.9.13\python.exe -m virtualenv $HOME\venv\tk-framework-desktopserver-39
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
### In macOS, update requirements.txt files
-- resources/python/requirements/3.7/requirements.txt
+- resources/python/requirements/3.9/requirements.txt
```shell
- # Activate python 3.7 virtualenv
- source $HOME/venv/tk-framework-desktopserver-37/bin/activate
+ # Activate python 3.9 virtualenv
+ source $HOME/venv/tk-framework-desktopserver-39/bin/activate
# Copy requirements.txt to temporal folder
- cp $HOME/instances/tk-framework-desktopserver/resources/python/requirements/3.7/requirements.txt /tmp/requirements.txt
+ cp $HOME/instances/tk-framework-desktopserver/resources/python/requirements/3.9/requirements.txt /tmp/requirements.txt
# Chdir to temporal folder
cd /tmp
@@ -193,14 +188,14 @@ C:\python\3.7.9\python.exe -m virtualenv $HOME\venv\tk-framework-desktopserver-3
# Get the list of packages installed versions
pip list --path temporal_requirements
- # Compare versions and update the file $HOME/instances/tk-framework-desktopserver/resources/python/requirements/3.7/requirements.txt
+ # Compare versions and update the file $HOME/instances/tk-framework-desktopserver/resources/python/requirements/3.9/requirements.txt
# Cleanup everything
rm -Rf temporal_requirements
rm -f requirements.txt
```
-- Repeat steps for Python 3.9 and 3.10
+- Repeat steps for Python 3.10, 3.11, 3.13
### In macOS, activate virtualenvs and execute the script `update_requirements.py`
@@ -210,10 +205,10 @@ every platform (Python Version, Operating System).
```shell
cd $HOME/instances/tk-framework-desktopserver/resources/python
-source $HOME/venv/tk-framework-desktopserver-37/bin/activate
+source $HOME/venv/tk-framework-desktopserver-39/bin/activate
python update_requirements.py --clean-pip
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
### In macOS, activate virtualenvs and execute the script `install_source_only.sh`
@@ -221,10 +216,10 @@ python update_requirements.py --clean-pip
```shell
cd $HOME/instances/tk-framework-desktopserver/resources/python
-source $HOME/venv/tk-framework-desktopserver-37/bin/activate
+source $HOME/venv/tk-framework-desktopserver-39/bin/activate
bash install_source_only.sh
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
### In macOS, push changes to the repository
@@ -247,13 +242,13 @@ cd $HOME/instances/tk-framework-desktopserver
git pull
cd resources/python
-source $HOME/venv/tk-framework-desktopserver-37/bin/activate
+source $HOME/venv/tk-framework-desktopserver-39/bin/activate
bash install_binary_linux.sh
git add .
-git commit -am "Update binary requirements in Linux Python 3.7"
+git commit -am "Update binary requirements in Linux Python 3.9"
git push
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
@@ -262,13 +257,13 @@ git push
```shell
cd $HOME\instances\tk-framework-desktopserver\resources\python
-& "$HOME\venv\tk-framework-desktopserver-37\Scripts\activate.ps1"
+& "$HOME\venv\tk-framework-desktopserver-39\Scripts\activate.ps1"
.\install_binary_windows.ps1
git add .
-git commit -am "Update binary requirements in Windows Python 3.7"
+git commit -am "Update binary requirements in Windows Python 3.9"
git push
-# Repeat steps for Python 3.9 and 3.10
+# Repeat steps for Python 3.10, 3.11, 3.13
```
@@ -282,10 +277,10 @@ git push
```shell
cd $HOME/instances/tk-framework-desktopserver/resources/python
-source $HOME/venv/tk-framework-desktopserver-37/bin/activate
+source $HOME/venv/tk-framework-desktopserver-39/bin/activate
bash install_binary_mac.sh
git add .
-git commit -am "Update binary requirements in macOS Python 3.7"
+git commit -am "Update binary requirements in macOS Python 3.9"
git push
# Repeat steps for each supported Python version
diff --git a/resources/python/bin/3.7/explicit_requirements.txt b/resources/python/bin/3.7/explicit_requirements.txt
deleted file mode 100644
index 9b41ea367..000000000
--- a/resources/python/bin/3.7/explicit_requirements.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-
-# Copyright (c) 2026 Shotgun Software Inc.
-#
-# CONFIDENTIAL AND PROPRIETARY
-#
-# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit
-# Source Code License included in this distribution package. See LICENSE.
-# By accessing, using, copying or modifying this work you indicate your
-# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
-# not expressly granted therein are reserved by Shotgun Software Inc.
-cffi==1.15.1
-cryptography==44.0.3
-zope.interface==6.4.post2
diff --git a/resources/python/bin/3.7/linux/_cffi_backend.cpython-37m-x86_64-linux-gnu.so b/resources/python/bin/3.7/linux/_cffi_backend.cpython-37m-x86_64-linux-gnu.so
deleted file mode 100755
index b392701b2..000000000
Binary files a/resources/python/bin/3.7/linux/_cffi_backend.cpython-37m-x86_64-linux-gnu.so and /dev/null differ
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/INSTALLER b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/LICENSE b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/LICENSE
deleted file mode 100644
index 29225eee9..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-
-Except when otherwise stated (look for LICENSE files in directories or
-information at the beginning of each file) all software and
-documentation is licensed as follows:
-
- The MIT License
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/METADATA b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/METADATA
deleted file mode 100644
index 538e67914..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/METADATA
+++ /dev/null
@@ -1,34 +0,0 @@
-Metadata-Version: 2.1
-Name: cffi
-Version: 1.15.1
-Summary: Foreign Function Interface for Python calling C code.
-Home-page: http://cffi.readthedocs.org
-Author: Armin Rigo, Maciej Fijalkowski
-Author-email: python-cffi@googlegroups.com
-License: MIT
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: License :: OSI Approved :: MIT License
-License-File: LICENSE
-Requires-Dist: pycparser
-
-
-CFFI
-====
-
-Foreign Function Interface for Python calling C code.
-Please see the `Documentation `_.
-
-Contact
--------
-
-`Mailing list `_
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/RECORD b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/RECORD
deleted file mode 100644
index cc5c2513c..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/RECORD
+++ /dev/null
@@ -1,45 +0,0 @@
-_cffi_backend.cpython-37m-x86_64-linux-gnu.so,sha256=zuqIPt-ev7DU23Wj2bzbF9FwoLIx8P2YN90Asem8_Gw,932624
-cffi-1.15.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-cffi-1.15.1.dist-info/LICENSE,sha256=BLgPWwd7vtaICM_rreteNSPyqMmpZJXFh72W3x6sKjM,1294
-cffi-1.15.1.dist-info/METADATA,sha256=KP4G3WmavRgDGwD2b8Y_eDsM1YeV6ckcG6Alz3-D8VY,1144
-cffi-1.15.1.dist-info/RECORD,,
-cffi-1.15.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cffi-1.15.1.dist-info/WHEEL,sha256=FGGRUrvefXOiAJfyJCZAiu4TpTMkXB_CzdEp3x2T96E,150
-cffi-1.15.1.dist-info/entry_points.txt,sha256=y6jTxnyeuLnL-XJcDv8uML3n6wyYiGRg8MTp_QGJ9Ho,75
-cffi-1.15.1.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19
-cffi/__init__.py,sha256=6xB_tafGvhhM5Xvj0Ova3oPC2SEhVlLTEObVLnazeiM,513
-cffi/__pycache__/__init__.cpython-37.pyc,,
-cffi/__pycache__/api.cpython-37.pyc,,
-cffi/__pycache__/backend_ctypes.cpython-37.pyc,,
-cffi/__pycache__/cffi_opcode.cpython-37.pyc,,
-cffi/__pycache__/commontypes.cpython-37.pyc,,
-cffi/__pycache__/cparser.cpython-37.pyc,,
-cffi/__pycache__/error.cpython-37.pyc,,
-cffi/__pycache__/ffiplatform.cpython-37.pyc,,
-cffi/__pycache__/lock.cpython-37.pyc,,
-cffi/__pycache__/model.cpython-37.pyc,,
-cffi/__pycache__/pkgconfig.cpython-37.pyc,,
-cffi/__pycache__/recompiler.cpython-37.pyc,,
-cffi/__pycache__/setuptools_ext.cpython-37.pyc,,
-cffi/__pycache__/vengine_cpy.cpython-37.pyc,,
-cffi/__pycache__/vengine_gen.cpython-37.pyc,,
-cffi/__pycache__/verifier.cpython-37.pyc,,
-cffi/_cffi_errors.h,sha256=zQXt7uR_m8gUW-fI2hJg0KoSkJFwXv8RGUkEDZ177dQ,3908
-cffi/_cffi_include.h,sha256=tKnA1rdSoPHp23FnDL1mDGwFo-Uj6fXfA6vA6kcoEUc,14800
-cffi/_embedding.h,sha256=9tnjF44QRobR8z0FGqAmAZY-wMSBOae1SUPqHccowqc,17680
-cffi/api.py,sha256=yxJalIePbr1mz_WxAHokSwyP5CVYde44m-nolHnbJNo,42064
-cffi/backend_ctypes.py,sha256=h5ZIzLc6BFVXnGyc9xPqZWUS7qGy7yFSDqXe68Sa8z4,42454
-cffi/cffi_opcode.py,sha256=v9RdD_ovA8rCtqsC95Ivki5V667rAOhGgs3fb2q9xpM,5724
-cffi/commontypes.py,sha256=QS4uxCDI7JhtTyjh1hlnCA-gynmaszWxJaRRLGkJa1A,2689
-cffi/cparser.py,sha256=rO_1pELRw1gI1DE1m4gi2ik5JMfpxouAACLXpRPlVEA,44231
-cffi/error.py,sha256=v6xTiS4U0kvDcy4h_BDRo5v39ZQuj-IMRYLv5ETddZs,877
-cffi/ffiplatform.py,sha256=HMXqR8ks2wtdsNxGaWpQ_PyqIvtiuos_vf1qKCy-cwg,4046
-cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747
-cffi/model.py,sha256=_GH_UF1Rn9vC4AvmgJm6qj7RUXXG3eqKPc8bPxxyBKE,21768
-cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976
-cffi/pkgconfig.py,sha256=LP1w7vmWvmKwyqLaU1Z243FOWGNQMrgMUZrvgFuOlco,4374
-cffi/recompiler.py,sha256=YgVYTh2CrXIobo-vMk7_K9mwAXdd_LqB4-IbYABQ488,64598
-cffi/setuptools_ext.py,sha256=RUR17N5f8gpiQBBlXL34P9FtOu1mhHIaAf3WJlg5S4I,8931
-cffi/vengine_cpy.py,sha256=YglN8YS-UaHEv2k2cxgotNWE87dHX20-68EyKoiKUYA,43320
-cffi/vengine_gen.py,sha256=5dX7s1DU6pTBOMI6oTVn_8Bnmru_lj932B6b4v29Hlg,26684
-cffi/verifier.py,sha256=ESwuXWXtXrKEagCKveLRDjFzLNCyaKdqAgAlKREcyhY,11253
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/REQUESTED b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/REQUESTED
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/WHEEL b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/WHEEL
deleted file mode 100644
index 3811098e8..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.1)
-Root-Is-Purelib: false
-Tag: cp37-cp37m-manylinux_2_17_x86_64
-Tag: cp37-cp37m-manylinux2014_x86_64
-
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/entry_points.txt b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/entry_points.txt
deleted file mode 100644
index 4b0274f23..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/entry_points.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-[distutils.setup_keywords]
-cffi_modules = cffi.setuptools_ext:cffi_modules
diff --git a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/top_level.txt b/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/top_level.txt
deleted file mode 100644
index f64577957..000000000
--- a/resources/python/bin/3.7/linux/cffi-1.15.1.dist-info/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-_cffi_backend
-cffi
diff --git a/resources/python/bin/3.7/linux/cffi/__init__.py b/resources/python/bin/3.7/linux/cffi/__init__.py
deleted file mode 100644
index 90e2e6559..000000000
--- a/resources/python/bin/3.7/linux/cffi/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError',
- 'FFIError']
-
-from .api import FFI
-from .error import CDefError, FFIError, VerificationError, VerificationMissing
-from .error import PkgConfigError
-
-__version__ = "1.15.1"
-__version_info__ = (1, 15, 1)
-
-# The verifier module file names are based on the CRC32 of a string that
-# contains the following version number. It may be older than __version__
-# if nothing is clearly incompatible.
-__version_verifier_modules__ = "0.8.6"
diff --git a/resources/python/bin/3.7/linux/cffi/_cffi_errors.h b/resources/python/bin/3.7/linux/cffi/_cffi_errors.h
deleted file mode 100644
index 158e05903..000000000
--- a/resources/python/bin/3.7/linux/cffi/_cffi_errors.h
+++ /dev/null
@@ -1,149 +0,0 @@
-#ifndef CFFI_MESSAGEBOX
-# ifdef _MSC_VER
-# define CFFI_MESSAGEBOX 1
-# else
-# define CFFI_MESSAGEBOX 0
-# endif
-#endif
-
-
-#if CFFI_MESSAGEBOX
-/* Windows only: logic to take the Python-CFFI embedding logic
- initialization errors and display them in a background thread
- with MessageBox. The idea is that if the whole program closes
- as a result of this problem, then likely it is already a console
- program and you can read the stderr output in the console too.
- If it is not a console program, then it will likely show its own
- dialog to complain, or generally not abruptly close, and for this
- case the background thread should stay alive.
-*/
-static void *volatile _cffi_bootstrap_text;
-
-static PyObject *_cffi_start_error_capture(void)
-{
- PyObject *result = NULL;
- PyObject *x, *m, *bi;
-
- if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text,
- (void *)1, NULL) != NULL)
- return (PyObject *)1;
-
- m = PyImport_AddModule("_cffi_error_capture");
- if (m == NULL)
- goto error;
-
- result = PyModule_GetDict(m);
- if (result == NULL)
- goto error;
-
-#if PY_MAJOR_VERSION >= 3
- bi = PyImport_ImportModule("builtins");
-#else
- bi = PyImport_ImportModule("__builtin__");
-#endif
- if (bi == NULL)
- goto error;
- PyDict_SetItemString(result, "__builtins__", bi);
- Py_DECREF(bi);
-
- x = PyRun_String(
- "import sys\n"
- "class FileLike:\n"
- " def write(self, x):\n"
- " try:\n"
- " of.write(x)\n"
- " except: pass\n"
- " self.buf += x\n"
- " def flush(self):\n"
- " pass\n"
- "fl = FileLike()\n"
- "fl.buf = ''\n"
- "of = sys.stderr\n"
- "sys.stderr = fl\n"
- "def done():\n"
- " sys.stderr = of\n"
- " return fl.buf\n", /* make sure the returned value stays alive */
- Py_file_input,
- result, result);
- Py_XDECREF(x);
-
- error:
- if (PyErr_Occurred())
- {
- PyErr_WriteUnraisable(Py_None);
- PyErr_Clear();
- }
- return result;
-}
-
-#pragma comment(lib, "user32.lib")
-
-static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored)
-{
- Sleep(666); /* may be interrupted if the whole process is closing */
-#if PY_MAJOR_VERSION >= 3
- MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text,
- L"Python-CFFI error",
- MB_OK | MB_ICONERROR);
-#else
- MessageBoxA(NULL, (char *)_cffi_bootstrap_text,
- "Python-CFFI error",
- MB_OK | MB_ICONERROR);
-#endif
- _cffi_bootstrap_text = NULL;
- return 0;
-}
-
-static void _cffi_stop_error_capture(PyObject *ecap)
-{
- PyObject *s;
- void *text;
-
- if (ecap == (PyObject *)1)
- return;
-
- if (ecap == NULL)
- goto error;
-
- s = PyRun_String("done()", Py_eval_input, ecap, ecap);
- if (s == NULL)
- goto error;
-
- /* Show a dialog box, but in a background thread, and
- never show multiple dialog boxes at once. */
-#if PY_MAJOR_VERSION >= 3
- text = PyUnicode_AsWideCharString(s, NULL);
-#else
- text = PyString_AsString(s);
-#endif
-
- _cffi_bootstrap_text = text;
-
- if (text != NULL)
- {
- HANDLE h;
- h = CreateThread(NULL, 0, _cffi_bootstrap_dialog,
- NULL, 0, NULL);
- if (h != NULL)
- CloseHandle(h);
- }
- /* decref the string, but it should stay alive as 'fl.buf'
- in the small module above. It will really be freed only if
- we later get another similar error. So it's a leak of at
- most one copy of the small module. That's fine for this
- situation which is usually a "fatal error" anyway. */
- Py_DECREF(s);
- PyErr_Clear();
- return;
-
- error:
- _cffi_bootstrap_text = NULL;
- PyErr_Clear();
-}
-
-#else
-
-static PyObject *_cffi_start_error_capture(void) { return NULL; }
-static void _cffi_stop_error_capture(PyObject *ecap) { }
-
-#endif
diff --git a/resources/python/bin/3.7/linux/cffi/_cffi_include.h b/resources/python/bin/3.7/linux/cffi/_cffi_include.h
deleted file mode 100644
index e4c0a6724..000000000
--- a/resources/python/bin/3.7/linux/cffi/_cffi_include.h
+++ /dev/null
@@ -1,385 +0,0 @@
-#define _CFFI_
-
-/* We try to define Py_LIMITED_API before including Python.h.
-
- Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and
- Py_REF_DEBUG are not defined. This is a best-effort approximation:
- we can learn about Py_DEBUG from pyconfig.h, but it is unclear if
- the same works for the other two macros. Py_DEBUG implies them,
- but not the other way around.
-
- The implementation is messy (issue #350): on Windows, with _MSC_VER,
- we have to define Py_LIMITED_API even before including pyconfig.h.
- In that case, we guess what pyconfig.h will do to the macros above,
- and check our guess after the #include.
-
- Note that on Windows, with CPython 3.x, you need >= 3.5 and virtualenv
- version >= 16.0.0. With older versions of either, you don't get a
- copy of PYTHON3.DLL in the virtualenv. We can't check the version of
- CPython *before* we even include pyconfig.h. ffi.set_source() puts
- a ``#define _CFFI_NO_LIMITED_API'' at the start of this file if it is
- running on Windows < 3.5, as an attempt at fixing it, but that's
- arguably wrong because it may not be the target version of Python.
- Still better than nothing I guess. As another workaround, you can
- remove the definition of Py_LIMITED_API here.
-
- See also 'py_limited_api' in cffi/setuptools_ext.py.
-*/
-#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API)
-# ifdef _MSC_VER
-# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
-# endif
-# include
- /* sanity-check: Py_LIMITED_API will cause crashes if any of these
- are also defined. Normally, the Python file PC/pyconfig.h does not
- cause any of these to be defined, with the exception that _DEBUG
- causes Py_DEBUG. Double-check that. */
-# ifdef Py_LIMITED_API
-# if defined(Py_DEBUG)
-# error "pyconfig.h unexpectedly defines Py_DEBUG, but Py_LIMITED_API is set"
-# endif
-# if defined(Py_TRACE_REFS)
-# error "pyconfig.h unexpectedly defines Py_TRACE_REFS, but Py_LIMITED_API is set"
-# endif
-# if defined(Py_REF_DEBUG)
-# error "pyconfig.h unexpectedly defines Py_REF_DEBUG, but Py_LIMITED_API is set"
-# endif
-# endif
-# else
-# include
-# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
-# endif
-# endif
-#endif
-
-#include
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include
-#include "parse_c_type.h"
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-
-#ifdef __GNUC__
-# define _CFFI_UNUSED_FN __attribute__((unused))
-#else
-# define _CFFI_UNUSED_FN /* nothing */
-#endif
-
-#ifdef __cplusplus
-# ifndef _Bool
- typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */
-# endif
-#endif
-
-/********** CPython-specific section **********/
-#ifndef PYPY_VERSION
-
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
-#define _cffi_from_c_double PyFloat_FromDouble
-#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
-#define _cffi_from_c_ulong PyLong_FromUnsignedLong
-#define _cffi_from_c_longlong PyLong_FromLongLong
-#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
-#define _cffi_from_c__Bool PyBool_FromLong
-
-#define _cffi_to_c_double PyFloat_AsDouble
-#define _cffi_to_c_float PyFloat_AsDouble
-
-#define _cffi_from_c_int(x, type) \
- (((type)-1) > 0 ? /* unsigned */ \
- (sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- sizeof(type) == sizeof(long) ? \
- PyLong_FromUnsignedLong((unsigned long)x) : \
- PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
- (sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- PyLong_FromLongLong((long long)x)))
-
-#define _cffi_to_c_int(o, type) \
- ((type)( \
- sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
- : (type)_cffi_to_c_i8(o)) : \
- sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
- : (type)_cffi_to_c_i16(o)) : \
- sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
- : (type)_cffi_to_c_i32(o)) : \
- sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
- : (type)_cffi_to_c_i64(o)) : \
- (Py_FatalError("unsupported size for type " #type), (type)0)))
-
-#define _cffi_to_c_i8 \
- ((int(*)(PyObject *))_cffi_exports[1])
-#define _cffi_to_c_u8 \
- ((int(*)(PyObject *))_cffi_exports[2])
-#define _cffi_to_c_i16 \
- ((int(*)(PyObject *))_cffi_exports[3])
-#define _cffi_to_c_u16 \
- ((int(*)(PyObject *))_cffi_exports[4])
-#define _cffi_to_c_i32 \
- ((int(*)(PyObject *))_cffi_exports[5])
-#define _cffi_to_c_u32 \
- ((unsigned int(*)(PyObject *))_cffi_exports[6])
-#define _cffi_to_c_i64 \
- ((long long(*)(PyObject *))_cffi_exports[7])
-#define _cffi_to_c_u64 \
- ((unsigned long long(*)(PyObject *))_cffi_exports[8])
-#define _cffi_to_c_char \
- ((int(*)(PyObject *))_cffi_exports[9])
-#define _cffi_from_c_pointer \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10])
-#define _cffi_to_c_pointer \
- ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11])
-#define _cffi_get_struct_layout \
- not used any more
-#define _cffi_restore_errno \
- ((void(*)(void))_cffi_exports[13])
-#define _cffi_save_errno \
- ((void(*)(void))_cffi_exports[14])
-#define _cffi_from_c_char \
- ((PyObject *(*)(char))_cffi_exports[15])
-#define _cffi_from_c_deref \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16])
-#define _cffi_to_c \
- ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17])
-#define _cffi_from_c_struct \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18])
-#define _cffi_to_c_wchar_t \
- ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19])
-#define _cffi_from_c_wchar_t \
- ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20])
-#define _cffi_to_c_long_double \
- ((long double(*)(PyObject *))_cffi_exports[21])
-#define _cffi_to_c__Bool \
- ((_Bool(*)(PyObject *))_cffi_exports[22])
-#define _cffi_prepare_pointer_call_argument \
- ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \
- PyObject *, char **))_cffi_exports[23])
-#define _cffi_convert_array_from_object \
- ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24])
-#define _CFFI_CPIDX 25
-#define _cffi_call_python \
- ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX])
-#define _cffi_to_c_wchar3216_t \
- ((int(*)(PyObject *))_cffi_exports[26])
-#define _cffi_from_c_wchar3216_t \
- ((PyObject *(*)(int))_cffi_exports[27])
-#define _CFFI_NUM_EXPORTS 28
-
-struct _cffi_ctypedescr;
-
-static void *_cffi_exports[_CFFI_NUM_EXPORTS];
-
-#define _cffi_type(index) ( \
- assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \
- (struct _cffi_ctypedescr *)_cffi_types[index])
-
-static PyObject *_cffi_init(const char *module_name, Py_ssize_t version,
- const struct _cffi_type_context_s *ctx)
-{
- PyObject *module, *o_arg, *new_module;
- void *raw[] = {
- (void *)module_name,
- (void *)version,
- (void *)_cffi_exports,
- (void *)ctx,
- };
-
- module = PyImport_ImportModule("_cffi_backend");
- if (module == NULL)
- goto failure;
-
- o_arg = PyLong_FromVoidPtr((void *)raw);
- if (o_arg == NULL)
- goto failure;
-
- new_module = PyObject_CallMethod(
- module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg);
-
- Py_DECREF(o_arg);
- Py_DECREF(module);
- return new_module;
-
- failure:
- Py_XDECREF(module);
- return NULL;
-}
-
-
-#ifdef HAVE_WCHAR_H
-typedef wchar_t _cffi_wchar_t;
-#else
-typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */
-#endif
-
-_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o)
-{
- if (sizeof(_cffi_wchar_t) == 2)
- return (uint16_t)_cffi_to_c_wchar_t(o);
- else
- return (uint16_t)_cffi_to_c_wchar3216_t(o);
-}
-
-_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x)
-{
- if (sizeof(_cffi_wchar_t) == 2)
- return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
- else
- return _cffi_from_c_wchar3216_t((int)x);
-}
-
-_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o)
-{
- if (sizeof(_cffi_wchar_t) == 4)
- return (int)_cffi_to_c_wchar_t(o);
- else
- return (int)_cffi_to_c_wchar3216_t(o);
-}
-
-_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x)
-{
- if (sizeof(_cffi_wchar_t) == 4)
- return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
- else
- return _cffi_from_c_wchar3216_t((int)x);
-}
-
-union _cffi_union_alignment_u {
- unsigned char m_char;
- unsigned short m_short;
- unsigned int m_int;
- unsigned long m_long;
- unsigned long long m_longlong;
- float m_float;
- double m_double;
- long double m_longdouble;
-};
-
-struct _cffi_freeme_s {
- struct _cffi_freeme_s *next;
- union _cffi_union_alignment_u alignment;
-};
-
-_CFFI_UNUSED_FN static int
-_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg,
- char **output_data, Py_ssize_t datasize,
- struct _cffi_freeme_s **freeme)
-{
- char *p;
- if (datasize < 0)
- return -1;
-
- p = *output_data;
- if (p == NULL) {
- struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc(
- offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize);
- if (fp == NULL)
- return -1;
- fp->next = *freeme;
- *freeme = fp;
- p = *output_data = (char *)&fp->alignment;
- }
- memset((void *)p, 0, (size_t)datasize);
- return _cffi_convert_array_from_object(p, ctptr, arg);
-}
-
-_CFFI_UNUSED_FN static void
-_cffi_free_array_arguments(struct _cffi_freeme_s *freeme)
-{
- do {
- void *p = (void *)freeme;
- freeme = freeme->next;
- PyObject_Free(p);
- } while (freeme != NULL);
-}
-
-/********** end CPython-specific section **********/
-#else
-_CFFI_UNUSED_FN
-static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *);
-# define _cffi_call_python _cffi_call_python_org
-#endif
-
-
-#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0]))
-
-#define _cffi_prim_int(size, sign) \
- ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \
- (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \
- (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \
- (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \
- _CFFI__UNKNOWN_PRIM)
-
-#define _cffi_prim_float(size) \
- ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \
- (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \
- (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \
- _CFFI__UNKNOWN_FLOAT_PRIM)
-
-#define _cffi_check_int(got, got_nonpos, expected) \
- ((got_nonpos) == (expected <= 0) && \
- (got) == (unsigned long long)expected)
-
-#ifdef MS_WIN32
-# define _cffi_stdcall __stdcall
-#else
-# define _cffi_stdcall /* nothing */
-#endif
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/resources/python/bin/3.7/linux/cffi/_embedding.h b/resources/python/bin/3.7/linux/cffi/_embedding.h
deleted file mode 100644
index 8e8df882d..000000000
--- a/resources/python/bin/3.7/linux/cffi/_embedding.h
+++ /dev/null
@@ -1,528 +0,0 @@
-
-/***** Support code for embedding *****/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#if defined(_WIN32)
-# define CFFI_DLLEXPORT __declspec(dllexport)
-#elif defined(__GNUC__)
-# define CFFI_DLLEXPORT __attribute__((visibility("default")))
-#else
-# define CFFI_DLLEXPORT /* nothing */
-#endif
-
-
-/* There are two global variables of type _cffi_call_python_fnptr:
-
- * _cffi_call_python, which we declare just below, is the one called
- by ``extern "Python"`` implementations.
-
- * _cffi_call_python_org, which on CPython is actually part of the
- _cffi_exports[] array, is the function pointer copied from
- _cffi_backend. If _cffi_start_python() fails, then this is set
- to NULL; otherwise, it should never be NULL.
-
- After initialization is complete, both are equal. However, the
- first one remains equal to &_cffi_start_and_call_python until the
- very end of initialization, when we are (or should be) sure that
- concurrent threads also see a completely initialized world, and
- only then is it changed.
-*/
-#undef _cffi_call_python
-typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *);
-static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *);
-static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python;
-
-
-#ifndef _MSC_VER
- /* --- Assuming a GCC not infinitely old --- */
-# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n)
-# define cffi_write_barrier() __sync_synchronize()
-# if !defined(__amd64__) && !defined(__x86_64__) && \
- !defined(__i386__) && !defined(__i386)
-# define cffi_read_barrier() __sync_synchronize()
-# else
-# define cffi_read_barrier() (void)0
-# endif
-#else
- /* --- Windows threads version --- */
-# include
-# define cffi_compare_and_swap(l,o,n) \
- (InterlockedCompareExchangePointer(l,n,o) == (o))
-# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0)
-# define cffi_read_barrier() (void)0
-static volatile LONG _cffi_dummy;
-#endif
-
-#ifdef WITH_THREAD
-# ifndef _MSC_VER
-# include
- static pthread_mutex_t _cffi_embed_startup_lock;
-# else
- static CRITICAL_SECTION _cffi_embed_startup_lock;
-# endif
- static char _cffi_embed_startup_lock_ready = 0;
-#endif
-
-static void _cffi_acquire_reentrant_mutex(void)
-{
- static void *volatile lock = NULL;
-
- while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) {
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: pthread_mutex_init() should be very fast, and
- this is only run at start-up anyway. */
- }
-
-#ifdef WITH_THREAD
- if (!_cffi_embed_startup_lock_ready) {
-# ifndef _MSC_VER
- pthread_mutexattr_t attr;
- pthread_mutexattr_init(&attr);
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&_cffi_embed_startup_lock, &attr);
-# else
- InitializeCriticalSection(&_cffi_embed_startup_lock);
-# endif
- _cffi_embed_startup_lock_ready = 1;
- }
-#endif
-
- while (!cffi_compare_and_swap(&lock, (void *)1, NULL))
- ;
-
-#ifndef _MSC_VER
- pthread_mutex_lock(&_cffi_embed_startup_lock);
-#else
- EnterCriticalSection(&_cffi_embed_startup_lock);
-#endif
-}
-
-static void _cffi_release_reentrant_mutex(void)
-{
-#ifndef _MSC_VER
- pthread_mutex_unlock(&_cffi_embed_startup_lock);
-#else
- LeaveCriticalSection(&_cffi_embed_startup_lock);
-#endif
-}
-
-
-/********** CPython-specific section **********/
-#ifndef PYPY_VERSION
-
-#include "_cffi_errors.h"
-
-
-#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX]
-
-PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */
-
-static void _cffi_py_initialize(void)
-{
- /* XXX use initsigs=0, which "skips initialization registration of
- signal handlers, which might be useful when Python is
- embedded" according to the Python docs. But review and think
- if it should be a user-controllable setting.
-
- XXX we should also give a way to write errors to a buffer
- instead of to stderr.
-
- XXX if importing 'site' fails, CPython (any version) calls
- exit(). Should we try to work around this behavior here?
- */
- Py_InitializeEx(0);
-}
-
-static int _cffi_initialize_python(void)
-{
- /* This initializes Python, imports _cffi_backend, and then the
- present .dll/.so is set up as a CPython C extension module.
- */
- int result;
- PyGILState_STATE state;
- PyObject *pycode=NULL, *global_dict=NULL, *x;
- PyObject *builtins;
-
- state = PyGILState_Ensure();
-
- /* Call the initxxx() function from the present module. It will
- create and initialize us as a CPython extension module, instead
- of letting the startup Python code do it---it might reimport
- the same .dll/.so and get maybe confused on some platforms.
- It might also have troubles locating the .dll/.so again for all
- I know.
- */
- (void)_CFFI_PYTHON_STARTUP_FUNC();
- if (PyErr_Occurred())
- goto error;
-
- /* Now run the Python code provided to ffi.embedding_init_code().
- */
- pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE,
- "",
- Py_file_input);
- if (pycode == NULL)
- goto error;
- global_dict = PyDict_New();
- if (global_dict == NULL)
- goto error;
- builtins = PyEval_GetBuiltins();
- if (builtins == NULL)
- goto error;
- if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0)
- goto error;
- x = PyEval_EvalCode(
-#if PY_MAJOR_VERSION < 3
- (PyCodeObject *)
-#endif
- pycode, global_dict, global_dict);
- if (x == NULL)
- goto error;
- Py_DECREF(x);
-
- /* Done! Now if we've been called from
- _cffi_start_and_call_python() in an ``extern "Python"``, we can
- only hope that the Python code did correctly set up the
- corresponding @ffi.def_extern() function. Otherwise, the
- general logic of ``extern "Python"`` functions (inside the
- _cffi_backend module) will find that the reference is still
- missing and print an error.
- */
- result = 0;
- done:
- Py_XDECREF(pycode);
- Py_XDECREF(global_dict);
- PyGILState_Release(state);
- return result;
-
- error:;
- {
- /* Print as much information as potentially useful.
- Debugging load-time failures with embedding is not fun
- */
- PyObject *ecap;
- PyObject *exception, *v, *tb, *f, *modules, *mod;
- PyErr_Fetch(&exception, &v, &tb);
- ecap = _cffi_start_error_capture();
- f = PySys_GetObject((char *)"stderr");
- if (f != NULL && f != Py_None) {
- PyFile_WriteString(
- "Failed to initialize the Python-CFFI embedding logic:\n\n", f);
- }
-
- if (exception != NULL) {
- PyErr_NormalizeException(&exception, &v, &tb);
- PyErr_Display(exception, v, tb);
- }
- Py_XDECREF(exception);
- Py_XDECREF(v);
- Py_XDECREF(tb);
-
- if (f != NULL && f != Py_None) {
- PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
- "\ncompiled with cffi version: 1.15.1"
- "\n_cffi_backend module: ", f);
- modules = PyImport_GetModuleDict();
- mod = PyDict_GetItemString(modules, "_cffi_backend");
- if (mod == NULL) {
- PyFile_WriteString("not loaded", f);
- }
- else {
- v = PyObject_GetAttrString(mod, "__file__");
- PyFile_WriteObject(v, f, 0);
- Py_XDECREF(v);
- }
- PyFile_WriteString("\nsys.path: ", f);
- PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0);
- PyFile_WriteString("\n\n", f);
- }
- _cffi_stop_error_capture(ecap);
- }
- result = -1;
- goto done;
-}
-
-#if PY_VERSION_HEX < 0x03080000
-PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */
-#endif
-
-static int _cffi_carefully_make_gil(void)
-{
- /* This does the basic initialization of Python. It can be called
- completely concurrently from unrelated threads. It assumes
- that we don't hold the GIL before (if it exists), and we don't
- hold it afterwards.
-
- (What it really does used to be completely different in Python 2
- and Python 3, with the Python 2 solution avoiding the spin-lock
- around the Py_InitializeEx() call. However, after recent changes
- to CPython 2.7 (issue #358) it no longer works. So we use the
- Python 3 solution everywhere.)
-
- This initializes Python by calling Py_InitializeEx().
- Important: this must not be called concurrently at all.
- So we use a global variable as a simple spin lock. This global
- variable must be from 'libpythonX.Y.so', not from this
- cffi-based extension module, because it must be shared from
- different cffi-based extension modules.
-
- In Python < 3.8, we choose
- _PyParser_TokenNames[0] as a completely arbitrary pointer value
- that is never written to. The default is to point to the
- string "ENDMARKER". We change it temporarily to point to the
- next character in that string. (Yes, I know it's REALLY
- obscure.)
-
- In Python >= 3.8, this string array is no longer writable, so
- instead we pick PyCapsuleType.tp_version_tag. We can't change
- Python < 3.8 because someone might use a mixture of cffi
- embedded modules, some of which were compiled before this file
- changed.
- */
-
-#ifdef WITH_THREAD
-# if PY_VERSION_HEX < 0x03080000
- char *volatile *lock = (char *volatile *)_PyParser_TokenNames;
- char *old_value, *locked_value;
-
- while (1) { /* spin loop */
- old_value = *lock;
- locked_value = old_value + 1;
- if (old_value[0] == 'E') {
- assert(old_value[1] == 'N');
- if (cffi_compare_and_swap(lock, old_value, locked_value))
- break;
- }
- else {
- assert(old_value[0] == 'N');
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: PyEval_InitThreads() should be very fast, and
- this is only run at start-up anyway. */
- }
- }
-# else
- int volatile *lock = (int volatile *)&PyCapsule_Type.tp_version_tag;
- int old_value, locked_value;
- assert(!(PyCapsule_Type.tp_flags & Py_TPFLAGS_HAVE_VERSION_TAG));
-
- while (1) { /* spin loop */
- old_value = *lock;
- locked_value = -42;
- if (old_value == 0) {
- if (cffi_compare_and_swap(lock, old_value, locked_value))
- break;
- }
- else {
- assert(old_value == locked_value);
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: PyEval_InitThreads() should be very fast, and
- this is only run at start-up anyway. */
- }
- }
-# endif
-#endif
-
- /* call Py_InitializeEx() */
- if (!Py_IsInitialized()) {
- _cffi_py_initialize();
-#if PY_VERSION_HEX < 0x03070000
- PyEval_InitThreads();
-#endif
- PyEval_SaveThread(); /* release the GIL */
- /* the returned tstate must be the one that has been stored into the
- autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */
- }
- else {
-#if PY_VERSION_HEX < 0x03070000
- /* PyEval_InitThreads() is always a no-op from CPython 3.7 */
- PyGILState_STATE state = PyGILState_Ensure();
- PyEval_InitThreads();
- PyGILState_Release(state);
-#endif
- }
-
-#ifdef WITH_THREAD
- /* release the lock */
- while (!cffi_compare_and_swap(lock, locked_value, old_value))
- ;
-#endif
-
- return 0;
-}
-
-/********** end CPython-specific section **********/
-
-
-#else
-
-
-/********** PyPy-specific section **********/
-
-PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */
-
-static struct _cffi_pypy_init_s {
- const char *name;
- void *func; /* function pointer */
- const char *code;
-} _cffi_pypy_init = {
- _CFFI_MODULE_NAME,
- _CFFI_PYTHON_STARTUP_FUNC,
- _CFFI_PYTHON_STARTUP_CODE,
-};
-
-extern int pypy_carefully_make_gil(const char *);
-extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *);
-
-static int _cffi_carefully_make_gil(void)
-{
- return pypy_carefully_make_gil(_CFFI_MODULE_NAME);
-}
-
-static int _cffi_initialize_python(void)
-{
- return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init);
-}
-
-/********** end PyPy-specific section **********/
-
-
-#endif
-
-
-#ifdef __GNUC__
-__attribute__((noinline))
-#endif
-static _cffi_call_python_fnptr _cffi_start_python(void)
-{
- /* Delicate logic to initialize Python. This function can be
- called multiple times concurrently, e.g. when the process calls
- its first ``extern "Python"`` functions in multiple threads at
- once. It can also be called recursively, in which case we must
- ignore it. We also have to consider what occurs if several
- different cffi-based extensions reach this code in parallel
- threads---it is a different copy of the code, then, and we
- can't have any shared global variable unless it comes from
- 'libpythonX.Y.so'.
-
- Idea:
-
- * _cffi_carefully_make_gil(): "carefully" call
- PyEval_InitThreads() (possibly with Py_InitializeEx() first).
-
- * then we use a (local) custom lock to make sure that a call to this
- cffi-based extension will wait if another call to the *same*
- extension is running the initialization in another thread.
- It is reentrant, so that a recursive call will not block, but
- only one from a different thread.
-
- * then we grab the GIL and (Python 2) we call Py_InitializeEx().
- At this point, concurrent calls to Py_InitializeEx() are not
- possible: we have the GIL.
-
- * do the rest of the specific initialization, which may
- temporarily release the GIL but not the custom lock.
- Only release the custom lock when we are done.
- */
- static char called = 0;
-
- if (_cffi_carefully_make_gil() != 0)
- return NULL;
-
- _cffi_acquire_reentrant_mutex();
-
- /* Here the GIL exists, but we don't have it. We're only protected
- from concurrency by the reentrant mutex. */
-
- /* This file only initializes the embedded module once, the first
- time this is called, even if there are subinterpreters. */
- if (!called) {
- called = 1; /* invoke _cffi_initialize_python() only once,
- but don't set '_cffi_call_python' right now,
- otherwise concurrent threads won't call
- this function at all (we need them to wait) */
- if (_cffi_initialize_python() == 0) {
- /* now initialization is finished. Switch to the fast-path. */
-
- /* We would like nobody to see the new value of
- '_cffi_call_python' without also seeing the rest of the
- data initialized. However, this is not possible. But
- the new value of '_cffi_call_python' is the function
- 'cffi_call_python()' from _cffi_backend. So: */
- cffi_write_barrier();
- /* ^^^ we put a write barrier here, and a corresponding
- read barrier at the start of cffi_call_python(). This
- ensures that after that read barrier, we see everything
- done here before the write barrier.
- */
-
- assert(_cffi_call_python_org != NULL);
- _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org;
- }
- else {
- /* initialization failed. Reset this to NULL, even if it was
- already set to some other value. Future calls to
- _cffi_start_python() are still forced to occur, and will
- always return NULL from now on. */
- _cffi_call_python_org = NULL;
- }
- }
-
- _cffi_release_reentrant_mutex();
-
- return (_cffi_call_python_fnptr)_cffi_call_python_org;
-}
-
-static
-void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args)
-{
- _cffi_call_python_fnptr fnptr;
- int current_err = errno;
-#ifdef _MSC_VER
- int current_lasterr = GetLastError();
-#endif
- fnptr = _cffi_start_python();
- if (fnptr == NULL) {
- fprintf(stderr, "function %s() called, but initialization code "
- "failed. Returning 0.\n", externpy->name);
- memset(args, 0, externpy->size_of_result);
- }
-#ifdef _MSC_VER
- SetLastError(current_lasterr);
-#endif
- errno = current_err;
-
- if (fnptr != NULL)
- fnptr(externpy, args);
-}
-
-
-/* The cffi_start_python() function makes sure Python is initialized
- and our cffi module is set up. It can be called manually from the
- user C code. The same effect is obtained automatically from any
- dll-exported ``extern "Python"`` function. This function returns
- -1 if initialization failed, 0 if all is OK. */
-_CFFI_UNUSED_FN
-static int cffi_start_python(void)
-{
- if (_cffi_call_python == &_cffi_start_and_call_python) {
- if (_cffi_start_python() == NULL)
- return -1;
- }
- cffi_read_barrier();
- return 0;
-}
-
-#undef cffi_compare_and_swap
-#undef cffi_write_barrier
-#undef cffi_read_barrier
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/resources/python/bin/3.7/linux/cffi/api.py b/resources/python/bin/3.7/linux/cffi/api.py
deleted file mode 100644
index 999a8aefc..000000000
--- a/resources/python/bin/3.7/linux/cffi/api.py
+++ /dev/null
@@ -1,965 +0,0 @@
-import sys, types
-from .lock import allocate_lock
-from .error import CDefError
-from . import model
-
-try:
- callable
-except NameError:
- # Python 3.1
- from collections import Callable
- callable = lambda x: isinstance(x, Callable)
-
-try:
- basestring
-except NameError:
- # Python 3.x
- basestring = str
-
-_unspecified = object()
-
-
-
-class FFI(object):
- r'''
- The main top-level class that you instantiate once, or once per module.
-
- Example usage:
-
- ffi = FFI()
- ffi.cdef("""
- int printf(const char *, ...);
- """)
-
- C = ffi.dlopen(None) # standard library
- -or-
- C = ffi.verify() # use a C compiler: verify the decl above is right
-
- C.printf("hello, %s!\n", ffi.new("char[]", "world"))
- '''
-
- def __init__(self, backend=None):
- """Create an FFI instance. The 'backend' argument is used to
- select a non-default backend, mostly for tests.
- """
- if backend is None:
- # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with
- # _cffi_backend.so compiled.
- import _cffi_backend as backend
- from . import __version__
- if backend.__version__ != __version__:
- # bad version! Try to be as explicit as possible.
- if hasattr(backend, '__file__'):
- # CPython
- raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. When we import the top-level '_cffi_backend' extension module, we get version %s, located in %r. The two versions should be equal; check your installation." % (
- __version__, __file__,
- backend.__version__, backend.__file__))
- else:
- # PyPy
- raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. This interpreter comes with a built-in '_cffi_backend' module, which is version %s. The two versions should be equal; check your installation." % (
- __version__, __file__, backend.__version__))
- # (If you insist you can also try to pass the option
- # 'backend=backend_ctypes.CTypesBackend()', but don't
- # rely on it! It's probably not going to work well.)
-
- from . import cparser
- self._backend = backend
- self._lock = allocate_lock()
- self._parser = cparser.Parser()
- self._cached_btypes = {}
- self._parsed_types = types.ModuleType('parsed_types').__dict__
- self._new_types = types.ModuleType('new_types').__dict__
- self._function_caches = []
- self._libraries = []
- self._cdefsources = []
- self._included_ffis = []
- self._windows_unicode = None
- self._init_once_cache = {}
- self._cdef_version = None
- self._embedding = None
- self._typecache = model.get_typecache(backend)
- if hasattr(backend, 'set_ffi'):
- backend.set_ffi(self)
- for name in list(backend.__dict__):
- if name.startswith('RTLD_'):
- setattr(self, name, getattr(backend, name))
- #
- with self._lock:
- self.BVoidP = self._get_cached_btype(model.voidp_type)
- self.BCharA = self._get_cached_btype(model.char_array_type)
- if isinstance(backend, types.ModuleType):
- # _cffi_backend: attach these constants to the class
- if not hasattr(FFI, 'NULL'):
- FFI.NULL = self.cast(self.BVoidP, 0)
- FFI.CData, FFI.CType = backend._get_types()
- else:
- # ctypes backend: attach these constants to the instance
- self.NULL = self.cast(self.BVoidP, 0)
- self.CData, self.CType = backend._get_types()
- self.buffer = backend.buffer
-
- def cdef(self, csource, override=False, packed=False, pack=None):
- """Parse the given C source. This registers all declared functions,
- types, and global variables. The functions and global variables can
- then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'.
- The types can be used in 'ffi.new()' and other functions.
- If 'packed' is specified as True, all structs declared inside this
- cdef are packed, i.e. laid out without any field alignment at all.
- Alternatively, 'pack' can be a small integer, and requests for
- alignment greater than that are ignored (pack=1 is equivalent to
- packed=True).
- """
- self._cdef(csource, override=override, packed=packed, pack=pack)
-
- def embedding_api(self, csource, packed=False, pack=None):
- self._cdef(csource, packed=packed, pack=pack, dllexport=True)
- if self._embedding is None:
- self._embedding = ''
-
- def _cdef(self, csource, override=False, **options):
- if not isinstance(csource, str): # unicode, on Python 2
- if not isinstance(csource, basestring):
- raise TypeError("cdef() argument must be a string")
- csource = csource.encode('ascii')
- with self._lock:
- self._cdef_version = object()
- self._parser.parse(csource, override=override, **options)
- self._cdefsources.append(csource)
- if override:
- for cache in self._function_caches:
- cache.clear()
- finishlist = self._parser._recomplete
- if finishlist:
- self._parser._recomplete = []
- for tp in finishlist:
- tp.finish_backend_type(self, finishlist)
-
- def dlopen(self, name, flags=0):
- """Load and return a dynamic library identified by 'name'.
- The standard C library can be loaded by passing None.
- Note that functions and types declared by 'ffi.cdef()' are not
- linked to a particular library, just like C headers; in the
- library we only look for the actual (untyped) symbols.
- """
- if not (isinstance(name, basestring) or
- name is None or
- isinstance(name, self.CData)):
- raise TypeError("dlopen(name): name must be a file name, None, "
- "or an already-opened 'void *' handle")
- with self._lock:
- lib, function_cache = _make_ffi_library(self, name, flags)
- self._function_caches.append(function_cache)
- self._libraries.append(lib)
- return lib
-
- def dlclose(self, lib):
- """Close a library obtained with ffi.dlopen(). After this call,
- access to functions or variables from the library will fail
- (possibly with a segmentation fault).
- """
- type(lib).__cffi_close__(lib)
-
- def _typeof_locked(self, cdecl):
- # call me with the lock!
- key = cdecl
- if key in self._parsed_types:
- return self._parsed_types[key]
- #
- if not isinstance(cdecl, str): # unicode, on Python 2
- cdecl = cdecl.encode('ascii')
- #
- type = self._parser.parse_type(cdecl)
- really_a_function_type = type.is_raw_function
- if really_a_function_type:
- type = type.as_function_pointer()
- btype = self._get_cached_btype(type)
- result = btype, really_a_function_type
- self._parsed_types[key] = result
- return result
-
- def _typeof(self, cdecl, consider_function_as_funcptr=False):
- # string -> ctype object
- try:
- result = self._parsed_types[cdecl]
- except KeyError:
- with self._lock:
- result = self._typeof_locked(cdecl)
- #
- btype, really_a_function_type = result
- if really_a_function_type and not consider_function_as_funcptr:
- raise CDefError("the type %r is a function type, not a "
- "pointer-to-function type" % (cdecl,))
- return btype
-
- def typeof(self, cdecl):
- """Parse the C type given as a string and return the
- corresponding object.
- It can also be used on 'cdata' instance to get its C type.
- """
- if isinstance(cdecl, basestring):
- return self._typeof(cdecl)
- if isinstance(cdecl, self.CData):
- return self._backend.typeof(cdecl)
- if isinstance(cdecl, types.BuiltinFunctionType):
- res = _builtin_function_type(cdecl)
- if res is not None:
- return res
- if (isinstance(cdecl, types.FunctionType)
- and hasattr(cdecl, '_cffi_base_type')):
- with self._lock:
- return self._get_cached_btype(cdecl._cffi_base_type)
- raise TypeError(type(cdecl))
-
- def sizeof(self, cdecl):
- """Return the size in bytes of the argument. It can be a
- string naming a C type, or a 'cdata' instance.
- """
- if isinstance(cdecl, basestring):
- BType = self._typeof(cdecl)
- return self._backend.sizeof(BType)
- else:
- return self._backend.sizeof(cdecl)
-
- def alignof(self, cdecl):
- """Return the natural alignment size in bytes of the C type
- given as a string.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.alignof(cdecl)
-
- def offsetof(self, cdecl, *fields_or_indexes):
- """Return the offset of the named field inside the given
- structure or array, which must be given as a C type name.
- You can give several field names in case of nested structures.
- You can also give numeric values which correspond to array
- items, in case of an array type.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._typeoffsetof(cdecl, *fields_or_indexes)[1]
-
- def new(self, cdecl, init=None):
- """Allocate an instance according to the specified C type and
- return a pointer to it. The specified C type must be either a
- pointer or an array: ``new('X *')`` allocates an X and returns
- a pointer to it, whereas ``new('X[n]')`` allocates an array of
- n X'es and returns an array referencing it (which works
- mostly like a pointer, like in C). You can also use
- ``new('X[]', n)`` to allocate an array of a non-constant
- length n.
-
- The memory is initialized following the rules of declaring a
- global variable in C: by default it is zero-initialized, but
- an explicit initializer can be given which can be used to
- fill all or part of the memory.
-
- When the returned object goes out of scope, the memory
- is freed. In other words the returned object has
- ownership of the value of type 'cdecl' that it points to. This
- means that the raw data can be used as long as this object is
- kept alive, but must not be used for a longer time. Be careful
- about that when copying the pointer to the memory somewhere
- else, e.g. into another structure.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.newp(cdecl, init)
-
- def new_allocator(self, alloc=None, free=None,
- should_clear_after_alloc=True):
- """Return a new allocator, i.e. a function that behaves like ffi.new()
- but uses the provided low-level 'alloc' and 'free' functions.
-
- 'alloc' is called with the size as argument. If it returns NULL, a
- MemoryError is raised. 'free' is called with the result of 'alloc'
- as argument. Both can be either Python function or directly C
- functions. If 'free' is None, then no free function is called.
- If both 'alloc' and 'free' are None, the default is used.
-
- If 'should_clear_after_alloc' is set to False, then the memory
- returned by 'alloc' is assumed to be already cleared (or you are
- fine with garbage); otherwise CFFI will clear it.
- """
- compiled_ffi = self._backend.FFI()
- allocator = compiled_ffi.new_allocator(alloc, free,
- should_clear_after_alloc)
- def allocate(cdecl, init=None):
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return allocator(cdecl, init)
- return allocate
-
- def cast(self, cdecl, source):
- """Similar to a C cast: returns an instance of the named C
- type initialized with the given 'source'. The source is
- casted between integers or pointers of any type.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.cast(cdecl, source)
-
- def string(self, cdata, maxlen=-1):
- """Return a Python string (or unicode string) from the 'cdata'.
- If 'cdata' is a pointer or array of characters or bytes, returns
- the null-terminated string. The returned string extends until
- the first null character, or at most 'maxlen' characters. If
- 'cdata' is an array then 'maxlen' defaults to its length.
-
- If 'cdata' is a pointer or array of wchar_t, returns a unicode
- string following the same rules.
-
- If 'cdata' is a single character or byte or a wchar_t, returns
- it as a string or unicode string.
-
- If 'cdata' is an enum, returns the value of the enumerator as a
- string, or 'NUMBER' if the value is out of range.
- """
- return self._backend.string(cdata, maxlen)
-
- def unpack(self, cdata, length):
- """Unpack an array of C data of the given length,
- returning a Python string/unicode/list.
-
- If 'cdata' is a pointer to 'char', returns a byte string.
- It does not stop at the first null. This is equivalent to:
- ffi.buffer(cdata, length)[:]
-
- If 'cdata' is a pointer to 'wchar_t', returns a unicode string.
- 'length' is measured in wchar_t's; it is not the size in bytes.
-
- If 'cdata' is a pointer to anything else, returns a list of
- 'length' items. This is a faster equivalent to:
- [cdata[i] for i in range(length)]
- """
- return self._backend.unpack(cdata, length)
-
- #def buffer(self, cdata, size=-1):
- # """Return a read-write buffer object that references the raw C data
- # pointed to by the given 'cdata'. The 'cdata' must be a pointer or
- # an array. Can be passed to functions expecting a buffer, or directly
- # manipulated with:
- #
- # buf[:] get a copy of it in a regular string, or
- # buf[idx] as a single character
- # buf[:] = ...
- # buf[idx] = ... change the content
- # """
- # note that 'buffer' is a type, set on this instance by __init__
-
- def from_buffer(self, cdecl, python_buffer=_unspecified,
- require_writable=False):
- """Return a cdata of the given type pointing to the data of the
- given Python object, which must support the buffer interface.
- Note that this is not meant to be used on the built-in types
- str or unicode (you can build 'char[]' arrays explicitly)
- but only on objects containing large quantities of raw data
- in some other format, like 'array.array' or numpy arrays.
-
- The first argument is optional and default to 'char[]'.
- """
- if python_buffer is _unspecified:
- cdecl, python_buffer = self.BCharA, cdecl
- elif isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.from_buffer(cdecl, python_buffer,
- require_writable)
-
- def memmove(self, dest, src, n):
- """ffi.memmove(dest, src, n) copies n bytes of memory from src to dest.
-
- Like the C function memmove(), the memory areas may overlap;
- apart from that it behaves like the C function memcpy().
-
- 'src' can be any cdata ptr or array, or any Python buffer object.
- 'dest' can be any cdata ptr or array, or a writable Python buffer
- object. The size to copy, 'n', is always measured in bytes.
-
- Unlike other methods, this one supports all Python buffer including
- byte strings and bytearrays---but it still does not support
- non-contiguous buffers.
- """
- return self._backend.memmove(dest, src, n)
-
- def callback(self, cdecl, python_callable=None, error=None, onerror=None):
- """Return a callback object or a decorator making such a
- callback object. 'cdecl' must name a C function pointer type.
- The callback invokes the specified 'python_callable' (which may
- be provided either directly or via a decorator). Important: the
- callback object must be manually kept alive for as long as the
- callback may be invoked from the C level.
- """
- def callback_decorator_wrap(python_callable):
- if not callable(python_callable):
- raise TypeError("the 'python_callable' argument "
- "is not callable")
- return self._backend.callback(cdecl, python_callable,
- error, onerror)
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl, consider_function_as_funcptr=True)
- if python_callable is None:
- return callback_decorator_wrap # decorator mode
- else:
- return callback_decorator_wrap(python_callable) # direct mode
-
- def getctype(self, cdecl, replace_with=''):
- """Return a string giving the C type 'cdecl', which may be itself
- a string or a object. If 'replace_with' is given, it gives
- extra text to append (or insert for more complicated C types), like
- a variable name, or '*' to get actually the C type 'pointer-to-cdecl'.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- replace_with = replace_with.strip()
- if (replace_with.startswith('*')
- and '&[' in self._backend.getcname(cdecl, '&')):
- replace_with = '(%s)' % replace_with
- elif replace_with and not replace_with[0] in '[(':
- replace_with = ' ' + replace_with
- return self._backend.getcname(cdecl, replace_with)
-
- def gc(self, cdata, destructor, size=0):
- """Return a new cdata object that points to the same
- data. Later, when this new cdata object is garbage-collected,
- 'destructor(old_cdata_object)' will be called.
-
- The optional 'size' gives an estimate of the size, used to
- trigger the garbage collection more eagerly. So far only used
- on PyPy. It tells the GC that the returned object keeps alive
- roughly 'size' bytes of external memory.
- """
- return self._backend.gcp(cdata, destructor, size)
-
- def _get_cached_btype(self, type):
- assert self._lock.acquire(False) is False
- # call me with the lock!
- try:
- BType = self._cached_btypes[type]
- except KeyError:
- finishlist = []
- BType = type.get_cached_btype(self, finishlist)
- for type in finishlist:
- type.finish_backend_type(self, finishlist)
- return BType
-
- def verify(self, source='', tmpdir=None, **kwargs):
- """Verify that the current ffi signatures compile on this
- machine, and return a dynamic library object. The dynamic
- library can be used to call functions and access global
- variables declared in this 'ffi'. The library is compiled
- by the C compiler: it gives you C-level API compatibility
- (including calling macros). This is unlike 'ffi.dlopen()',
- which requires binary compatibility in the signatures.
- """
- from .verifier import Verifier, _caller_dir_pycache
- #
- # If set_unicode(True) was called, insert the UNICODE and
- # _UNICODE macro declarations
- if self._windows_unicode:
- self._apply_windows_unicode(kwargs)
- #
- # Set the tmpdir here, and not in Verifier.__init__: it picks
- # up the caller's directory, which we want to be the caller of
- # ffi.verify(), as opposed to the caller of Veritier().
- tmpdir = tmpdir or _caller_dir_pycache()
- #
- # Make a Verifier() and use it to load the library.
- self.verifier = Verifier(self, source, tmpdir, **kwargs)
- lib = self.verifier.load_library()
- #
- # Save the loaded library for keep-alive purposes, even
- # if the caller doesn't keep it alive itself (it should).
- self._libraries.append(lib)
- return lib
-
- def _get_errno(self):
- return self._backend.get_errno()
- def _set_errno(self, errno):
- self._backend.set_errno(errno)
- errno = property(_get_errno, _set_errno, None,
- "the value of 'errno' from/to the C calls")
-
- def getwinerror(self, code=-1):
- return self._backend.getwinerror(code)
-
- def _pointer_to(self, ctype):
- with self._lock:
- return model.pointer_cache(self, ctype)
-
- def addressof(self, cdata, *fields_or_indexes):
- """Return the address of a .
- If 'fields_or_indexes' are given, returns the address of that
- field or array item in the structure or array, recursively in
- case of nested structures.
- """
- try:
- ctype = self._backend.typeof(cdata)
- except TypeError:
- if '__addressof__' in type(cdata).__dict__:
- return type(cdata).__addressof__(cdata, *fields_or_indexes)
- raise
- if fields_or_indexes:
- ctype, offset = self._typeoffsetof(ctype, *fields_or_indexes)
- else:
- if ctype.kind == "pointer":
- raise TypeError("addressof(pointer)")
- offset = 0
- ctypeptr = self._pointer_to(ctype)
- return self._backend.rawaddressof(ctypeptr, cdata, offset)
-
- def _typeoffsetof(self, ctype, field_or_index, *fields_or_indexes):
- ctype, offset = self._backend.typeoffsetof(ctype, field_or_index)
- for field1 in fields_or_indexes:
- ctype, offset1 = self._backend.typeoffsetof(ctype, field1, 1)
- offset += offset1
- return ctype, offset
-
- def include(self, ffi_to_include):
- """Includes the typedefs, structs, unions and enums defined
- in another FFI instance. Usage is similar to a #include in C,
- where a part of the program might include types defined in
- another part for its own usage. Note that the include()
- method has no effect on functions, constants and global
- variables, which must anyway be accessed directly from the
- lib object returned by the original FFI instance.
- """
- if not isinstance(ffi_to_include, FFI):
- raise TypeError("ffi.include() expects an argument that is also of"
- " type cffi.FFI, not %r" % (
- type(ffi_to_include).__name__,))
- if ffi_to_include is self:
- raise ValueError("self.include(self)")
- with ffi_to_include._lock:
- with self._lock:
- self._parser.include(ffi_to_include._parser)
- self._cdefsources.append('[')
- self._cdefsources.extend(ffi_to_include._cdefsources)
- self._cdefsources.append(']')
- self._included_ffis.append(ffi_to_include)
-
- def new_handle(self, x):
- return self._backend.newp_handle(self.BVoidP, x)
-
- def from_handle(self, x):
- return self._backend.from_handle(x)
-
- def release(self, x):
- self._backend.release(x)
-
- def set_unicode(self, enabled_flag):
- """Windows: if 'enabled_flag' is True, enable the UNICODE and
- _UNICODE defines in C, and declare the types like TCHAR and LPTCSTR
- to be (pointers to) wchar_t. If 'enabled_flag' is False,
- declare these types to be (pointers to) plain 8-bit characters.
- This is mostly for backward compatibility; you usually want True.
- """
- if self._windows_unicode is not None:
- raise ValueError("set_unicode() can only be called once")
- enabled_flag = bool(enabled_flag)
- if enabled_flag:
- self.cdef("typedef wchar_t TBYTE;"
- "typedef wchar_t TCHAR;"
- "typedef const wchar_t *LPCTSTR;"
- "typedef const wchar_t *PCTSTR;"
- "typedef wchar_t *LPTSTR;"
- "typedef wchar_t *PTSTR;"
- "typedef TBYTE *PTBYTE;"
- "typedef TCHAR *PTCHAR;")
- else:
- self.cdef("typedef char TBYTE;"
- "typedef char TCHAR;"
- "typedef const char *LPCTSTR;"
- "typedef const char *PCTSTR;"
- "typedef char *LPTSTR;"
- "typedef char *PTSTR;"
- "typedef TBYTE *PTBYTE;"
- "typedef TCHAR *PTCHAR;")
- self._windows_unicode = enabled_flag
-
- def _apply_windows_unicode(self, kwds):
- defmacros = kwds.get('define_macros', ())
- if not isinstance(defmacros, (list, tuple)):
- raise TypeError("'define_macros' must be a list or tuple")
- defmacros = list(defmacros) + [('UNICODE', '1'),
- ('_UNICODE', '1')]
- kwds['define_macros'] = defmacros
-
- def _apply_embedding_fix(self, kwds):
- # must include an argument like "-lpython2.7" for the compiler
- def ensure(key, value):
- lst = kwds.setdefault(key, [])
- if value not in lst:
- lst.append(value)
- #
- if '__pypy__' in sys.builtin_module_names:
- import os
- if sys.platform == "win32":
- # we need 'libpypy-c.lib'. Current distributions of
- # pypy (>= 4.1) contain it as 'libs/python27.lib'.
- pythonlib = "python{0[0]}{0[1]}".format(sys.version_info)
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'libs'))
- else:
- # we need 'libpypy-c.{so,dylib}', which should be by
- # default located in 'sys.prefix/bin' for installed
- # systems.
- if sys.version_info < (3,):
- pythonlib = "pypy-c"
- else:
- pythonlib = "pypy3-c"
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'bin'))
- # On uninstalled pypy's, the libpypy-c is typically found in
- # .../pypy/goal/.
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'pypy', 'goal'))
- else:
- if sys.platform == "win32":
- template = "python%d%d"
- if hasattr(sys, 'gettotalrefcount'):
- template += '_d'
- else:
- try:
- import sysconfig
- except ImportError: # 2.6
- from distutils import sysconfig
- template = "python%d.%d"
- if sysconfig.get_config_var('DEBUG_EXT'):
- template += sysconfig.get_config_var('DEBUG_EXT')
- pythonlib = (template %
- (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
- if hasattr(sys, 'abiflags'):
- pythonlib += sys.abiflags
- ensure('libraries', pythonlib)
- if sys.platform == "win32":
- ensure('extra_link_args', '/MANIFEST')
-
- def set_source(self, module_name, source, source_extension='.c', **kwds):
- import os
- if hasattr(self, '_assigned_source'):
- raise ValueError("set_source() cannot be called several times "
- "per ffi object")
- if not isinstance(module_name, basestring):
- raise TypeError("'module_name' must be a string")
- if os.sep in module_name or (os.altsep and os.altsep in module_name):
- raise ValueError("'module_name' must not contain '/': use a dotted "
- "name to make a 'package.module' location")
- self._assigned_source = (str(module_name), source,
- source_extension, kwds)
-
- def set_source_pkgconfig(self, module_name, pkgconfig_libs, source,
- source_extension='.c', **kwds):
- from . import pkgconfig
- if not isinstance(pkgconfig_libs, list):
- raise TypeError("the pkgconfig_libs argument must be a list "
- "of package names")
- kwds2 = pkgconfig.flags_from_pkgconfig(pkgconfig_libs)
- pkgconfig.merge_flags(kwds, kwds2)
- self.set_source(module_name, source, source_extension, **kwds)
-
- def distutils_extension(self, tmpdir='build', verbose=True):
- from distutils.dir_util import mkpath
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- if hasattr(self, 'verifier'): # fallback, 'tmpdir' ignored
- return self.verifier.get_extension()
- raise ValueError("set_source() must be called before"
- " distutils_extension()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is None:
- raise TypeError("distutils_extension() is only for C extension "
- "modules, not for dlopen()-style pure Python "
- "modules")
- mkpath(tmpdir)
- ext, updated = recompile(self, module_name,
- source, tmpdir=tmpdir, extradir=tmpdir,
- source_extension=source_extension,
- call_c_compiler=False, **kwds)
- if verbose:
- if updated:
- sys.stderr.write("regenerated: %r\n" % (ext.sources[0],))
- else:
- sys.stderr.write("not modified: %r\n" % (ext.sources[0],))
- return ext
-
- def emit_c_code(self, filename):
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before emit_c_code()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is None:
- raise TypeError("emit_c_code() is only for C extension modules, "
- "not for dlopen()-style pure Python modules")
- recompile(self, module_name, source,
- c_file=filename, call_c_compiler=False, **kwds)
-
- def emit_python_code(self, filename):
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before emit_c_code()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is not None:
- raise TypeError("emit_python_code() is only for dlopen()-style "
- "pure Python modules, not for C extension modules")
- recompile(self, module_name, source,
- c_file=filename, call_c_compiler=False, **kwds)
-
- def compile(self, tmpdir='.', verbose=0, target=None, debug=None):
- """The 'target' argument gives the final file name of the
- compiled DLL. Use '*' to force distutils' choice, suitable for
- regular CPython C API modules. Use a file name ending in '.*'
- to ask for the system's default extension for dynamic libraries
- (.so/.dll/.dylib).
-
- The default is '*' when building a non-embedded C API extension,
- and (module_name + '.*') when building an embedded library.
- """
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before compile()")
- module_name, source, source_extension, kwds = self._assigned_source
- return recompile(self, module_name, source, tmpdir=tmpdir,
- target=target, source_extension=source_extension,
- compiler_verbose=verbose, debug=debug, **kwds)
-
- def init_once(self, func, tag):
- # Read _init_once_cache[tag], which is either (False, lock) if
- # we're calling the function now in some thread, or (True, result).
- # Don't call setdefault() in most cases, to avoid allocating and
- # immediately freeing a lock; but still use setdefaut() to avoid
- # races.
- try:
- x = self._init_once_cache[tag]
- except KeyError:
- x = self._init_once_cache.setdefault(tag, (False, allocate_lock()))
- # Common case: we got (True, result), so we return the result.
- if x[0]:
- return x[1]
- # Else, it's a lock. Acquire it to serialize the following tests.
- with x[1]:
- # Read again from _init_once_cache the current status.
- x = self._init_once_cache[tag]
- if x[0]:
- return x[1]
- # Call the function and store the result back.
- result = func()
- self._init_once_cache[tag] = (True, result)
- return result
-
- def embedding_init_code(self, pysource):
- if self._embedding:
- raise ValueError("embedding_init_code() can only be called once")
- # fix 'pysource' before it gets dumped into the C file:
- # - remove empty lines at the beginning, so it starts at "line 1"
- # - dedent, if all non-empty lines are indented
- # - check for SyntaxErrors
- import re
- match = re.match(r'\s*\n', pysource)
- if match:
- pysource = pysource[match.end():]
- lines = pysource.splitlines() or ['']
- prefix = re.match(r'\s*', lines[0]).group()
- for i in range(1, len(lines)):
- line = lines[i]
- if line.rstrip():
- while not line.startswith(prefix):
- prefix = prefix[:-1]
- i = len(prefix)
- lines = [line[i:]+'\n' for line in lines]
- pysource = ''.join(lines)
- #
- compile(pysource, "cffi_init", "exec")
- #
- self._embedding = pysource
-
- def def_extern(self, *args, **kwds):
- raise ValueError("ffi.def_extern() is only available on API-mode FFI "
- "objects")
-
- def list_types(self):
- """Returns the user type names known to this FFI instance.
- This returns a tuple containing three lists of names:
- (typedef_names, names_of_structs, names_of_unions)
- """
- typedefs = []
- structs = []
- unions = []
- for key in self._parser._declarations:
- if key.startswith('typedef '):
- typedefs.append(key[8:])
- elif key.startswith('struct '):
- structs.append(key[7:])
- elif key.startswith('union '):
- unions.append(key[6:])
- typedefs.sort()
- structs.sort()
- unions.sort()
- return (typedefs, structs, unions)
-
-
-def _load_backend_lib(backend, name, flags):
- import os
- if not isinstance(name, basestring):
- if sys.platform != "win32" or name is not None:
- return backend.load_library(name, flags)
- name = "c" # Windows: load_library(None) fails, but this works
- # on Python 2 (backward compatibility hack only)
- first_error = None
- if '.' in name or '/' in name or os.sep in name:
- try:
- return backend.load_library(name, flags)
- except OSError as e:
- first_error = e
- import ctypes.util
- path = ctypes.util.find_library(name)
- if path is None:
- if name == "c" and sys.platform == "win32" and sys.version_info >= (3,):
- raise OSError("dlopen(None) cannot work on Windows for Python 3 "
- "(see http://bugs.python.org/issue23606)")
- msg = ("ctypes.util.find_library() did not manage "
- "to locate a library called %r" % (name,))
- if first_error is not None:
- msg = "%s. Additionally, %s" % (first_error, msg)
- raise OSError(msg)
- return backend.load_library(path, flags)
-
-def _make_ffi_library(ffi, libname, flags):
- backend = ffi._backend
- backendlib = _load_backend_lib(backend, libname, flags)
- #
- def accessor_function(name):
- key = 'function ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- value = backendlib.load_function(BType, name)
- library.__dict__[name] = value
- #
- def accessor_variable(name):
- key = 'variable ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- read_variable = backendlib.read_variable
- write_variable = backendlib.write_variable
- setattr(FFILibrary, name, property(
- lambda self: read_variable(BType, name),
- lambda self, value: write_variable(BType, name, value)))
- #
- def addressof_var(name):
- try:
- return addr_variables[name]
- except KeyError:
- with ffi._lock:
- if name not in addr_variables:
- key = 'variable ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- if BType.kind != 'array':
- BType = model.pointer_cache(ffi, BType)
- p = backendlib.load_function(BType, name)
- addr_variables[name] = p
- return addr_variables[name]
- #
- def accessor_constant(name):
- raise NotImplementedError("non-integer constant '%s' cannot be "
- "accessed from a dlopen() library" % (name,))
- #
- def accessor_int_constant(name):
- library.__dict__[name] = ffi._parser._int_constants[name]
- #
- accessors = {}
- accessors_version = [False]
- addr_variables = {}
- #
- def update_accessors():
- if accessors_version[0] is ffi._cdef_version:
- return
- #
- for key, (tp, _) in ffi._parser._declarations.items():
- if not isinstance(tp, model.EnumType):
- tag, name = key.split(' ', 1)
- if tag == 'function':
- accessors[name] = accessor_function
- elif tag == 'variable':
- accessors[name] = accessor_variable
- elif tag == 'constant':
- accessors[name] = accessor_constant
- else:
- for i, enumname in enumerate(tp.enumerators):
- def accessor_enum(name, tp=tp, i=i):
- tp.check_not_partial()
- library.__dict__[name] = tp.enumvalues[i]
- accessors[enumname] = accessor_enum
- for name in ffi._parser._int_constants:
- accessors.setdefault(name, accessor_int_constant)
- accessors_version[0] = ffi._cdef_version
- #
- def make_accessor(name):
- with ffi._lock:
- if name in library.__dict__ or name in FFILibrary.__dict__:
- return # added by another thread while waiting for the lock
- if name not in accessors:
- update_accessors()
- if name not in accessors:
- raise AttributeError(name)
- accessors[name](name)
- #
- class FFILibrary(object):
- def __getattr__(self, name):
- make_accessor(name)
- return getattr(self, name)
- def __setattr__(self, name, value):
- try:
- property = getattr(self.__class__, name)
- except AttributeError:
- make_accessor(name)
- setattr(self, name, value)
- else:
- property.__set__(self, value)
- def __dir__(self):
- with ffi._lock:
- update_accessors()
- return accessors.keys()
- def __addressof__(self, name):
- if name in library.__dict__:
- return library.__dict__[name]
- if name in FFILibrary.__dict__:
- return addressof_var(name)
- make_accessor(name)
- if name in library.__dict__:
- return library.__dict__[name]
- if name in FFILibrary.__dict__:
- return addressof_var(name)
- raise AttributeError("cffi library has no function or "
- "global variable named '%s'" % (name,))
- def __cffi_close__(self):
- backendlib.close_lib()
- self.__dict__.clear()
- #
- if isinstance(libname, basestring):
- try:
- if not isinstance(libname, str): # unicode, on Python 2
- libname = libname.encode('utf-8')
- FFILibrary.__name__ = 'FFILibrary_%s' % libname
- except UnicodeError:
- pass
- library = FFILibrary()
- return library, library.__dict__
-
-def _builtin_function_type(func):
- # a hack to make at least ffi.typeof(builtin_function) work,
- # if the builtin function was obtained by 'vengine_cpy'.
- import sys
- try:
- module = sys.modules[func.__module__]
- ffi = module._cffi_original_ffi
- types_of_builtin_funcs = module._cffi_types_of_builtin_funcs
- tp = types_of_builtin_funcs[func]
- except (KeyError, AttributeError, TypeError):
- return None
- else:
- with ffi._lock:
- return ffi._get_cached_btype(tp)
diff --git a/resources/python/bin/3.7/linux/cffi/backend_ctypes.py b/resources/python/bin/3.7/linux/cffi/backend_ctypes.py
deleted file mode 100644
index e7956a79c..000000000
--- a/resources/python/bin/3.7/linux/cffi/backend_ctypes.py
+++ /dev/null
@@ -1,1121 +0,0 @@
-import ctypes, ctypes.util, operator, sys
-from . import model
-
-if sys.version_info < (3,):
- bytechr = chr
-else:
- unicode = str
- long = int
- xrange = range
- bytechr = lambda num: bytes([num])
-
-class CTypesType(type):
- pass
-
-class CTypesData(object):
- __metaclass__ = CTypesType
- __slots__ = ['__weakref__']
- __name__ = ''
-
- def __init__(self, *args):
- raise TypeError("cannot instantiate %r" % (self.__class__,))
-
- @classmethod
- def _newp(cls, init):
- raise TypeError("expected a pointer or array ctype, got '%s'"
- % (cls._get_c_name(),))
-
- @staticmethod
- def _to_ctypes(value):
- raise TypeError
-
- @classmethod
- def _arg_to_ctypes(cls, *value):
- try:
- ctype = cls._ctype
- except AttributeError:
- raise TypeError("cannot create an instance of %r" % (cls,))
- if value:
- res = cls._to_ctypes(*value)
- if not isinstance(res, ctype):
- res = cls._ctype(res)
- else:
- res = cls._ctype()
- return res
-
- @classmethod
- def _create_ctype_obj(cls, init):
- if init is None:
- return cls._arg_to_ctypes()
- else:
- return cls._arg_to_ctypes(init)
-
- @staticmethod
- def _from_ctypes(ctypes_value):
- raise TypeError
-
- @classmethod
- def _get_c_name(cls, replace_with=''):
- return cls._reftypename.replace(' &', replace_with)
-
- @classmethod
- def _fix_class(cls):
- cls.__name__ = 'CData<%s>' % (cls._get_c_name(),)
- cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),)
- cls.__module__ = 'ffi'
-
- def _get_own_repr(self):
- raise NotImplementedError
-
- def _addr_repr(self, address):
- if address == 0:
- return 'NULL'
- else:
- if address < 0:
- address += 1 << (8*ctypes.sizeof(ctypes.c_void_p))
- return '0x%x' % address
-
- def __repr__(self, c_name=None):
- own = self._get_own_repr()
- return '' % (c_name or self._get_c_name(), own)
-
- def _convert_to_address(self, BClass):
- if BClass is None:
- raise TypeError("cannot convert %r to an address" % (
- self._get_c_name(),))
- else:
- raise TypeError("cannot convert %r to %r" % (
- self._get_c_name(), BClass._get_c_name()))
-
- @classmethod
- def _get_size(cls):
- return ctypes.sizeof(cls._ctype)
-
- def _get_size_of_instance(self):
- return ctypes.sizeof(self._ctype)
-
- @classmethod
- def _cast_from(cls, source):
- raise TypeError("cannot cast to %r" % (cls._get_c_name(),))
-
- def _cast_to_integer(self):
- return self._convert_to_address(None)
-
- @classmethod
- def _alignment(cls):
- return ctypes.alignment(cls._ctype)
-
- def __iter__(self):
- raise TypeError("cdata %r does not support iteration" % (
- self._get_c_name()),)
-
- def _make_cmp(name):
- cmpfunc = getattr(operator, name)
- def cmp(self, other):
- v_is_ptr = not isinstance(self, CTypesGenericPrimitive)
- w_is_ptr = (isinstance(other, CTypesData) and
- not isinstance(other, CTypesGenericPrimitive))
- if v_is_ptr and w_is_ptr:
- return cmpfunc(self._convert_to_address(None),
- other._convert_to_address(None))
- elif v_is_ptr or w_is_ptr:
- return NotImplemented
- else:
- if isinstance(self, CTypesGenericPrimitive):
- self = self._value
- if isinstance(other, CTypesGenericPrimitive):
- other = other._value
- return cmpfunc(self, other)
- cmp.func_name = name
- return cmp
-
- __eq__ = _make_cmp('__eq__')
- __ne__ = _make_cmp('__ne__')
- __lt__ = _make_cmp('__lt__')
- __le__ = _make_cmp('__le__')
- __gt__ = _make_cmp('__gt__')
- __ge__ = _make_cmp('__ge__')
-
- def __hash__(self):
- return hash(self._convert_to_address(None))
-
- def _to_string(self, maxlen):
- raise TypeError("string(): %r" % (self,))
-
-
-class CTypesGenericPrimitive(CTypesData):
- __slots__ = []
-
- def __hash__(self):
- return hash(self._value)
-
- def _get_own_repr(self):
- return repr(self._from_ctypes(self._value))
-
-
-class CTypesGenericArray(CTypesData):
- __slots__ = []
-
- @classmethod
- def _newp(cls, init):
- return cls(init)
-
- def __iter__(self):
- for i in xrange(len(self)):
- yield self[i]
-
- def _get_own_repr(self):
- return self._addr_repr(ctypes.addressof(self._blob))
-
-
-class CTypesGenericPtr(CTypesData):
- __slots__ = ['_address', '_as_ctype_ptr']
- _automatic_casts = False
- kind = "pointer"
-
- @classmethod
- def _newp(cls, init):
- return cls(init)
-
- @classmethod
- def _cast_from(cls, source):
- if source is None:
- address = 0
- elif isinstance(source, CTypesData):
- address = source._cast_to_integer()
- elif isinstance(source, (int, long)):
- address = source
- else:
- raise TypeError("bad type for cast to %r: %r" %
- (cls, type(source).__name__))
- return cls._new_pointer_at(address)
-
- @classmethod
- def _new_pointer_at(cls, address):
- self = cls.__new__(cls)
- self._address = address
- self._as_ctype_ptr = ctypes.cast(address, cls._ctype)
- return self
-
- def _get_own_repr(self):
- try:
- return self._addr_repr(self._address)
- except AttributeError:
- return '???'
-
- def _cast_to_integer(self):
- return self._address
-
- def __nonzero__(self):
- return bool(self._address)
- __bool__ = __nonzero__
-
- @classmethod
- def _to_ctypes(cls, value):
- if not isinstance(value, CTypesData):
- raise TypeError("unexpected %s object" % type(value).__name__)
- address = value._convert_to_address(cls)
- return ctypes.cast(address, cls._ctype)
-
- @classmethod
- def _from_ctypes(cls, ctypes_ptr):
- address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0
- return cls._new_pointer_at(address)
-
- @classmethod
- def _initialize(cls, ctypes_ptr, value):
- if value:
- ctypes_ptr.contents = cls._to_ctypes(value).contents
-
- def _convert_to_address(self, BClass):
- if (BClass in (self.__class__, None) or BClass._automatic_casts
- or self._automatic_casts):
- return self._address
- else:
- return CTypesData._convert_to_address(self, BClass)
-
-
-class CTypesBaseStructOrUnion(CTypesData):
- __slots__ = ['_blob']
-
- @classmethod
- def _create_ctype_obj(cls, init):
- # may be overridden
- raise TypeError("cannot instantiate opaque type %s" % (cls,))
-
- def _get_own_repr(self):
- return self._addr_repr(ctypes.addressof(self._blob))
-
- @classmethod
- def _offsetof(cls, fieldname):
- return getattr(cls._ctype, fieldname).offset
-
- def _convert_to_address(self, BClass):
- if getattr(BClass, '_BItem', None) is self.__class__:
- return ctypes.addressof(self._blob)
- else:
- return CTypesData._convert_to_address(self, BClass)
-
- @classmethod
- def _from_ctypes(cls, ctypes_struct_or_union):
- self = cls.__new__(cls)
- self._blob = ctypes_struct_or_union
- return self
-
- @classmethod
- def _to_ctypes(cls, value):
- return value._blob
-
- def __repr__(self, c_name=None):
- return CTypesData.__repr__(self, c_name or self._get_c_name(' &'))
-
-
-class CTypesBackend(object):
-
- PRIMITIVE_TYPES = {
- 'char': ctypes.c_char,
- 'short': ctypes.c_short,
- 'int': ctypes.c_int,
- 'long': ctypes.c_long,
- 'long long': ctypes.c_longlong,
- 'signed char': ctypes.c_byte,
- 'unsigned char': ctypes.c_ubyte,
- 'unsigned short': ctypes.c_ushort,
- 'unsigned int': ctypes.c_uint,
- 'unsigned long': ctypes.c_ulong,
- 'unsigned long long': ctypes.c_ulonglong,
- 'float': ctypes.c_float,
- 'double': ctypes.c_double,
- '_Bool': ctypes.c_bool,
- }
-
- for _name in ['unsigned long long', 'unsigned long',
- 'unsigned int', 'unsigned short', 'unsigned char']:
- _size = ctypes.sizeof(PRIMITIVE_TYPES[_name])
- PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_void_p):
- PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_size_t):
- PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name]
-
- for _name in ['long long', 'long', 'int', 'short', 'signed char']:
- _size = ctypes.sizeof(PRIMITIVE_TYPES[_name])
- PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_void_p):
- PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name]
- PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_size_t):
- PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name]
-
-
- def __init__(self):
- self.RTLD_LAZY = 0 # not supported anyway by ctypes
- self.RTLD_NOW = 0
- self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL
- self.RTLD_LOCAL = ctypes.RTLD_LOCAL
-
- def set_ffi(self, ffi):
- self.ffi = ffi
-
- def _get_types(self):
- return CTypesData, CTypesType
-
- def load_library(self, path, flags=0):
- cdll = ctypes.CDLL(path, flags)
- return CTypesLibrary(self, cdll)
-
- def new_void_type(self):
- class CTypesVoid(CTypesData):
- __slots__ = []
- _reftypename = 'void &'
- @staticmethod
- def _from_ctypes(novalue):
- return None
- @staticmethod
- def _to_ctypes(novalue):
- if novalue is not None:
- raise TypeError("None expected, got %s object" %
- (type(novalue).__name__,))
- return None
- CTypesVoid._fix_class()
- return CTypesVoid
-
- def new_primitive_type(self, name):
- if name == 'wchar_t':
- raise NotImplementedError(name)
- ctype = self.PRIMITIVE_TYPES[name]
- if name == 'char':
- kind = 'char'
- elif name in ('float', 'double'):
- kind = 'float'
- else:
- if name in ('signed char', 'unsigned char'):
- kind = 'byte'
- elif name == '_Bool':
- kind = 'bool'
- else:
- kind = 'int'
- is_signed = (ctype(-1).value == -1)
- #
- def _cast_source_to_int(source):
- if isinstance(source, (int, long, float)):
- source = int(source)
- elif isinstance(source, CTypesData):
- source = source._cast_to_integer()
- elif isinstance(source, bytes):
- source = ord(source)
- elif source is None:
- source = 0
- else:
- raise TypeError("bad type for cast to %r: %r" %
- (CTypesPrimitive, type(source).__name__))
- return source
- #
- kind1 = kind
- class CTypesPrimitive(CTypesGenericPrimitive):
- __slots__ = ['_value']
- _ctype = ctype
- _reftypename = '%s &' % name
- kind = kind1
-
- def __init__(self, value):
- self._value = value
-
- @staticmethod
- def _create_ctype_obj(init):
- if init is None:
- return ctype()
- return ctype(CTypesPrimitive._to_ctypes(init))
-
- if kind == 'int' or kind == 'byte':
- @classmethod
- def _cast_from(cls, source):
- source = _cast_source_to_int(source)
- source = ctype(source).value # cast within range
- return cls(source)
- def __int__(self):
- return self._value
-
- if kind == 'bool':
- @classmethod
- def _cast_from(cls, source):
- if not isinstance(source, (int, long, float)):
- source = _cast_source_to_int(source)
- return cls(bool(source))
- def __int__(self):
- return int(self._value)
-
- if kind == 'char':
- @classmethod
- def _cast_from(cls, source):
- source = _cast_source_to_int(source)
- source = bytechr(source & 0xFF)
- return cls(source)
- def __int__(self):
- return ord(self._value)
-
- if kind == 'float':
- @classmethod
- def _cast_from(cls, source):
- if isinstance(source, float):
- pass
- elif isinstance(source, CTypesGenericPrimitive):
- if hasattr(source, '__float__'):
- source = float(source)
- else:
- source = int(source)
- else:
- source = _cast_source_to_int(source)
- source = ctype(source).value # fix precision
- return cls(source)
- def __int__(self):
- return int(self._value)
- def __float__(self):
- return self._value
-
- _cast_to_integer = __int__
-
- if kind == 'int' or kind == 'byte' or kind == 'bool':
- @staticmethod
- def _to_ctypes(x):
- if not isinstance(x, (int, long)):
- if isinstance(x, CTypesData):
- x = int(x)
- else:
- raise TypeError("integer expected, got %s" %
- type(x).__name__)
- if ctype(x).value != x:
- if not is_signed and x < 0:
- raise OverflowError("%s: negative integer" % name)
- else:
- raise OverflowError("%s: integer out of bounds"
- % name)
- return x
-
- if kind == 'char':
- @staticmethod
- def _to_ctypes(x):
- if isinstance(x, bytes) and len(x) == 1:
- return x
- if isinstance(x, CTypesPrimitive): # >
- return x._value
- raise TypeError("character expected, got %s" %
- type(x).__name__)
- def __nonzero__(self):
- return ord(self._value) != 0
- else:
- def __nonzero__(self):
- return self._value != 0
- __bool__ = __nonzero__
-
- if kind == 'float':
- @staticmethod
- def _to_ctypes(x):
- if not isinstance(x, (int, long, float, CTypesData)):
- raise TypeError("float expected, got %s" %
- type(x).__name__)
- return ctype(x).value
-
- @staticmethod
- def _from_ctypes(value):
- return getattr(value, 'value', value)
-
- @staticmethod
- def _initialize(blob, init):
- blob.value = CTypesPrimitive._to_ctypes(init)
-
- if kind == 'char':
- def _to_string(self, maxlen):
- return self._value
- if kind == 'byte':
- def _to_string(self, maxlen):
- return chr(self._value & 0xff)
- #
- CTypesPrimitive._fix_class()
- return CTypesPrimitive
-
- def new_pointer_type(self, BItem):
- getbtype = self.ffi._get_cached_btype
- if BItem is getbtype(model.PrimitiveType('char')):
- kind = 'charp'
- elif BItem in (getbtype(model.PrimitiveType('signed char')),
- getbtype(model.PrimitiveType('unsigned char'))):
- kind = 'bytep'
- elif BItem is getbtype(model.void_type):
- kind = 'voidp'
- else:
- kind = 'generic'
- #
- class CTypesPtr(CTypesGenericPtr):
- __slots__ = ['_own']
- if kind == 'charp':
- __slots__ += ['__as_strbuf']
- _BItem = BItem
- if hasattr(BItem, '_ctype'):
- _ctype = ctypes.POINTER(BItem._ctype)
- _bitem_size = ctypes.sizeof(BItem._ctype)
- else:
- _ctype = ctypes.c_void_p
- if issubclass(BItem, CTypesGenericArray):
- _reftypename = BItem._get_c_name('(* &)')
- else:
- _reftypename = BItem._get_c_name(' * &')
-
- def __init__(self, init):
- ctypeobj = BItem._create_ctype_obj(init)
- if kind == 'charp':
- self.__as_strbuf = ctypes.create_string_buffer(
- ctypeobj.value + b'\x00')
- self._as_ctype_ptr = ctypes.cast(
- self.__as_strbuf, self._ctype)
- else:
- self._as_ctype_ptr = ctypes.pointer(ctypeobj)
- self._address = ctypes.cast(self._as_ctype_ptr,
- ctypes.c_void_p).value
- self._own = True
-
- def __add__(self, other):
- if isinstance(other, (int, long)):
- return self._new_pointer_at(self._address +
- other * self._bitem_size)
- else:
- return NotImplemented
-
- def __sub__(self, other):
- if isinstance(other, (int, long)):
- return self._new_pointer_at(self._address -
- other * self._bitem_size)
- elif type(self) is type(other):
- return (self._address - other._address) // self._bitem_size
- else:
- return NotImplemented
-
- def __getitem__(self, index):
- if getattr(self, '_own', False) and index != 0:
- raise IndexError
- return BItem._from_ctypes(self._as_ctype_ptr[index])
-
- def __setitem__(self, index, value):
- self._as_ctype_ptr[index] = BItem._to_ctypes(value)
-
- if kind == 'charp' or kind == 'voidp':
- @classmethod
- def _arg_to_ctypes(cls, *value):
- if value and isinstance(value[0], bytes):
- return ctypes.c_char_p(value[0])
- else:
- return super(CTypesPtr, cls)._arg_to_ctypes(*value)
-
- if kind == 'charp' or kind == 'bytep':
- def _to_string(self, maxlen):
- if maxlen < 0:
- maxlen = sys.maxsize
- p = ctypes.cast(self._as_ctype_ptr,
- ctypes.POINTER(ctypes.c_char))
- n = 0
- while n < maxlen and p[n] != b'\x00':
- n += 1
- return b''.join([p[i] for i in range(n)])
-
- def _get_own_repr(self):
- if getattr(self, '_own', False):
- return 'owning %d bytes' % (
- ctypes.sizeof(self._as_ctype_ptr.contents),)
- return super(CTypesPtr, self)._get_own_repr()
- #
- if (BItem is self.ffi._get_cached_btype(model.void_type) or
- BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))):
- CTypesPtr._automatic_casts = True
- #
- CTypesPtr._fix_class()
- return CTypesPtr
-
- def new_array_type(self, CTypesPtr, length):
- if length is None:
- brackets = ' &[]'
- else:
- brackets = ' &[%d]' % length
- BItem = CTypesPtr._BItem
- getbtype = self.ffi._get_cached_btype
- if BItem is getbtype(model.PrimitiveType('char')):
- kind = 'char'
- elif BItem in (getbtype(model.PrimitiveType('signed char')),
- getbtype(model.PrimitiveType('unsigned char'))):
- kind = 'byte'
- else:
- kind = 'generic'
- #
- class CTypesArray(CTypesGenericArray):
- __slots__ = ['_blob', '_own']
- if length is not None:
- _ctype = BItem._ctype * length
- else:
- __slots__.append('_ctype')
- _reftypename = BItem._get_c_name(brackets)
- _declared_length = length
- _CTPtr = CTypesPtr
-
- def __init__(self, init):
- if length is None:
- if isinstance(init, (int, long)):
- len1 = init
- init = None
- elif kind == 'char' and isinstance(init, bytes):
- len1 = len(init) + 1 # extra null
- else:
- init = tuple(init)
- len1 = len(init)
- self._ctype = BItem._ctype * len1
- self._blob = self._ctype()
- self._own = True
- if init is not None:
- self._initialize(self._blob, init)
-
- @staticmethod
- def _initialize(blob, init):
- if isinstance(init, bytes):
- init = [init[i:i+1] for i in range(len(init))]
- else:
- if isinstance(init, CTypesGenericArray):
- if (len(init) != len(blob) or
- not isinstance(init, CTypesArray)):
- raise TypeError("length/type mismatch: %s" % (init,))
- init = tuple(init)
- if len(init) > len(blob):
- raise IndexError("too many initializers")
- addr = ctypes.cast(blob, ctypes.c_void_p).value
- PTR = ctypes.POINTER(BItem._ctype)
- itemsize = ctypes.sizeof(BItem._ctype)
- for i, value in enumerate(init):
- p = ctypes.cast(addr + i * itemsize, PTR)
- BItem._initialize(p.contents, value)
-
- def __len__(self):
- return len(self._blob)
-
- def __getitem__(self, index):
- if not (0 <= index < len(self._blob)):
- raise IndexError
- return BItem._from_ctypes(self._blob[index])
-
- def __setitem__(self, index, value):
- if not (0 <= index < len(self._blob)):
- raise IndexError
- self._blob[index] = BItem._to_ctypes(value)
-
- if kind == 'char' or kind == 'byte':
- def _to_string(self, maxlen):
- if maxlen < 0:
- maxlen = len(self._blob)
- p = ctypes.cast(self._blob,
- ctypes.POINTER(ctypes.c_char))
- n = 0
- while n < maxlen and p[n] != b'\x00':
- n += 1
- return b''.join([p[i] for i in range(n)])
-
- def _get_own_repr(self):
- if getattr(self, '_own', False):
- return 'owning %d bytes' % (ctypes.sizeof(self._blob),)
- return super(CTypesArray, self)._get_own_repr()
-
- def _convert_to_address(self, BClass):
- if BClass in (CTypesPtr, None) or BClass._automatic_casts:
- return ctypes.addressof(self._blob)
- else:
- return CTypesData._convert_to_address(self, BClass)
-
- @staticmethod
- def _from_ctypes(ctypes_array):
- self = CTypesArray.__new__(CTypesArray)
- self._blob = ctypes_array
- return self
-
- @staticmethod
- def _arg_to_ctypes(value):
- return CTypesPtr._arg_to_ctypes(value)
-
- def __add__(self, other):
- if isinstance(other, (int, long)):
- return CTypesPtr._new_pointer_at(
- ctypes.addressof(self._blob) +
- other * ctypes.sizeof(BItem._ctype))
- else:
- return NotImplemented
-
- @classmethod
- def _cast_from(cls, source):
- raise NotImplementedError("casting to %r" % (
- cls._get_c_name(),))
- #
- CTypesArray._fix_class()
- return CTypesArray
-
- def _new_struct_or_union(self, kind, name, base_ctypes_class):
- #
- class struct_or_union(base_ctypes_class):
- pass
- struct_or_union.__name__ = '%s_%s' % (kind, name)
- kind1 = kind
- #
- class CTypesStructOrUnion(CTypesBaseStructOrUnion):
- __slots__ = ['_blob']
- _ctype = struct_or_union
- _reftypename = '%s &' % (name,)
- _kind = kind = kind1
- #
- CTypesStructOrUnion._fix_class()
- return CTypesStructOrUnion
-
- def new_struct_type(self, name):
- return self._new_struct_or_union('struct', name, ctypes.Structure)
-
- def new_union_type(self, name):
- return self._new_struct_or_union('union', name, ctypes.Union)
-
- def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp,
- totalsize=-1, totalalignment=-1, sflags=0,
- pack=0):
- if totalsize >= 0 or totalalignment >= 0:
- raise NotImplementedError("the ctypes backend of CFFI does not support "
- "structures completed by verify(); please "
- "compile and install the _cffi_backend module.")
- struct_or_union = CTypesStructOrUnion._ctype
- fnames = [fname for (fname, BField, bitsize) in fields]
- btypes = [BField for (fname, BField, bitsize) in fields]
- bitfields = [bitsize for (fname, BField, bitsize) in fields]
- #
- bfield_types = {}
- cfields = []
- for (fname, BField, bitsize) in fields:
- if bitsize < 0:
- cfields.append((fname, BField._ctype))
- bfield_types[fname] = BField
- else:
- cfields.append((fname, BField._ctype, bitsize))
- bfield_types[fname] = Ellipsis
- if sflags & 8:
- struct_or_union._pack_ = 1
- elif pack:
- struct_or_union._pack_ = pack
- struct_or_union._fields_ = cfields
- CTypesStructOrUnion._bfield_types = bfield_types
- #
- @staticmethod
- def _create_ctype_obj(init):
- result = struct_or_union()
- if init is not None:
- initialize(result, init)
- return result
- CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj
- #
- def initialize(blob, init):
- if is_union:
- if len(init) > 1:
- raise ValueError("union initializer: %d items given, but "
- "only one supported (use a dict if needed)"
- % (len(init),))
- if not isinstance(init, dict):
- if isinstance(init, (bytes, unicode)):
- raise TypeError("union initializer: got a str")
- init = tuple(init)
- if len(init) > len(fnames):
- raise ValueError("too many values for %s initializer" %
- CTypesStructOrUnion._get_c_name())
- init = dict(zip(fnames, init))
- addr = ctypes.addressof(blob)
- for fname, value in init.items():
- BField, bitsize = name2fieldtype[fname]
- assert bitsize < 0, \
- "not implemented: initializer with bit fields"
- offset = CTypesStructOrUnion._offsetof(fname)
- PTR = ctypes.POINTER(BField._ctype)
- p = ctypes.cast(addr + offset, PTR)
- BField._initialize(p.contents, value)
- is_union = CTypesStructOrUnion._kind == 'union'
- name2fieldtype = dict(zip(fnames, zip(btypes, bitfields)))
- #
- for fname, BField, bitsize in fields:
- if fname == '':
- raise NotImplementedError("nested anonymous structs/unions")
- if hasattr(CTypesStructOrUnion, fname):
- raise ValueError("the field name %r conflicts in "
- "the ctypes backend" % fname)
- if bitsize < 0:
- def getter(self, fname=fname, BField=BField,
- offset=CTypesStructOrUnion._offsetof(fname),
- PTR=ctypes.POINTER(BField._ctype)):
- addr = ctypes.addressof(self._blob)
- p = ctypes.cast(addr + offset, PTR)
- return BField._from_ctypes(p.contents)
- def setter(self, value, fname=fname, BField=BField):
- setattr(self._blob, fname, BField._to_ctypes(value))
- #
- if issubclass(BField, CTypesGenericArray):
- setter = None
- if BField._declared_length == 0:
- def getter(self, fname=fname, BFieldPtr=BField._CTPtr,
- offset=CTypesStructOrUnion._offsetof(fname),
- PTR=ctypes.POINTER(BField._ctype)):
- addr = ctypes.addressof(self._blob)
- p = ctypes.cast(addr + offset, PTR)
- return BFieldPtr._from_ctypes(p)
- #
- else:
- def getter(self, fname=fname, BField=BField):
- return BField._from_ctypes(getattr(self._blob, fname))
- def setter(self, value, fname=fname, BField=BField):
- # xxx obscure workaround
- value = BField._to_ctypes(value)
- oldvalue = getattr(self._blob, fname)
- setattr(self._blob, fname, value)
- if value != getattr(self._blob, fname):
- setattr(self._blob, fname, oldvalue)
- raise OverflowError("value too large for bitfield")
- setattr(CTypesStructOrUnion, fname, property(getter, setter))
- #
- CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp))
- for fname in fnames:
- if hasattr(CTypesPtr, fname):
- raise ValueError("the field name %r conflicts in "
- "the ctypes backend" % fname)
- def getter(self, fname=fname):
- return getattr(self[0], fname)
- def setter(self, value, fname=fname):
- setattr(self[0], fname, value)
- setattr(CTypesPtr, fname, property(getter, setter))
-
- def new_function_type(self, BArgs, BResult, has_varargs):
- nameargs = [BArg._get_c_name() for BArg in BArgs]
- if has_varargs:
- nameargs.append('...')
- nameargs = ', '.join(nameargs)
- #
- class CTypesFunctionPtr(CTypesGenericPtr):
- __slots__ = ['_own_callback', '_name']
- _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None),
- *[BArg._ctype for BArg in BArgs],
- use_errno=True)
- _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,))
-
- def __init__(self, init, error=None):
- # create a callback to the Python callable init()
- import traceback
- assert not has_varargs, "varargs not supported for callbacks"
- if getattr(BResult, '_ctype', None) is not None:
- error = BResult._from_ctypes(
- BResult._create_ctype_obj(error))
- else:
- error = None
- def callback(*args):
- args2 = []
- for arg, BArg in zip(args, BArgs):
- args2.append(BArg._from_ctypes(arg))
- try:
- res2 = init(*args2)
- res2 = BResult._to_ctypes(res2)
- except:
- traceback.print_exc()
- res2 = error
- if issubclass(BResult, CTypesGenericPtr):
- if res2:
- res2 = ctypes.cast(res2, ctypes.c_void_p).value
- # .value: http://bugs.python.org/issue1574593
- else:
- res2 = None
- #print repr(res2)
- return res2
- if issubclass(BResult, CTypesGenericPtr):
- # The only pointers callbacks can return are void*s:
- # http://bugs.python.org/issue5710
- callback_ctype = ctypes.CFUNCTYPE(
- ctypes.c_void_p,
- *[BArg._ctype for BArg in BArgs],
- use_errno=True)
- else:
- callback_ctype = CTypesFunctionPtr._ctype
- self._as_ctype_ptr = callback_ctype(callback)
- self._address = ctypes.cast(self._as_ctype_ptr,
- ctypes.c_void_p).value
- self._own_callback = init
-
- @staticmethod
- def _initialize(ctypes_ptr, value):
- if value:
- raise NotImplementedError("ctypes backend: not supported: "
- "initializers for function pointers")
-
- def __repr__(self):
- c_name = getattr(self, '_name', None)
- if c_name:
- i = self._reftypename.index('(* &)')
- if self._reftypename[i-1] not in ' )*':
- c_name = ' ' + c_name
- c_name = self._reftypename.replace('(* &)', c_name)
- return CTypesData.__repr__(self, c_name)
-
- def _get_own_repr(self):
- if getattr(self, '_own_callback', None) is not None:
- return 'calling %r' % (self._own_callback,)
- return super(CTypesFunctionPtr, self)._get_own_repr()
-
- def __call__(self, *args):
- if has_varargs:
- assert len(args) >= len(BArgs)
- extraargs = args[len(BArgs):]
- args = args[:len(BArgs)]
- else:
- assert len(args) == len(BArgs)
- ctypes_args = []
- for arg, BArg in zip(args, BArgs):
- ctypes_args.append(BArg._arg_to_ctypes(arg))
- if has_varargs:
- for i, arg in enumerate(extraargs):
- if arg is None:
- ctypes_args.append(ctypes.c_void_p(0)) # NULL
- continue
- if not isinstance(arg, CTypesData):
- raise TypeError(
- "argument %d passed in the variadic part "
- "needs to be a cdata object (got %s)" %
- (1 + len(BArgs) + i, type(arg).__name__))
- ctypes_args.append(arg._arg_to_ctypes(arg))
- result = self._as_ctype_ptr(*ctypes_args)
- return BResult._from_ctypes(result)
- #
- CTypesFunctionPtr._fix_class()
- return CTypesFunctionPtr
-
- def new_enum_type(self, name, enumerators, enumvalues, CTypesInt):
- assert isinstance(name, str)
- reverse_mapping = dict(zip(reversed(enumvalues),
- reversed(enumerators)))
- #
- class CTypesEnum(CTypesInt):
- __slots__ = []
- _reftypename = '%s &' % name
-
- def _get_own_repr(self):
- value = self._value
- try:
- return '%d: %s' % (value, reverse_mapping[value])
- except KeyError:
- return str(value)
-
- def _to_string(self, maxlen):
- value = self._value
- try:
- return reverse_mapping[value]
- except KeyError:
- return str(value)
- #
- CTypesEnum._fix_class()
- return CTypesEnum
-
- def get_errno(self):
- return ctypes.get_errno()
-
- def set_errno(self, value):
- ctypes.set_errno(value)
-
- def string(self, b, maxlen=-1):
- return b._to_string(maxlen)
-
- def buffer(self, bptr, size=-1):
- raise NotImplementedError("buffer() with ctypes backend")
-
- def sizeof(self, cdata_or_BType):
- if isinstance(cdata_or_BType, CTypesData):
- return cdata_or_BType._get_size_of_instance()
- else:
- assert issubclass(cdata_or_BType, CTypesData)
- return cdata_or_BType._get_size()
-
- def alignof(self, BType):
- assert issubclass(BType, CTypesData)
- return BType._alignment()
-
- def newp(self, BType, source):
- if not issubclass(BType, CTypesData):
- raise TypeError
- return BType._newp(source)
-
- def cast(self, BType, source):
- return BType._cast_from(source)
-
- def callback(self, BType, source, error, onerror):
- assert onerror is None # XXX not implemented
- return BType(source, error)
-
- _weakref_cache_ref = None
-
- def gcp(self, cdata, destructor, size=0):
- if self._weakref_cache_ref is None:
- import weakref
- class MyRef(weakref.ref):
- def __eq__(self, other):
- myref = self()
- return self is other or (
- myref is not None and myref is other())
- def __ne__(self, other):
- return not (self == other)
- def __hash__(self):
- try:
- return self._hash
- except AttributeError:
- self._hash = hash(self())
- return self._hash
- self._weakref_cache_ref = {}, MyRef
- weak_cache, MyRef = self._weakref_cache_ref
-
- if destructor is None:
- try:
- del weak_cache[MyRef(cdata)]
- except KeyError:
- raise TypeError("Can remove destructor only on a object "
- "previously returned by ffi.gc()")
- return None
-
- def remove(k):
- cdata, destructor = weak_cache.pop(k, (None, None))
- if destructor is not None:
- destructor(cdata)
-
- new_cdata = self.cast(self.typeof(cdata), cdata)
- assert new_cdata is not cdata
- weak_cache[MyRef(new_cdata, remove)] = (cdata, destructor)
- return new_cdata
-
- typeof = type
-
- def getcname(self, BType, replace_with):
- return BType._get_c_name(replace_with)
-
- def typeoffsetof(self, BType, fieldname, num=0):
- if isinstance(fieldname, str):
- if num == 0 and issubclass(BType, CTypesGenericPtr):
- BType = BType._BItem
- if not issubclass(BType, CTypesBaseStructOrUnion):
- raise TypeError("expected a struct or union ctype")
- BField = BType._bfield_types[fieldname]
- if BField is Ellipsis:
- raise TypeError("not supported for bitfields")
- return (BField, BType._offsetof(fieldname))
- elif isinstance(fieldname, (int, long)):
- if issubclass(BType, CTypesGenericArray):
- BType = BType._CTPtr
- if not issubclass(BType, CTypesGenericPtr):
- raise TypeError("expected an array or ptr ctype")
- BItem = BType._BItem
- offset = BItem._get_size() * fieldname
- if offset > sys.maxsize:
- raise OverflowError
- return (BItem, offset)
- else:
- raise TypeError(type(fieldname))
-
- def rawaddressof(self, BTypePtr, cdata, offset=None):
- if isinstance(cdata, CTypesBaseStructOrUnion):
- ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata))
- elif isinstance(cdata, CTypesGenericPtr):
- if offset is None or not issubclass(type(cdata)._BItem,
- CTypesBaseStructOrUnion):
- raise TypeError("unexpected cdata type")
- ptr = type(cdata)._to_ctypes(cdata)
- elif isinstance(cdata, CTypesGenericArray):
- ptr = type(cdata)._to_ctypes(cdata)
- else:
- raise TypeError("expected a ")
- if offset:
- ptr = ctypes.cast(
- ctypes.c_void_p(
- ctypes.cast(ptr, ctypes.c_void_p).value + offset),
- type(ptr))
- return BTypePtr._from_ctypes(ptr)
-
-
-class CTypesLibrary(object):
-
- def __init__(self, backend, cdll):
- self.backend = backend
- self.cdll = cdll
-
- def load_function(self, BType, name):
- c_func = getattr(self.cdll, name)
- funcobj = BType._from_ctypes(c_func)
- funcobj._name = name
- return funcobj
-
- def read_variable(self, BType, name):
- try:
- ctypes_obj = BType._ctype.in_dll(self.cdll, name)
- except AttributeError as e:
- raise NotImplementedError(e)
- return BType._from_ctypes(ctypes_obj)
-
- def write_variable(self, BType, name, value):
- new_ctypes_obj = BType._to_ctypes(value)
- ctypes_obj = BType._ctype.in_dll(self.cdll, name)
- ctypes.memmove(ctypes.addressof(ctypes_obj),
- ctypes.addressof(new_ctypes_obj),
- ctypes.sizeof(BType._ctype))
diff --git a/resources/python/bin/3.7/linux/cffi/cffi_opcode.py b/resources/python/bin/3.7/linux/cffi/cffi_opcode.py
deleted file mode 100644
index a0df98d1c..000000000
--- a/resources/python/bin/3.7/linux/cffi/cffi_opcode.py
+++ /dev/null
@@ -1,187 +0,0 @@
-from .error import VerificationError
-
-class CffiOp(object):
- def __init__(self, op, arg):
- self.op = op
- self.arg = arg
-
- def as_c_expr(self):
- if self.op is None:
- assert isinstance(self.arg, str)
- return '(_cffi_opcode_t)(%s)' % (self.arg,)
- classname = CLASS_NAME[self.op]
- return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg)
-
- def as_python_bytes(self):
- if self.op is None and self.arg.isdigit():
- value = int(self.arg) # non-negative: '-' not in self.arg
- if value >= 2**31:
- raise OverflowError("cannot emit %r: limited to 2**31-1"
- % (self.arg,))
- return format_four_bytes(value)
- if isinstance(self.arg, str):
- raise VerificationError("cannot emit to Python: %r" % (self.arg,))
- return format_four_bytes((self.arg << 8) | self.op)
-
- def __str__(self):
- classname = CLASS_NAME.get(self.op, self.op)
- return '(%s %s)' % (classname, self.arg)
-
-def format_four_bytes(num):
- return '\\x%02X\\x%02X\\x%02X\\x%02X' % (
- (num >> 24) & 0xFF,
- (num >> 16) & 0xFF,
- (num >> 8) & 0xFF,
- (num ) & 0xFF)
-
-OP_PRIMITIVE = 1
-OP_POINTER = 3
-OP_ARRAY = 5
-OP_OPEN_ARRAY = 7
-OP_STRUCT_UNION = 9
-OP_ENUM = 11
-OP_FUNCTION = 13
-OP_FUNCTION_END = 15
-OP_NOOP = 17
-OP_BITFIELD = 19
-OP_TYPENAME = 21
-OP_CPYTHON_BLTN_V = 23 # varargs
-OP_CPYTHON_BLTN_N = 25 # noargs
-OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg)
-OP_CONSTANT = 29
-OP_CONSTANT_INT = 31
-OP_GLOBAL_VAR = 33
-OP_DLOPEN_FUNC = 35
-OP_DLOPEN_CONST = 37
-OP_GLOBAL_VAR_F = 39
-OP_EXTERN_PYTHON = 41
-
-PRIM_VOID = 0
-PRIM_BOOL = 1
-PRIM_CHAR = 2
-PRIM_SCHAR = 3
-PRIM_UCHAR = 4
-PRIM_SHORT = 5
-PRIM_USHORT = 6
-PRIM_INT = 7
-PRIM_UINT = 8
-PRIM_LONG = 9
-PRIM_ULONG = 10
-PRIM_LONGLONG = 11
-PRIM_ULONGLONG = 12
-PRIM_FLOAT = 13
-PRIM_DOUBLE = 14
-PRIM_LONGDOUBLE = 15
-
-PRIM_WCHAR = 16
-PRIM_INT8 = 17
-PRIM_UINT8 = 18
-PRIM_INT16 = 19
-PRIM_UINT16 = 20
-PRIM_INT32 = 21
-PRIM_UINT32 = 22
-PRIM_INT64 = 23
-PRIM_UINT64 = 24
-PRIM_INTPTR = 25
-PRIM_UINTPTR = 26
-PRIM_PTRDIFF = 27
-PRIM_SIZE = 28
-PRIM_SSIZE = 29
-PRIM_INT_LEAST8 = 30
-PRIM_UINT_LEAST8 = 31
-PRIM_INT_LEAST16 = 32
-PRIM_UINT_LEAST16 = 33
-PRIM_INT_LEAST32 = 34
-PRIM_UINT_LEAST32 = 35
-PRIM_INT_LEAST64 = 36
-PRIM_UINT_LEAST64 = 37
-PRIM_INT_FAST8 = 38
-PRIM_UINT_FAST8 = 39
-PRIM_INT_FAST16 = 40
-PRIM_UINT_FAST16 = 41
-PRIM_INT_FAST32 = 42
-PRIM_UINT_FAST32 = 43
-PRIM_INT_FAST64 = 44
-PRIM_UINT_FAST64 = 45
-PRIM_INTMAX = 46
-PRIM_UINTMAX = 47
-PRIM_FLOATCOMPLEX = 48
-PRIM_DOUBLECOMPLEX = 49
-PRIM_CHAR16 = 50
-PRIM_CHAR32 = 51
-
-_NUM_PRIM = 52
-_UNKNOWN_PRIM = -1
-_UNKNOWN_FLOAT_PRIM = -2
-_UNKNOWN_LONG_DOUBLE = -3
-
-_IO_FILE_STRUCT = -1
-
-PRIMITIVE_TO_INDEX = {
- 'char': PRIM_CHAR,
- 'short': PRIM_SHORT,
- 'int': PRIM_INT,
- 'long': PRIM_LONG,
- 'long long': PRIM_LONGLONG,
- 'signed char': PRIM_SCHAR,
- 'unsigned char': PRIM_UCHAR,
- 'unsigned short': PRIM_USHORT,
- 'unsigned int': PRIM_UINT,
- 'unsigned long': PRIM_ULONG,
- 'unsigned long long': PRIM_ULONGLONG,
- 'float': PRIM_FLOAT,
- 'double': PRIM_DOUBLE,
- 'long double': PRIM_LONGDOUBLE,
- 'float _Complex': PRIM_FLOATCOMPLEX,
- 'double _Complex': PRIM_DOUBLECOMPLEX,
- '_Bool': PRIM_BOOL,
- 'wchar_t': PRIM_WCHAR,
- 'char16_t': PRIM_CHAR16,
- 'char32_t': PRIM_CHAR32,
- 'int8_t': PRIM_INT8,
- 'uint8_t': PRIM_UINT8,
- 'int16_t': PRIM_INT16,
- 'uint16_t': PRIM_UINT16,
- 'int32_t': PRIM_INT32,
- 'uint32_t': PRIM_UINT32,
- 'int64_t': PRIM_INT64,
- 'uint64_t': PRIM_UINT64,
- 'intptr_t': PRIM_INTPTR,
- 'uintptr_t': PRIM_UINTPTR,
- 'ptrdiff_t': PRIM_PTRDIFF,
- 'size_t': PRIM_SIZE,
- 'ssize_t': PRIM_SSIZE,
- 'int_least8_t': PRIM_INT_LEAST8,
- 'uint_least8_t': PRIM_UINT_LEAST8,
- 'int_least16_t': PRIM_INT_LEAST16,
- 'uint_least16_t': PRIM_UINT_LEAST16,
- 'int_least32_t': PRIM_INT_LEAST32,
- 'uint_least32_t': PRIM_UINT_LEAST32,
- 'int_least64_t': PRIM_INT_LEAST64,
- 'uint_least64_t': PRIM_UINT_LEAST64,
- 'int_fast8_t': PRIM_INT_FAST8,
- 'uint_fast8_t': PRIM_UINT_FAST8,
- 'int_fast16_t': PRIM_INT_FAST16,
- 'uint_fast16_t': PRIM_UINT_FAST16,
- 'int_fast32_t': PRIM_INT_FAST32,
- 'uint_fast32_t': PRIM_UINT_FAST32,
- 'int_fast64_t': PRIM_INT_FAST64,
- 'uint_fast64_t': PRIM_UINT_FAST64,
- 'intmax_t': PRIM_INTMAX,
- 'uintmax_t': PRIM_UINTMAX,
- }
-
-F_UNION = 0x01
-F_CHECK_FIELDS = 0x02
-F_PACKED = 0x04
-F_EXTERNAL = 0x08
-F_OPAQUE = 0x10
-
-G_FLAGS = dict([('_CFFI_' + _key, globals()[_key])
- for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED',
- 'F_EXTERNAL', 'F_OPAQUE']])
-
-CLASS_NAME = {}
-for _name, _value in list(globals().items()):
- if _name.startswith('OP_') and isinstance(_value, int):
- CLASS_NAME[_value] = _name[3:]
diff --git a/resources/python/bin/3.7/linux/cffi/commontypes.py b/resources/python/bin/3.7/linux/cffi/commontypes.py
deleted file mode 100644
index 8ec97c756..000000000
--- a/resources/python/bin/3.7/linux/cffi/commontypes.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import sys
-from . import model
-from .error import FFIError
-
-
-COMMON_TYPES = {}
-
-try:
- # fetch "bool" and all simple Windows types
- from _cffi_backend import _get_common_types
- _get_common_types(COMMON_TYPES)
-except ImportError:
- pass
-
-COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE')
-COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above
-
-for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES:
- if _type.endswith('_t'):
- COMMON_TYPES[_type] = _type
-del _type
-
-_CACHE = {}
-
-def resolve_common_type(parser, commontype):
- try:
- return _CACHE[commontype]
- except KeyError:
- cdecl = COMMON_TYPES.get(commontype, commontype)
- if not isinstance(cdecl, str):
- result, quals = cdecl, 0 # cdecl is already a BaseType
- elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES:
- result, quals = model.PrimitiveType(cdecl), 0
- elif cdecl == 'set-unicode-needed':
- raise FFIError("The Windows type %r is only available after "
- "you call ffi.set_unicode()" % (commontype,))
- else:
- if commontype == cdecl:
- raise FFIError(
- "Unsupported type: %r. Please look at "
- "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations "
- "and file an issue if you think this type should really "
- "be supported." % (commontype,))
- result, quals = parser.parse_type_and_quals(cdecl) # recursive
-
- assert isinstance(result, model.BaseTypeByIdentity)
- _CACHE[commontype] = result, quals
- return result, quals
-
-
-# ____________________________________________________________
-# extra types for Windows (most of them are in commontypes.c)
-
-
-def win_common_types():
- return {
- "UNICODE_STRING": model.StructType(
- "_UNICODE_STRING",
- ["Length",
- "MaximumLength",
- "Buffer"],
- [model.PrimitiveType("unsigned short"),
- model.PrimitiveType("unsigned short"),
- model.PointerType(model.PrimitiveType("wchar_t"))],
- [-1, -1, -1]),
- "PUNICODE_STRING": "UNICODE_STRING *",
- "PCUNICODE_STRING": "const UNICODE_STRING *",
-
- "TBYTE": "set-unicode-needed",
- "TCHAR": "set-unicode-needed",
- "LPCTSTR": "set-unicode-needed",
- "PCTSTR": "set-unicode-needed",
- "LPTSTR": "set-unicode-needed",
- "PTSTR": "set-unicode-needed",
- "PTBYTE": "set-unicode-needed",
- "PTCHAR": "set-unicode-needed",
- }
-
-if sys.platform == 'win32':
- COMMON_TYPES.update(win_common_types())
diff --git a/resources/python/bin/3.7/linux/cffi/cparser.py b/resources/python/bin/3.7/linux/cffi/cparser.py
deleted file mode 100644
index 74830e913..000000000
--- a/resources/python/bin/3.7/linux/cffi/cparser.py
+++ /dev/null
@@ -1,1006 +0,0 @@
-from . import model
-from .commontypes import COMMON_TYPES, resolve_common_type
-from .error import FFIError, CDefError
-try:
- from . import _pycparser as pycparser
-except ImportError:
- import pycparser
-import weakref, re, sys
-
-try:
- if sys.version_info < (3,):
- import thread as _thread
- else:
- import _thread
- lock = _thread.allocate_lock()
-except ImportError:
- lock = None
-
-def _workaround_for_static_import_finders():
- # Issue #392: packaging tools like cx_Freeze can not find these
- # because pycparser uses exec dynamic import. This is an obscure
- # workaround. This function is never called.
- import pycparser.yacctab
- import pycparser.lextab
-
-CDEF_SOURCE_STRING = ""
-_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$",
- re.DOTALL | re.MULTILINE)
-_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)"
- r"\b((?:[^\n\\]|\\.)*?)$",
- re.DOTALL | re.MULTILINE)
-_r_line_directive = re.compile(r"^[ \t]*#[ \t]*(?:line|\d+)\b.*$", re.MULTILINE)
-_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}")
-_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$")
-_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]")
-_r_words = re.compile(r"\w+|\S")
-_parser_cache = None
-_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE)
-_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b")
-_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b")
-_r_cdecl = re.compile(r"\b__cdecl\b")
-_r_extern_python = re.compile(r'\bextern\s*"'
- r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.')
-_r_star_const_space = re.compile( # matches "* const "
- r"[*]\s*((const|volatile|restrict)\b\s*)+")
-_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+"
- r"\.\.\.")
-_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.")
-
-def _get_parser():
- global _parser_cache
- if _parser_cache is None:
- _parser_cache = pycparser.CParser()
- return _parser_cache
-
-def _workaround_for_old_pycparser(csource):
- # Workaround for a pycparser issue (fixed between pycparser 2.10 and
- # 2.14): "char*const***" gives us a wrong syntax tree, the same as
- # for "char***(*const)". This means we can't tell the difference
- # afterwards. But "char(*const(***))" gives us the right syntax
- # tree. The issue only occurs if there are several stars in
- # sequence with no parenthesis inbetween, just possibly qualifiers.
- # Attempt to fix it by adding some parentheses in the source: each
- # time we see "* const" or "* const *", we add an opening
- # parenthesis before each star---the hard part is figuring out where
- # to close them.
- parts = []
- while True:
- match = _r_star_const_space.search(csource)
- if not match:
- break
- #print repr(''.join(parts)+csource), '=>',
- parts.append(csource[:match.start()])
- parts.append('('); closing = ')'
- parts.append(match.group()) # e.g. "* const "
- endpos = match.end()
- if csource.startswith('*', endpos):
- parts.append('('); closing += ')'
- level = 0
- i = endpos
- while i < len(csource):
- c = csource[i]
- if c == '(':
- level += 1
- elif c == ')':
- if level == 0:
- break
- level -= 1
- elif c in ',;=':
- if level == 0:
- break
- i += 1
- csource = csource[endpos:i] + closing + csource[i:]
- #print repr(''.join(parts)+csource)
- parts.append(csource)
- return ''.join(parts)
-
-def _preprocess_extern_python(csource):
- # input: `extern "Python" int foo(int);` or
- # `extern "Python" { int foo(int); }`
- # output:
- # void __cffi_extern_python_start;
- # int foo(int);
- # void __cffi_extern_python_stop;
- #
- # input: `extern "Python+C" int foo(int);`
- # output:
- # void __cffi_extern_python_plus_c_start;
- # int foo(int);
- # void __cffi_extern_python_stop;
- parts = []
- while True:
- match = _r_extern_python.search(csource)
- if not match:
- break
- endpos = match.end() - 1
- #print
- #print ''.join(parts)+csource
- #print '=>'
- parts.append(csource[:match.start()])
- if 'C' in match.group(1):
- parts.append('void __cffi_extern_python_plus_c_start; ')
- else:
- parts.append('void __cffi_extern_python_start; ')
- if csource[endpos] == '{':
- # grouping variant
- closing = csource.find('}', endpos)
- if closing < 0:
- raise CDefError("'extern \"Python\" {': no '}' found")
- if csource.find('{', endpos + 1, closing) >= 0:
- raise NotImplementedError("cannot use { } inside a block "
- "'extern \"Python\" { ... }'")
- parts.append(csource[endpos+1:closing])
- csource = csource[closing+1:]
- else:
- # non-grouping variant
- semicolon = csource.find(';', endpos)
- if semicolon < 0:
- raise CDefError("'extern \"Python\": no ';' found")
- parts.append(csource[endpos:semicolon+1])
- csource = csource[semicolon+1:]
- parts.append(' void __cffi_extern_python_stop;')
- #print ''.join(parts)+csource
- #print
- parts.append(csource)
- return ''.join(parts)
-
-def _warn_for_string_literal(csource):
- if '"' not in csource:
- return
- for line in csource.splitlines():
- if '"' in line and not line.lstrip().startswith('#'):
- import warnings
- warnings.warn("String literal found in cdef() or type source. "
- "String literals are ignored here, but you should "
- "remove them anyway because some character sequences "
- "confuse pre-parsing.")
- break
-
-def _warn_for_non_extern_non_static_global_variable(decl):
- if not decl.storage:
- import warnings
- warnings.warn("Global variable '%s' in cdef(): for consistency "
- "with C it should have a storage class specifier "
- "(usually 'extern')" % (decl.name,))
-
-def _remove_line_directives(csource):
- # _r_line_directive matches whole lines, without the final \n, if they
- # start with '#line' with some spacing allowed, or '#NUMBER'. This
- # function stores them away and replaces them with exactly the string
- # '#line@N', where N is the index in the list 'line_directives'.
- line_directives = []
- def replace(m):
- i = len(line_directives)
- line_directives.append(m.group())
- return '#line@%d' % i
- csource = _r_line_directive.sub(replace, csource)
- return csource, line_directives
-
-def _put_back_line_directives(csource, line_directives):
- def replace(m):
- s = m.group()
- if not s.startswith('#line@'):
- raise AssertionError("unexpected #line directive "
- "(should have been processed and removed")
- return line_directives[int(s[6:])]
- return _r_line_directive.sub(replace, csource)
-
-def _preprocess(csource):
- # First, remove the lines of the form '#line N "filename"' because
- # the "filename" part could confuse the rest
- csource, line_directives = _remove_line_directives(csource)
- # Remove comments. NOTE: this only work because the cdef() section
- # should not contain any string literals (except in line directives)!
- def replace_keeping_newlines(m):
- return ' ' + m.group().count('\n') * '\n'
- csource = _r_comment.sub(replace_keeping_newlines, csource)
- # Remove the "#define FOO x" lines
- macros = {}
- for match in _r_define.finditer(csource):
- macroname, macrovalue = match.groups()
- macrovalue = macrovalue.replace('\\\n', '').strip()
- macros[macroname] = macrovalue
- csource = _r_define.sub('', csource)
- #
- if pycparser.__version__ < '2.14':
- csource = _workaround_for_old_pycparser(csource)
- #
- # BIG HACK: replace WINAPI or __stdcall with "volatile const".
- # It doesn't make sense for the return type of a function to be
- # "volatile volatile const", so we abuse it to detect __stdcall...
- # Hack number 2 is that "int(volatile *fptr)();" is not valid C
- # syntax, so we place the "volatile" before the opening parenthesis.
- csource = _r_stdcall2.sub(' volatile volatile const(', csource)
- csource = _r_stdcall1.sub(' volatile volatile const ', csource)
- csource = _r_cdecl.sub(' ', csource)
- #
- # Replace `extern "Python"` with start/end markers
- csource = _preprocess_extern_python(csource)
- #
- # Now there should not be any string literal left; warn if we get one
- _warn_for_string_literal(csource)
- #
- # Replace "[...]" with "[__dotdotdotarray__]"
- csource = _r_partial_array.sub('[__dotdotdotarray__]', csource)
- #
- # Replace "...}" with "__dotdotdotNUM__}". This construction should
- # occur only at the end of enums; at the end of structs we have "...;}"
- # and at the end of vararg functions "...);". Also replace "=...[,}]"
- # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when
- # giving an unknown value.
- matches = list(_r_partial_enum.finditer(csource))
- for number, match in enumerate(reversed(matches)):
- p = match.start()
- if csource[p] == '=':
- p2 = csource.find('...', p, match.end())
- assert p2 > p
- csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number,
- csource[p2+3:])
- else:
- assert csource[p:p+3] == '...'
- csource = '%s __dotdotdot%d__ %s' % (csource[:p], number,
- csource[p+3:])
- # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__"
- csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource)
- # Replace "float ..." or "double..." with "__dotdotdotfloat__"
- csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource)
- # Replace all remaining "..." with the same name, "__dotdotdot__",
- # which is declared with a typedef for the purpose of C parsing.
- csource = csource.replace('...', ' __dotdotdot__ ')
- # Finally, put back the line directives
- csource = _put_back_line_directives(csource, line_directives)
- return csource, macros
-
-def _common_type_names(csource):
- # Look in the source for what looks like usages of types from the
- # list of common types. A "usage" is approximated here as the
- # appearance of the word, minus a "definition" of the type, which
- # is the last word in a "typedef" statement. Approximative only
- # but should be fine for all the common types.
- look_for_words = set(COMMON_TYPES)
- look_for_words.add(';')
- look_for_words.add(',')
- look_for_words.add('(')
- look_for_words.add(')')
- look_for_words.add('typedef')
- words_used = set()
- is_typedef = False
- paren = 0
- previous_word = ''
- for word in _r_words.findall(csource):
- if word in look_for_words:
- if word == ';':
- if is_typedef:
- words_used.discard(previous_word)
- look_for_words.discard(previous_word)
- is_typedef = False
- elif word == 'typedef':
- is_typedef = True
- paren = 0
- elif word == '(':
- paren += 1
- elif word == ')':
- paren -= 1
- elif word == ',':
- if is_typedef and paren == 0:
- words_used.discard(previous_word)
- look_for_words.discard(previous_word)
- else: # word in COMMON_TYPES
- words_used.add(word)
- previous_word = word
- return words_used
-
-
-class Parser(object):
-
- def __init__(self):
- self._declarations = {}
- self._included_declarations = set()
- self._anonymous_counter = 0
- self._structnode2type = weakref.WeakKeyDictionary()
- self._options = {}
- self._int_constants = {}
- self._recomplete = []
- self._uses_new_feature = None
-
- def _parse(self, csource):
- csource, macros = _preprocess(csource)
- # XXX: for more efficiency we would need to poke into the
- # internals of CParser... the following registers the
- # typedefs, because their presence or absence influences the
- # parsing itself (but what they are typedef'ed to plays no role)
- ctn = _common_type_names(csource)
- typenames = []
- for name in sorted(self._declarations):
- if name.startswith('typedef '):
- name = name[8:]
- typenames.append(name)
- ctn.discard(name)
- typenames += sorted(ctn)
- #
- csourcelines = []
- csourcelines.append('# 1 ""')
- for typename in typenames:
- csourcelines.append('typedef int %s;' % typename)
- csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,'
- ' __dotdotdot__;')
- # this forces pycparser to consider the following in the file
- # called from line 1
- csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,))
- csourcelines.append(csource)
- fullcsource = '\n'.join(csourcelines)
- if lock is not None:
- lock.acquire() # pycparser is not thread-safe...
- try:
- ast = _get_parser().parse(fullcsource)
- except pycparser.c_parser.ParseError as e:
- self.convert_pycparser_error(e, csource)
- finally:
- if lock is not None:
- lock.release()
- # csource will be used to find buggy source text
- return ast, macros, csource
-
- def _convert_pycparser_error(self, e, csource):
- # xxx look for ":NUM:" at the start of str(e)
- # and interpret that as a line number. This will not work if
- # the user gives explicit ``# NUM "FILE"`` directives.
- line = None
- msg = str(e)
- match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg)
- if match:
- linenum = int(match.group(1), 10)
- csourcelines = csource.splitlines()
- if 1 <= linenum <= len(csourcelines):
- line = csourcelines[linenum-1]
- return line
-
- def convert_pycparser_error(self, e, csource):
- line = self._convert_pycparser_error(e, csource)
-
- msg = str(e)
- if line:
- msg = 'cannot parse "%s"\n%s' % (line.strip(), msg)
- else:
- msg = 'parse error\n%s' % (msg,)
- raise CDefError(msg)
-
- def parse(self, csource, override=False, packed=False, pack=None,
- dllexport=False):
- if packed:
- if packed != True:
- raise ValueError("'packed' should be False or True; use "
- "'pack' to give another value")
- if pack:
- raise ValueError("cannot give both 'pack' and 'packed'")
- pack = 1
- elif pack:
- if pack & (pack - 1):
- raise ValueError("'pack' must be a power of two, not %r" %
- (pack,))
- else:
- pack = 0
- prev_options = self._options
- try:
- self._options = {'override': override,
- 'packed': pack,
- 'dllexport': dllexport}
- self._internal_parse(csource)
- finally:
- self._options = prev_options
-
- def _internal_parse(self, csource):
- ast, macros, csource = self._parse(csource)
- # add the macros
- self._process_macros(macros)
- # find the first "__dotdotdot__" and use that as a separator
- # between the repeated typedefs and the real csource
- iterator = iter(ast.ext)
- for decl in iterator:
- if decl.name == '__dotdotdot__':
- break
- else:
- assert 0
- current_decl = None
- #
- try:
- self._inside_extern_python = '__cffi_extern_python_stop'
- for decl in iterator:
- current_decl = decl
- if isinstance(decl, pycparser.c_ast.Decl):
- self._parse_decl(decl)
- elif isinstance(decl, pycparser.c_ast.Typedef):
- if not decl.name:
- raise CDefError("typedef does not declare any name",
- decl)
- quals = 0
- if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and
- decl.type.type.names[-1].startswith('__dotdotdot')):
- realtype = self._get_unknown_type(decl)
- elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and
- isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and
- isinstance(decl.type.type.type,
- pycparser.c_ast.IdentifierType) and
- decl.type.type.type.names[-1].startswith('__dotdotdot')):
- realtype = self._get_unknown_ptr_type(decl)
- else:
- realtype, quals = self._get_type_and_quals(
- decl.type, name=decl.name, partial_length_ok=True,
- typedef_example="*(%s *)0" % (decl.name,))
- self._declare('typedef ' + decl.name, realtype, quals=quals)
- elif decl.__class__.__name__ == 'Pragma':
- pass # skip pragma, only in pycparser 2.15
- else:
- raise CDefError("unexpected <%s>: this construct is valid "
- "C but not valid in cdef()" %
- decl.__class__.__name__, decl)
- except CDefError as e:
- if len(e.args) == 1:
- e.args = e.args + (current_decl,)
- raise
- except FFIError as e:
- msg = self._convert_pycparser_error(e, csource)
- if msg:
- e.args = (e.args[0] + "\n *** Err: %s" % msg,)
- raise
-
- def _add_constants(self, key, val):
- if key in self._int_constants:
- if self._int_constants[key] == val:
- return # ignore identical double declarations
- raise FFIError(
- "multiple declarations of constant: %s" % (key,))
- self._int_constants[key] = val
-
- def _add_integer_constant(self, name, int_str):
- int_str = int_str.lower().rstrip("ul")
- neg = int_str.startswith('-')
- if neg:
- int_str = int_str[1:]
- # "010" is not valid oct in py3
- if (int_str.startswith("0") and int_str != '0'
- and not int_str.startswith("0x")):
- int_str = "0o" + int_str[1:]
- pyvalue = int(int_str, 0)
- if neg:
- pyvalue = -pyvalue
- self._add_constants(name, pyvalue)
- self._declare('macro ' + name, pyvalue)
-
- def _process_macros(self, macros):
- for key, value in macros.items():
- value = value.strip()
- if _r_int_literal.match(value):
- self._add_integer_constant(key, value)
- elif value == '...':
- self._declare('macro ' + key, value)
- else:
- raise CDefError(
- 'only supports one of the following syntax:\n'
- ' #define %s ... (literally dot-dot-dot)\n'
- ' #define %s NUMBER (with NUMBER an integer'
- ' constant, decimal/hex/octal)\n'
- 'got:\n'
- ' #define %s %s'
- % (key, key, key, value))
-
- def _declare_function(self, tp, quals, decl):
- tp = self._get_type_pointer(tp, quals)
- if self._options.get('dllexport'):
- tag = 'dllexport_python '
- elif self._inside_extern_python == '__cffi_extern_python_start':
- tag = 'extern_python '
- elif self._inside_extern_python == '__cffi_extern_python_plus_c_start':
- tag = 'extern_python_plus_c '
- else:
- tag = 'function '
- self._declare(tag + decl.name, tp)
-
- def _parse_decl(self, decl):
- node = decl.type
- if isinstance(node, pycparser.c_ast.FuncDecl):
- tp, quals = self._get_type_and_quals(node, name=decl.name)
- assert isinstance(tp, model.RawFunctionType)
- self._declare_function(tp, quals, decl)
- else:
- if isinstance(node, pycparser.c_ast.Struct):
- self._get_struct_union_enum_type('struct', node)
- elif isinstance(node, pycparser.c_ast.Union):
- self._get_struct_union_enum_type('union', node)
- elif isinstance(node, pycparser.c_ast.Enum):
- self._get_struct_union_enum_type('enum', node)
- elif not decl.name:
- raise CDefError("construct does not declare any variable",
- decl)
- #
- if decl.name:
- tp, quals = self._get_type_and_quals(node,
- partial_length_ok=True)
- if tp.is_raw_function:
- self._declare_function(tp, quals, decl)
- elif (tp.is_integer_type() and
- hasattr(decl, 'init') and
- hasattr(decl.init, 'value') and
- _r_int_literal.match(decl.init.value)):
- self._add_integer_constant(decl.name, decl.init.value)
- elif (tp.is_integer_type() and
- isinstance(decl.init, pycparser.c_ast.UnaryOp) and
- decl.init.op == '-' and
- hasattr(decl.init.expr, 'value') and
- _r_int_literal.match(decl.init.expr.value)):
- self._add_integer_constant(decl.name,
- '-' + decl.init.expr.value)
- elif (tp is model.void_type and
- decl.name.startswith('__cffi_extern_python_')):
- # hack: `extern "Python"` in the C source is replaced
- # with "void __cffi_extern_python_start;" and
- # "void __cffi_extern_python_stop;"
- self._inside_extern_python = decl.name
- else:
- if self._inside_extern_python !='__cffi_extern_python_stop':
- raise CDefError(
- "cannot declare constants or "
- "variables with 'extern \"Python\"'")
- if (quals & model.Q_CONST) and not tp.is_array_type:
- self._declare('constant ' + decl.name, tp, quals=quals)
- else:
- _warn_for_non_extern_non_static_global_variable(decl)
- self._declare('variable ' + decl.name, tp, quals=quals)
-
- def parse_type(self, cdecl):
- return self.parse_type_and_quals(cdecl)[0]
-
- def parse_type_and_quals(self, cdecl):
- ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2]
- assert not macros
- exprnode = ast.ext[-1].type.args.params[0]
- if isinstance(exprnode, pycparser.c_ast.ID):
- raise CDefError("unknown identifier '%s'" % (exprnode.name,))
- return self._get_type_and_quals(exprnode.type)
-
- def _declare(self, name, obj, included=False, quals=0):
- if name in self._declarations:
- prevobj, prevquals = self._declarations[name]
- if prevobj is obj and prevquals == quals:
- return
- if not self._options.get('override'):
- raise FFIError(
- "multiple declarations of %s (for interactive usage, "
- "try cdef(xx, override=True))" % (name,))
- assert '__dotdotdot__' not in name.split()
- self._declarations[name] = (obj, quals)
- if included:
- self._included_declarations.add(obj)
-
- def _extract_quals(self, type):
- quals = 0
- if isinstance(type, (pycparser.c_ast.TypeDecl,
- pycparser.c_ast.PtrDecl)):
- if 'const' in type.quals:
- quals |= model.Q_CONST
- if 'volatile' in type.quals:
- quals |= model.Q_VOLATILE
- if 'restrict' in type.quals:
- quals |= model.Q_RESTRICT
- return quals
-
- def _get_type_pointer(self, type, quals, declname=None):
- if isinstance(type, model.RawFunctionType):
- return type.as_function_pointer()
- if (isinstance(type, model.StructOrUnionOrEnum) and
- type.name.startswith('$') and type.name[1:].isdigit() and
- type.forcename is None and declname is not None):
- return model.NamedPointerType(type, declname, quals)
- return model.PointerType(type, quals)
-
- def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False,
- typedef_example=None):
- # first, dereference typedefs, if we have it already parsed, we're good
- if (isinstance(typenode, pycparser.c_ast.TypeDecl) and
- isinstance(typenode.type, pycparser.c_ast.IdentifierType) and
- len(typenode.type.names) == 1 and
- ('typedef ' + typenode.type.names[0]) in self._declarations):
- tp, quals = self._declarations['typedef ' + typenode.type.names[0]]
- quals |= self._extract_quals(typenode)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.ArrayDecl):
- # array type
- if typenode.dim is None:
- length = None
- else:
- length = self._parse_constant(
- typenode.dim, partial_length_ok=partial_length_ok)
- # a hack: in 'typedef int foo_t[...][...];', don't use '...' as
- # the length but use directly the C expression that would be
- # generated by recompiler.py. This lets the typedef be used in
- # many more places within recompiler.py
- if typedef_example is not None:
- if length == '...':
- length = '_cffi_array_len(%s)' % (typedef_example,)
- typedef_example = "*" + typedef_example
- #
- tp, quals = self._get_type_and_quals(typenode.type,
- partial_length_ok=partial_length_ok,
- typedef_example=typedef_example)
- return model.ArrayType(tp, length), quals
- #
- if isinstance(typenode, pycparser.c_ast.PtrDecl):
- # pointer type
- itemtype, itemquals = self._get_type_and_quals(typenode.type)
- tp = self._get_type_pointer(itemtype, itemquals, declname=name)
- quals = self._extract_quals(typenode)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.TypeDecl):
- quals = self._extract_quals(typenode)
- type = typenode.type
- if isinstance(type, pycparser.c_ast.IdentifierType):
- # assume a primitive type. get it from .names, but reduce
- # synonyms to a single chosen combination
- names = list(type.names)
- if names != ['signed', 'char']: # keep this unmodified
- prefixes = {}
- while names:
- name = names[0]
- if name in ('short', 'long', 'signed', 'unsigned'):
- prefixes[name] = prefixes.get(name, 0) + 1
- del names[0]
- else:
- break
- # ignore the 'signed' prefix below, and reorder the others
- newnames = []
- for prefix in ('unsigned', 'short', 'long'):
- for i in range(prefixes.get(prefix, 0)):
- newnames.append(prefix)
- if not names:
- names = ['int'] # implicitly
- if names == ['int']: # but kill it if 'short' or 'long'
- if 'short' in prefixes or 'long' in prefixes:
- names = []
- names = newnames + names
- ident = ' '.join(names)
- if ident == 'void':
- return model.void_type, quals
- if ident == '__dotdotdot__':
- raise FFIError(':%d: bad usage of "..."' %
- typenode.coord.line)
- tp0, quals0 = resolve_common_type(self, ident)
- return tp0, (quals | quals0)
- #
- if isinstance(type, pycparser.c_ast.Struct):
- # 'struct foobar'
- tp = self._get_struct_union_enum_type('struct', type, name)
- return tp, quals
- #
- if isinstance(type, pycparser.c_ast.Union):
- # 'union foobar'
- tp = self._get_struct_union_enum_type('union', type, name)
- return tp, quals
- #
- if isinstance(type, pycparser.c_ast.Enum):
- # 'enum foobar'
- tp = self._get_struct_union_enum_type('enum', type, name)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.FuncDecl):
- # a function type
- return self._parse_function_type(typenode, name), 0
- #
- # nested anonymous structs or unions end up here
- if isinstance(typenode, pycparser.c_ast.Struct):
- return self._get_struct_union_enum_type('struct', typenode, name,
- nested=True), 0
- if isinstance(typenode, pycparser.c_ast.Union):
- return self._get_struct_union_enum_type('union', typenode, name,
- nested=True), 0
- #
- raise FFIError(":%d: bad or unsupported type declaration" %
- typenode.coord.line)
-
- def _parse_function_type(self, typenode, funcname=None):
- params = list(getattr(typenode.args, 'params', []))
- for i, arg in enumerate(params):
- if not hasattr(arg, 'type'):
- raise CDefError("%s arg %d: unknown type '%s'"
- " (if you meant to use the old C syntax of giving"
- " untyped arguments, it is not supported)"
- % (funcname or 'in expression', i + 1,
- getattr(arg, 'name', '?')))
- ellipsis = (
- len(params) > 0 and
- isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and
- isinstance(params[-1].type.type,
- pycparser.c_ast.IdentifierType) and
- params[-1].type.type.names == ['__dotdotdot__'])
- if ellipsis:
- params.pop()
- if not params:
- raise CDefError(
- "%s: a function with only '(...)' as argument"
- " is not correct C" % (funcname or 'in expression'))
- args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type))
- for argdeclnode in params]
- if not ellipsis and args == [model.void_type]:
- args = []
- result, quals = self._get_type_and_quals(typenode.type)
- # the 'quals' on the result type are ignored. HACK: we absure them
- # to detect __stdcall functions: we textually replace "__stdcall"
- # with "volatile volatile const" above.
- abi = None
- if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway
- if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']:
- abi = '__stdcall'
- return model.RawFunctionType(tuple(args), result, ellipsis, abi)
-
- def _as_func_arg(self, type, quals):
- if isinstance(type, model.ArrayType):
- return model.PointerType(type.item, quals)
- elif isinstance(type, model.RawFunctionType):
- return type.as_function_pointer()
- else:
- return type
-
- def _get_struct_union_enum_type(self, kind, type, name=None, nested=False):
- # First, a level of caching on the exact 'type' node of the AST.
- # This is obscure, but needed because pycparser "unrolls" declarations
- # such as "typedef struct { } foo_t, *foo_p" and we end up with
- # an AST that is not a tree, but a DAG, with the "type" node of the
- # two branches foo_t and foo_p of the trees being the same node.
- # It's a bit silly but detecting "DAG-ness" in the AST tree seems
- # to be the only way to distinguish this case from two independent
- # structs. See test_struct_with_two_usages.
- try:
- return self._structnode2type[type]
- except KeyError:
- pass
- #
- # Note that this must handle parsing "struct foo" any number of
- # times and always return the same StructType object. Additionally,
- # one of these times (not necessarily the first), the fields of
- # the struct can be specified with "struct foo { ...fields... }".
- # If no name is given, then we have to create a new anonymous struct
- # with no caching; in this case, the fields are either specified
- # right now or never.
- #
- force_name = name
- name = type.name
- #
- # get the type or create it if needed
- if name is None:
- # 'force_name' is used to guess a more readable name for
- # anonymous structs, for the common case "typedef struct { } foo".
- if force_name is not None:
- explicit_name = '$%s' % force_name
- else:
- self._anonymous_counter += 1
- explicit_name = '$%d' % self._anonymous_counter
- tp = None
- else:
- explicit_name = name
- key = '%s %s' % (kind, name)
- tp, _ = self._declarations.get(key, (None, None))
- #
- if tp is None:
- if kind == 'struct':
- tp = model.StructType(explicit_name, None, None, None)
- elif kind == 'union':
- tp = model.UnionType(explicit_name, None, None, None)
- elif kind == 'enum':
- if explicit_name == '__dotdotdot__':
- raise CDefError("Enums cannot be declared with ...")
- tp = self._build_enum_type(explicit_name, type.values)
- else:
- raise AssertionError("kind = %r" % (kind,))
- if name is not None:
- self._declare(key, tp)
- else:
- if kind == 'enum' and type.values is not None:
- raise NotImplementedError(
- "enum %s: the '{}' declaration should appear on the first "
- "time the enum is mentioned, not later" % explicit_name)
- if not tp.forcename:
- tp.force_the_name(force_name)
- if tp.forcename and '$' in tp.name:
- self._declare('anonymous %s' % tp.forcename, tp)
- #
- self._structnode2type[type] = tp
- #
- # enums: done here
- if kind == 'enum':
- return tp
- #
- # is there a 'type.decls'? If yes, then this is the place in the
- # C sources that declare the fields. If no, then just return the
- # existing type, possibly still incomplete.
- if type.decls is None:
- return tp
- #
- if tp.fldnames is not None:
- raise CDefError("duplicate declaration of struct %s" % name)
- fldnames = []
- fldtypes = []
- fldbitsize = []
- fldquals = []
- for decl in type.decls:
- if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and
- ''.join(decl.type.names) == '__dotdotdot__'):
- # XXX pycparser is inconsistent: 'names' should be a list
- # of strings, but is sometimes just one string. Use
- # str.join() as a way to cope with both.
- self._make_partial(tp, nested)
- continue
- if decl.bitsize is None:
- bitsize = -1
- else:
- bitsize = self._parse_constant(decl.bitsize)
- self._partial_length = False
- type, fqual = self._get_type_and_quals(decl.type,
- partial_length_ok=True)
- if self._partial_length:
- self._make_partial(tp, nested)
- if isinstance(type, model.StructType) and type.partial:
- self._make_partial(tp, nested)
- fldnames.append(decl.name or '')
- fldtypes.append(type)
- fldbitsize.append(bitsize)
- fldquals.append(fqual)
- tp.fldnames = tuple(fldnames)
- tp.fldtypes = tuple(fldtypes)
- tp.fldbitsize = tuple(fldbitsize)
- tp.fldquals = tuple(fldquals)
- if fldbitsize != [-1] * len(fldbitsize):
- if isinstance(tp, model.StructType) and tp.partial:
- raise NotImplementedError("%s: using both bitfields and '...;'"
- % (tp,))
- tp.packed = self._options.get('packed')
- if tp.completed: # must be re-completed: it is not opaque any more
- tp.completed = 0
- self._recomplete.append(tp)
- return tp
-
- def _make_partial(self, tp, nested):
- if not isinstance(tp, model.StructOrUnion):
- raise CDefError("%s cannot be partial" % (tp,))
- if not tp.has_c_name() and not nested:
- raise NotImplementedError("%s is partial but has no C name" %(tp,))
- tp.partial = True
-
- def _parse_constant(self, exprnode, partial_length_ok=False):
- # for now, limited to expressions that are an immediate number
- # or positive/negative number
- if isinstance(exprnode, pycparser.c_ast.Constant):
- s = exprnode.value
- if '0' <= s[0] <= '9':
- s = s.rstrip('uUlL')
- try:
- if s.startswith('0'):
- return int(s, 8)
- else:
- return int(s, 10)
- except ValueError:
- if len(s) > 1:
- if s.lower()[0:2] == '0x':
- return int(s, 16)
- elif s.lower()[0:2] == '0b':
- return int(s, 2)
- raise CDefError("invalid constant %r" % (s,))
- elif s[0] == "'" and s[-1] == "'" and (
- len(s) == 3 or (len(s) == 4 and s[1] == "\\")):
- return ord(s[-2])
- else:
- raise CDefError("invalid constant %r" % (s,))
- #
- if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and
- exprnode.op == '+'):
- return self._parse_constant(exprnode.expr)
- #
- if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and
- exprnode.op == '-'):
- return -self._parse_constant(exprnode.expr)
- # load previously defined int constant
- if (isinstance(exprnode, pycparser.c_ast.ID) and
- exprnode.name in self._int_constants):
- return self._int_constants[exprnode.name]
- #
- if (isinstance(exprnode, pycparser.c_ast.ID) and
- exprnode.name == '__dotdotdotarray__'):
- if partial_length_ok:
- self._partial_length = True
- return '...'
- raise FFIError(":%d: unsupported '[...]' here, cannot derive "
- "the actual array length in this context"
- % exprnode.coord.line)
- #
- if isinstance(exprnode, pycparser.c_ast.BinaryOp):
- left = self._parse_constant(exprnode.left)
- right = self._parse_constant(exprnode.right)
- if exprnode.op == '+':
- return left + right
- elif exprnode.op == '-':
- return left - right
- elif exprnode.op == '*':
- return left * right
- elif exprnode.op == '/':
- return self._c_div(left, right)
- elif exprnode.op == '%':
- return left - self._c_div(left, right) * right
- elif exprnode.op == '<<':
- return left << right
- elif exprnode.op == '>>':
- return left >> right
- elif exprnode.op == '&':
- return left & right
- elif exprnode.op == '|':
- return left | right
- elif exprnode.op == '^':
- return left ^ right
- #
- raise FFIError(":%d: unsupported expression: expected a "
- "simple numeric constant" % exprnode.coord.line)
-
- def _c_div(self, a, b):
- result = a // b
- if ((a < 0) ^ (b < 0)) and (a % b) != 0:
- result += 1
- return result
-
- def _build_enum_type(self, explicit_name, decls):
- if decls is not None:
- partial = False
- enumerators = []
- enumvalues = []
- nextenumvalue = 0
- for enum in decls.enumerators:
- if _r_enum_dotdotdot.match(enum.name):
- partial = True
- continue
- if enum.value is not None:
- nextenumvalue = self._parse_constant(enum.value)
- enumerators.append(enum.name)
- enumvalues.append(nextenumvalue)
- self._add_constants(enum.name, nextenumvalue)
- nextenumvalue += 1
- enumerators = tuple(enumerators)
- enumvalues = tuple(enumvalues)
- tp = model.EnumType(explicit_name, enumerators, enumvalues)
- tp.partial = partial
- else: # opaque enum
- tp = model.EnumType(explicit_name, (), ())
- return tp
-
- def include(self, other):
- for name, (tp, quals) in other._declarations.items():
- if name.startswith('anonymous $enum_$'):
- continue # fix for test_anonymous_enum_include
- kind = name.split(' ', 1)[0]
- if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'):
- self._declare(name, tp, included=True, quals=quals)
- for k, v in other._int_constants.items():
- self._add_constants(k, v)
-
- def _get_unknown_type(self, decl):
- typenames = decl.type.type.names
- if typenames == ['__dotdotdot__']:
- return model.unknown_type(decl.name)
-
- if typenames == ['__dotdotdotint__']:
- if self._uses_new_feature is None:
- self._uses_new_feature = "'typedef int... %s'" % decl.name
- return model.UnknownIntegerType(decl.name)
-
- if typenames == ['__dotdotdotfloat__']:
- # note: not for 'long double' so far
- if self._uses_new_feature is None:
- self._uses_new_feature = "'typedef float... %s'" % decl.name
- return model.UnknownFloatType(decl.name)
-
- raise FFIError(':%d: unsupported usage of "..." in typedef'
- % decl.coord.line)
-
- def _get_unknown_ptr_type(self, decl):
- if decl.type.type.type.names == ['__dotdotdot__']:
- return model.unknown_ptr_type(decl.name)
- raise FFIError(':%d: unsupported usage of "..." in typedef'
- % decl.coord.line)
diff --git a/resources/python/bin/3.7/linux/cffi/error.py b/resources/python/bin/3.7/linux/cffi/error.py
deleted file mode 100644
index 0a27247c3..000000000
--- a/resources/python/bin/3.7/linux/cffi/error.py
+++ /dev/null
@@ -1,31 +0,0 @@
-
-class FFIError(Exception):
- __module__ = 'cffi'
-
-class CDefError(Exception):
- __module__ = 'cffi'
- def __str__(self):
- try:
- current_decl = self.args[1]
- filename = current_decl.coord.file
- linenum = current_decl.coord.line
- prefix = '%s:%d: ' % (filename, linenum)
- except (AttributeError, TypeError, IndexError):
- prefix = ''
- return '%s%s' % (prefix, self.args[0])
-
-class VerificationError(Exception):
- """ An error raised when verification fails
- """
- __module__ = 'cffi'
-
-class VerificationMissing(Exception):
- """ An error raised when incomplete structures are passed into
- cdef, but no verification has been done
- """
- __module__ = 'cffi'
-
-class PkgConfigError(Exception):
- """ An error raised for missing modules in pkg-config
- """
- __module__ = 'cffi'
diff --git a/resources/python/bin/3.7/linux/cffi/ffiplatform.py b/resources/python/bin/3.7/linux/cffi/ffiplatform.py
deleted file mode 100644
index 85313460a..000000000
--- a/resources/python/bin/3.7/linux/cffi/ffiplatform.py
+++ /dev/null
@@ -1,127 +0,0 @@
-import sys, os
-from .error import VerificationError
-
-
-LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs',
- 'extra_objects', 'depends']
-
-def get_extension(srcfilename, modname, sources=(), **kwds):
- _hack_at_distutils()
- from distutils.core import Extension
- allsources = [srcfilename]
- for src in sources:
- allsources.append(os.path.normpath(src))
- return Extension(name=modname, sources=allsources, **kwds)
-
-def compile(tmpdir, ext, compiler_verbose=0, debug=None):
- """Compile a C extension module using distutils."""
-
- _hack_at_distutils()
- saved_environ = os.environ.copy()
- try:
- outputfilename = _build(tmpdir, ext, compiler_verbose, debug)
- outputfilename = os.path.abspath(outputfilename)
- finally:
- # workaround for a distutils bugs where some env vars can
- # become longer and longer every time it is used
- for key, value in saved_environ.items():
- if os.environ.get(key) != value:
- os.environ[key] = value
- return outputfilename
-
-def _build(tmpdir, ext, compiler_verbose=0, debug=None):
- # XXX compact but horrible :-(
- from distutils.core import Distribution
- import distutils.errors, distutils.log
- #
- dist = Distribution({'ext_modules': [ext]})
- dist.parse_config_files()
- options = dist.get_option_dict('build_ext')
- if debug is None:
- debug = sys.flags.debug
- options['debug'] = ('ffiplatform', debug)
- options['force'] = ('ffiplatform', True)
- options['build_lib'] = ('ffiplatform', tmpdir)
- options['build_temp'] = ('ffiplatform', tmpdir)
- #
- try:
- old_level = distutils.log.set_threshold(0) or 0
- try:
- distutils.log.set_verbosity(compiler_verbose)
- dist.run_command('build_ext')
- cmd_obj = dist.get_command_obj('build_ext')
- [soname] = cmd_obj.get_outputs()
- finally:
- distutils.log.set_threshold(old_level)
- except (distutils.errors.CompileError,
- distutils.errors.LinkError) as e:
- raise VerificationError('%s: %s' % (e.__class__.__name__, e))
- #
- return soname
-
-try:
- from os.path import samefile
-except ImportError:
- def samefile(f1, f2):
- return os.path.abspath(f1) == os.path.abspath(f2)
-
-def maybe_relative_path(path):
- if not os.path.isabs(path):
- return path # already relative
- dir = path
- names = []
- while True:
- prevdir = dir
- dir, name = os.path.split(prevdir)
- if dir == prevdir or not dir:
- return path # failed to make it relative
- names.append(name)
- try:
- if samefile(dir, os.curdir):
- names.reverse()
- return os.path.join(*names)
- except OSError:
- pass
-
-# ____________________________________________________________
-
-try:
- int_or_long = (int, long)
- import cStringIO
-except NameError:
- int_or_long = int # Python 3
- import io as cStringIO
-
-def _flatten(x, f):
- if isinstance(x, str):
- f.write('%ds%s' % (len(x), x))
- elif isinstance(x, dict):
- keys = sorted(x.keys())
- f.write('%dd' % len(keys))
- for key in keys:
- _flatten(key, f)
- _flatten(x[key], f)
- elif isinstance(x, (list, tuple)):
- f.write('%dl' % len(x))
- for value in x:
- _flatten(value, f)
- elif isinstance(x, int_or_long):
- f.write('%di' % (x,))
- else:
- raise TypeError(
- "the keywords to verify() contains unsupported object %r" % (x,))
-
-def flatten(x):
- f = cStringIO.StringIO()
- _flatten(x, f)
- return f.getvalue()
-
-def _hack_at_distutils():
- # Windows-only workaround for some configurations: see
- # https://bugs.python.org/issue23246 (Python 2.7 with
- # a specific MS compiler suite download)
- if sys.platform == "win32":
- try:
- import setuptools # for side-effects, patches distutils
- except ImportError:
- pass
diff --git a/resources/python/bin/3.7/linux/cffi/lock.py b/resources/python/bin/3.7/linux/cffi/lock.py
deleted file mode 100644
index db91b7158..000000000
--- a/resources/python/bin/3.7/linux/cffi/lock.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import sys
-
-if sys.version_info < (3,):
- try:
- from thread import allocate_lock
- except ImportError:
- from dummy_thread import allocate_lock
-else:
- try:
- from _thread import allocate_lock
- except ImportError:
- from _dummy_thread import allocate_lock
-
-
-##import sys
-##l1 = allocate_lock
-
-##class allocate_lock(object):
-## def __init__(self):
-## self._real = l1()
-## def __enter__(self):
-## for i in range(4, 0, -1):
-## print sys._getframe(i).f_code
-## print
-## return self._real.__enter__()
-## def __exit__(self, *args):
-## return self._real.__exit__(*args)
-## def acquire(self, f):
-## assert f is False
-## return self._real.acquire(f)
diff --git a/resources/python/bin/3.7/linux/cffi/model.py b/resources/python/bin/3.7/linux/cffi/model.py
deleted file mode 100644
index ad1c17648..000000000
--- a/resources/python/bin/3.7/linux/cffi/model.py
+++ /dev/null
@@ -1,617 +0,0 @@
-import types
-import weakref
-
-from .lock import allocate_lock
-from .error import CDefError, VerificationError, VerificationMissing
-
-# type qualifiers
-Q_CONST = 0x01
-Q_RESTRICT = 0x02
-Q_VOLATILE = 0x04
-
-def qualify(quals, replace_with):
- if quals & Q_CONST:
- replace_with = ' const ' + replace_with.lstrip()
- if quals & Q_VOLATILE:
- replace_with = ' volatile ' + replace_with.lstrip()
- if quals & Q_RESTRICT:
- # It seems that __restrict is supported by gcc and msvc.
- # If you hit some different compiler, add a #define in
- # _cffi_include.h for it (and in its copies, documented there)
- replace_with = ' __restrict ' + replace_with.lstrip()
- return replace_with
-
-
-class BaseTypeByIdentity(object):
- is_array_type = False
- is_raw_function = False
-
- def get_c_name(self, replace_with='', context='a C file', quals=0):
- result = self.c_name_with_marker
- assert result.count('&') == 1
- # some logic duplication with ffi.getctype()... :-(
- replace_with = replace_with.strip()
- if replace_with:
- if replace_with.startswith('*') and '&[' in result:
- replace_with = '(%s)' % replace_with
- elif not replace_with[0] in '[(':
- replace_with = ' ' + replace_with
- replace_with = qualify(quals, replace_with)
- result = result.replace('&', replace_with)
- if '$' in result:
- raise VerificationError(
- "cannot generate '%s' in %s: unknown type name"
- % (self._get_c_name(), context))
- return result
-
- def _get_c_name(self):
- return self.c_name_with_marker.replace('&', '')
-
- def has_c_name(self):
- return '$' not in self._get_c_name()
-
- def is_integer_type(self):
- return False
-
- def get_cached_btype(self, ffi, finishlist, can_delay=False):
- try:
- BType = ffi._cached_btypes[self]
- except KeyError:
- BType = self.build_backend_type(ffi, finishlist)
- BType2 = ffi._cached_btypes.setdefault(self, BType)
- assert BType2 is BType
- return BType
-
- def __repr__(self):
- return '<%s>' % (self._get_c_name(),)
-
- def _get_items(self):
- return [(name, getattr(self, name)) for name in self._attrs_]
-
-
-class BaseType(BaseTypeByIdentity):
-
- def __eq__(self, other):
- return (self.__class__ == other.__class__ and
- self._get_items() == other._get_items())
-
- def __ne__(self, other):
- return not self == other
-
- def __hash__(self):
- return hash((self.__class__, tuple(self._get_items())))
-
-
-class VoidType(BaseType):
- _attrs_ = ()
-
- def __init__(self):
- self.c_name_with_marker = 'void&'
-
- def build_backend_type(self, ffi, finishlist):
- return global_cache(self, ffi, 'new_void_type')
-
-void_type = VoidType()
-
-
-class BasePrimitiveType(BaseType):
- def is_complex_type(self):
- return False
-
-
-class PrimitiveType(BasePrimitiveType):
- _attrs_ = ('name',)
-
- ALL_PRIMITIVE_TYPES = {
- 'char': 'c',
- 'short': 'i',
- 'int': 'i',
- 'long': 'i',
- 'long long': 'i',
- 'signed char': 'i',
- 'unsigned char': 'i',
- 'unsigned short': 'i',
- 'unsigned int': 'i',
- 'unsigned long': 'i',
- 'unsigned long long': 'i',
- 'float': 'f',
- 'double': 'f',
- 'long double': 'f',
- 'float _Complex': 'j',
- 'double _Complex': 'j',
- '_Bool': 'i',
- # the following types are not primitive in the C sense
- 'wchar_t': 'c',
- 'char16_t': 'c',
- 'char32_t': 'c',
- 'int8_t': 'i',
- 'uint8_t': 'i',
- 'int16_t': 'i',
- 'uint16_t': 'i',
- 'int32_t': 'i',
- 'uint32_t': 'i',
- 'int64_t': 'i',
- 'uint64_t': 'i',
- 'int_least8_t': 'i',
- 'uint_least8_t': 'i',
- 'int_least16_t': 'i',
- 'uint_least16_t': 'i',
- 'int_least32_t': 'i',
- 'uint_least32_t': 'i',
- 'int_least64_t': 'i',
- 'uint_least64_t': 'i',
- 'int_fast8_t': 'i',
- 'uint_fast8_t': 'i',
- 'int_fast16_t': 'i',
- 'uint_fast16_t': 'i',
- 'int_fast32_t': 'i',
- 'uint_fast32_t': 'i',
- 'int_fast64_t': 'i',
- 'uint_fast64_t': 'i',
- 'intptr_t': 'i',
- 'uintptr_t': 'i',
- 'intmax_t': 'i',
- 'uintmax_t': 'i',
- 'ptrdiff_t': 'i',
- 'size_t': 'i',
- 'ssize_t': 'i',
- }
-
- def __init__(self, name):
- assert name in self.ALL_PRIMITIVE_TYPES
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def is_char_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'c'
- def is_integer_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'i'
- def is_float_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
- def is_complex_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'j'
-
- def build_backend_type(self, ffi, finishlist):
- return global_cache(self, ffi, 'new_primitive_type', self.name)
-
-
-class UnknownIntegerType(BasePrimitiveType):
- _attrs_ = ('name',)
-
- def __init__(self, name):
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def is_integer_type(self):
- return True
-
- def build_backend_type(self, ffi, finishlist):
- raise NotImplementedError("integer type '%s' can only be used after "
- "compilation" % self.name)
-
-class UnknownFloatType(BasePrimitiveType):
- _attrs_ = ('name', )
-
- def __init__(self, name):
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def build_backend_type(self, ffi, finishlist):
- raise NotImplementedError("float type '%s' can only be used after "
- "compilation" % self.name)
-
-
-class BaseFunctionType(BaseType):
- _attrs_ = ('args', 'result', 'ellipsis', 'abi')
-
- def __init__(self, args, result, ellipsis, abi=None):
- self.args = args
- self.result = result
- self.ellipsis = ellipsis
- self.abi = abi
- #
- reprargs = [arg._get_c_name() for arg in self.args]
- if self.ellipsis:
- reprargs.append('...')
- reprargs = reprargs or ['void']
- replace_with = self._base_pattern % (', '.join(reprargs),)
- if abi is not None:
- replace_with = replace_with[:1] + abi + ' ' + replace_with[1:]
- self.c_name_with_marker = (
- self.result.c_name_with_marker.replace('&', replace_with))
-
-
-class RawFunctionType(BaseFunctionType):
- # Corresponds to a C type like 'int(int)', which is the C type of
- # a function, but not a pointer-to-function. The backend has no
- # notion of such a type; it's used temporarily by parsing.
- _base_pattern = '(&)(%s)'
- is_raw_function = True
-
- def build_backend_type(self, ffi, finishlist):
- raise CDefError("cannot render the type %r: it is a function "
- "type, not a pointer-to-function type" % (self,))
-
- def as_function_pointer(self):
- return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi)
-
-
-class FunctionPtrType(BaseFunctionType):
- _base_pattern = '(*&)(%s)'
-
- def build_backend_type(self, ffi, finishlist):
- result = self.result.get_cached_btype(ffi, finishlist)
- args = []
- for tp in self.args:
- args.append(tp.get_cached_btype(ffi, finishlist))
- abi_args = ()
- if self.abi == "__stdcall":
- if not self.ellipsis: # __stdcall ignored for variadic funcs
- try:
- abi_args = (ffi._backend.FFI_STDCALL,)
- except AttributeError:
- pass
- return global_cache(self, ffi, 'new_function_type',
- tuple(args), result, self.ellipsis, *abi_args)
-
- def as_raw_function(self):
- return RawFunctionType(self.args, self.result, self.ellipsis, self.abi)
-
-
-class PointerType(BaseType):
- _attrs_ = ('totype', 'quals')
-
- def __init__(self, totype, quals=0):
- self.totype = totype
- self.quals = quals
- extra = qualify(quals, " *&")
- if totype.is_array_type:
- extra = "(%s)" % (extra.lstrip(),)
- self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra)
-
- def build_backend_type(self, ffi, finishlist):
- BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True)
- return global_cache(self, ffi, 'new_pointer_type', BItem)
-
-voidp_type = PointerType(void_type)
-
-def ConstPointerType(totype):
- return PointerType(totype, Q_CONST)
-
-const_voidp_type = ConstPointerType(void_type)
-
-
-class NamedPointerType(PointerType):
- _attrs_ = ('totype', 'name')
-
- def __init__(self, totype, name, quals=0):
- PointerType.__init__(self, totype, quals)
- self.name = name
- self.c_name_with_marker = name + '&'
-
-
-class ArrayType(BaseType):
- _attrs_ = ('item', 'length')
- is_array_type = True
-
- def __init__(self, item, length):
- self.item = item
- self.length = length
- #
- if length is None:
- brackets = '&[]'
- elif length == '...':
- brackets = '&[/*...*/]'
- else:
- brackets = '&[%s]' % length
- self.c_name_with_marker = (
- self.item.c_name_with_marker.replace('&', brackets))
-
- def length_is_unknown(self):
- return isinstance(self.length, str)
-
- def resolve_length(self, newlength):
- return ArrayType(self.item, newlength)
-
- def build_backend_type(self, ffi, finishlist):
- if self.length_is_unknown():
- raise CDefError("cannot render the type %r: unknown length" %
- (self,))
- self.item.get_cached_btype(ffi, finishlist) # force the item BType
- BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist)
- return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length)
-
-char_array_type = ArrayType(PrimitiveType('char'), None)
-
-
-class StructOrUnionOrEnum(BaseTypeByIdentity):
- _attrs_ = ('name',)
- forcename = None
-
- def build_c_name_with_marker(self):
- name = self.forcename or '%s %s' % (self.kind, self.name)
- self.c_name_with_marker = name + '&'
-
- def force_the_name(self, forcename):
- self.forcename = forcename
- self.build_c_name_with_marker()
-
- def get_official_name(self):
- assert self.c_name_with_marker.endswith('&')
- return self.c_name_with_marker[:-1]
-
-
-class StructOrUnion(StructOrUnionOrEnum):
- fixedlayout = None
- completed = 0
- partial = False
- packed = 0
-
- def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None):
- self.name = name
- self.fldnames = fldnames
- self.fldtypes = fldtypes
- self.fldbitsize = fldbitsize
- self.fldquals = fldquals
- self.build_c_name_with_marker()
-
- def anonymous_struct_fields(self):
- if self.fldtypes is not None:
- for name, type in zip(self.fldnames, self.fldtypes):
- if name == '' and isinstance(type, StructOrUnion):
- yield type
-
- def enumfields(self, expand_anonymous_struct_union=True):
- fldquals = self.fldquals
- if fldquals is None:
- fldquals = (0,) * len(self.fldnames)
- for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes,
- self.fldbitsize, fldquals):
- if (name == '' and isinstance(type, StructOrUnion)
- and expand_anonymous_struct_union):
- # nested anonymous struct/union
- for result in type.enumfields():
- yield result
- else:
- yield (name, type, bitsize, quals)
-
- def force_flatten(self):
- # force the struct or union to have a declaration that lists
- # directly all fields returned by enumfields(), flattening
- # nested anonymous structs/unions.
- names = []
- types = []
- bitsizes = []
- fldquals = []
- for name, type, bitsize, quals in self.enumfields():
- names.append(name)
- types.append(type)
- bitsizes.append(bitsize)
- fldquals.append(quals)
- self.fldnames = tuple(names)
- self.fldtypes = tuple(types)
- self.fldbitsize = tuple(bitsizes)
- self.fldquals = tuple(fldquals)
-
- def get_cached_btype(self, ffi, finishlist, can_delay=False):
- BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist,
- can_delay)
- if not can_delay:
- self.finish_backend_type(ffi, finishlist)
- return BType
-
- def finish_backend_type(self, ffi, finishlist):
- if self.completed:
- if self.completed != 2:
- raise NotImplementedError("recursive structure declaration "
- "for '%s'" % (self.name,))
- return
- BType = ffi._cached_btypes[self]
- #
- self.completed = 1
- #
- if self.fldtypes is None:
- pass # not completing it: it's an opaque struct
- #
- elif self.fixedlayout is None:
- fldtypes = [tp.get_cached_btype(ffi, finishlist)
- for tp in self.fldtypes]
- lst = list(zip(self.fldnames, fldtypes, self.fldbitsize))
- extra_flags = ()
- if self.packed:
- if self.packed == 1:
- extra_flags = (8,) # SF_PACKED
- else:
- extra_flags = (0, self.packed)
- ffi._backend.complete_struct_or_union(BType, lst, self,
- -1, -1, *extra_flags)
- #
- else:
- fldtypes = []
- fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout
- for i in range(len(self.fldnames)):
- fsize = fieldsize[i]
- ftype = self.fldtypes[i]
- #
- if isinstance(ftype, ArrayType) and ftype.length_is_unknown():
- # fix the length to match the total size
- BItemType = ftype.item.get_cached_btype(ffi, finishlist)
- nlen, nrest = divmod(fsize, ffi.sizeof(BItemType))
- if nrest != 0:
- self._verification_error(
- "field '%s.%s' has a bogus size?" % (
- self.name, self.fldnames[i] or '{}'))
- ftype = ftype.resolve_length(nlen)
- self.fldtypes = (self.fldtypes[:i] + (ftype,) +
- self.fldtypes[i+1:])
- #
- BFieldType = ftype.get_cached_btype(ffi, finishlist)
- if isinstance(ftype, ArrayType) and ftype.length is None:
- assert fsize == 0
- else:
- bitemsize = ffi.sizeof(BFieldType)
- if bitemsize != fsize:
- self._verification_error(
- "field '%s.%s' is declared as %d bytes, but is "
- "really %d bytes" % (self.name,
- self.fldnames[i] or '{}',
- bitemsize, fsize))
- fldtypes.append(BFieldType)
- #
- lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs))
- ffi._backend.complete_struct_or_union(BType, lst, self,
- totalsize, totalalignment)
- self.completed = 2
-
- def _verification_error(self, msg):
- raise VerificationError(msg)
-
- def check_not_partial(self):
- if self.partial and self.fixedlayout is None:
- raise VerificationMissing(self._get_c_name())
-
- def build_backend_type(self, ffi, finishlist):
- self.check_not_partial()
- finishlist.append(self)
- #
- return global_cache(self, ffi, 'new_%s_type' % self.kind,
- self.get_official_name(), key=self)
-
-
-class StructType(StructOrUnion):
- kind = 'struct'
-
-
-class UnionType(StructOrUnion):
- kind = 'union'
-
-
-class EnumType(StructOrUnionOrEnum):
- kind = 'enum'
- partial = False
- partial_resolved = False
-
- def __init__(self, name, enumerators, enumvalues, baseinttype=None):
- self.name = name
- self.enumerators = enumerators
- self.enumvalues = enumvalues
- self.baseinttype = baseinttype
- self.build_c_name_with_marker()
-
- def force_the_name(self, forcename):
- StructOrUnionOrEnum.force_the_name(self, forcename)
- if self.forcename is None:
- name = self.get_official_name()
- self.forcename = '$' + name.replace(' ', '_')
-
- def check_not_partial(self):
- if self.partial and not self.partial_resolved:
- raise VerificationMissing(self._get_c_name())
-
- def build_backend_type(self, ffi, finishlist):
- self.check_not_partial()
- base_btype = self.build_baseinttype(ffi, finishlist)
- return global_cache(self, ffi, 'new_enum_type',
- self.get_official_name(),
- self.enumerators, self.enumvalues,
- base_btype, key=self)
-
- def build_baseinttype(self, ffi, finishlist):
- if self.baseinttype is not None:
- return self.baseinttype.get_cached_btype(ffi, finishlist)
- #
- if self.enumvalues:
- smallest_value = min(self.enumvalues)
- largest_value = max(self.enumvalues)
- else:
- import warnings
- try:
- # XXX! The goal is to ensure that the warnings.warn()
- # will not suppress the warning. We want to get it
- # several times if we reach this point several times.
- __warningregistry__.clear()
- except NameError:
- pass
- warnings.warn("%r has no values explicitly defined; "
- "guessing that it is equivalent to 'unsigned int'"
- % self._get_c_name())
- smallest_value = largest_value = 0
- if smallest_value < 0: # needs a signed type
- sign = 1
- candidate1 = PrimitiveType("int")
- candidate2 = PrimitiveType("long")
- else:
- sign = 0
- candidate1 = PrimitiveType("unsigned int")
- candidate2 = PrimitiveType("unsigned long")
- btype1 = candidate1.get_cached_btype(ffi, finishlist)
- btype2 = candidate2.get_cached_btype(ffi, finishlist)
- size1 = ffi.sizeof(btype1)
- size2 = ffi.sizeof(btype2)
- if (smallest_value >= ((-1) << (8*size1-1)) and
- largest_value < (1 << (8*size1-sign))):
- return btype1
- if (smallest_value >= ((-1) << (8*size2-1)) and
- largest_value < (1 << (8*size2-sign))):
- return btype2
- raise CDefError("%s values don't all fit into either 'long' "
- "or 'unsigned long'" % self._get_c_name())
-
-def unknown_type(name, structname=None):
- if structname is None:
- structname = '$%s' % name
- tp = StructType(structname, None, None, None)
- tp.force_the_name(name)
- tp.origin = "unknown_type"
- return tp
-
-def unknown_ptr_type(name, structname=None):
- if structname is None:
- structname = '$$%s' % name
- tp = StructType(structname, None, None, None)
- return NamedPointerType(tp, name)
-
-
-global_lock = allocate_lock()
-_typecache_cffi_backend = weakref.WeakValueDictionary()
-
-def get_typecache(backend):
- # returns _typecache_cffi_backend if backend is the _cffi_backend
- # module, or type(backend).__typecache if backend is an instance of
- # CTypesBackend (or some FakeBackend class during tests)
- if isinstance(backend, types.ModuleType):
- return _typecache_cffi_backend
- with global_lock:
- if not hasattr(type(backend), '__typecache'):
- type(backend).__typecache = weakref.WeakValueDictionary()
- return type(backend).__typecache
-
-def global_cache(srctype, ffi, funcname, *args, **kwds):
- key = kwds.pop('key', (funcname, args))
- assert not kwds
- try:
- return ffi._typecache[key]
- except KeyError:
- pass
- try:
- res = getattr(ffi._backend, funcname)(*args)
- except NotImplementedError as e:
- raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e))
- # note that setdefault() on WeakValueDictionary is not atomic
- # and contains a rare bug (http://bugs.python.org/issue19542);
- # we have to use a lock and do it ourselves
- cache = ffi._typecache
- with global_lock:
- res1 = cache.get(key)
- if res1 is None:
- cache[key] = res
- return res
- else:
- return res1
-
-def pointer_cache(ffi, BType):
- return global_cache('?', ffi, 'new_pointer_type', BType)
-
-def attach_exception_info(e, name):
- if e.args and type(e.args[0]) is str:
- e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:]
diff --git a/resources/python/bin/3.7/linux/cffi/parse_c_type.h b/resources/python/bin/3.7/linux/cffi/parse_c_type.h
deleted file mode 100644
index 84e4ef856..000000000
--- a/resources/python/bin/3.7/linux/cffi/parse_c_type.h
+++ /dev/null
@@ -1,181 +0,0 @@
-
-/* This part is from file 'cffi/parse_c_type.h'. It is copied at the
- beginning of C sources generated by CFFI's ffi.set_source(). */
-
-typedef void *_cffi_opcode_t;
-
-#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8))
-#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode)
-#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8)
-
-#define _CFFI_OP_PRIMITIVE 1
-#define _CFFI_OP_POINTER 3
-#define _CFFI_OP_ARRAY 5
-#define _CFFI_OP_OPEN_ARRAY 7
-#define _CFFI_OP_STRUCT_UNION 9
-#define _CFFI_OP_ENUM 11
-#define _CFFI_OP_FUNCTION 13
-#define _CFFI_OP_FUNCTION_END 15
-#define _CFFI_OP_NOOP 17
-#define _CFFI_OP_BITFIELD 19
-#define _CFFI_OP_TYPENAME 21
-#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs
-#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs
-#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg)
-#define _CFFI_OP_CONSTANT 29
-#define _CFFI_OP_CONSTANT_INT 31
-#define _CFFI_OP_GLOBAL_VAR 33
-#define _CFFI_OP_DLOPEN_FUNC 35
-#define _CFFI_OP_DLOPEN_CONST 37
-#define _CFFI_OP_GLOBAL_VAR_F 39
-#define _CFFI_OP_EXTERN_PYTHON 41
-
-#define _CFFI_PRIM_VOID 0
-#define _CFFI_PRIM_BOOL 1
-#define _CFFI_PRIM_CHAR 2
-#define _CFFI_PRIM_SCHAR 3
-#define _CFFI_PRIM_UCHAR 4
-#define _CFFI_PRIM_SHORT 5
-#define _CFFI_PRIM_USHORT 6
-#define _CFFI_PRIM_INT 7
-#define _CFFI_PRIM_UINT 8
-#define _CFFI_PRIM_LONG 9
-#define _CFFI_PRIM_ULONG 10
-#define _CFFI_PRIM_LONGLONG 11
-#define _CFFI_PRIM_ULONGLONG 12
-#define _CFFI_PRIM_FLOAT 13
-#define _CFFI_PRIM_DOUBLE 14
-#define _CFFI_PRIM_LONGDOUBLE 15
-
-#define _CFFI_PRIM_WCHAR 16
-#define _CFFI_PRIM_INT8 17
-#define _CFFI_PRIM_UINT8 18
-#define _CFFI_PRIM_INT16 19
-#define _CFFI_PRIM_UINT16 20
-#define _CFFI_PRIM_INT32 21
-#define _CFFI_PRIM_UINT32 22
-#define _CFFI_PRIM_INT64 23
-#define _CFFI_PRIM_UINT64 24
-#define _CFFI_PRIM_INTPTR 25
-#define _CFFI_PRIM_UINTPTR 26
-#define _CFFI_PRIM_PTRDIFF 27
-#define _CFFI_PRIM_SIZE 28
-#define _CFFI_PRIM_SSIZE 29
-#define _CFFI_PRIM_INT_LEAST8 30
-#define _CFFI_PRIM_UINT_LEAST8 31
-#define _CFFI_PRIM_INT_LEAST16 32
-#define _CFFI_PRIM_UINT_LEAST16 33
-#define _CFFI_PRIM_INT_LEAST32 34
-#define _CFFI_PRIM_UINT_LEAST32 35
-#define _CFFI_PRIM_INT_LEAST64 36
-#define _CFFI_PRIM_UINT_LEAST64 37
-#define _CFFI_PRIM_INT_FAST8 38
-#define _CFFI_PRIM_UINT_FAST8 39
-#define _CFFI_PRIM_INT_FAST16 40
-#define _CFFI_PRIM_UINT_FAST16 41
-#define _CFFI_PRIM_INT_FAST32 42
-#define _CFFI_PRIM_UINT_FAST32 43
-#define _CFFI_PRIM_INT_FAST64 44
-#define _CFFI_PRIM_UINT_FAST64 45
-#define _CFFI_PRIM_INTMAX 46
-#define _CFFI_PRIM_UINTMAX 47
-#define _CFFI_PRIM_FLOATCOMPLEX 48
-#define _CFFI_PRIM_DOUBLECOMPLEX 49
-#define _CFFI_PRIM_CHAR16 50
-#define _CFFI_PRIM_CHAR32 51
-
-#define _CFFI__NUM_PRIM 52
-#define _CFFI__UNKNOWN_PRIM (-1)
-#define _CFFI__UNKNOWN_FLOAT_PRIM (-2)
-#define _CFFI__UNKNOWN_LONG_DOUBLE (-3)
-
-#define _CFFI__IO_FILE_STRUCT (-1)
-
-
-struct _cffi_global_s {
- const char *name;
- void *address;
- _cffi_opcode_t type_op;
- void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown
- // OP_CPYTHON_BLTN_*: addr of direct function
-};
-
-struct _cffi_getconst_s {
- unsigned long long value;
- const struct _cffi_type_context_s *ctx;
- int gindex;
-};
-
-struct _cffi_struct_union_s {
- const char *name;
- int type_index; // -> _cffi_types, on a OP_STRUCT_UNION
- int flags; // _CFFI_F_* flags below
- size_t size;
- int alignment;
- int first_field_index; // -> _cffi_fields array
- int num_fields;
-};
-#define _CFFI_F_UNION 0x01 // is a union, not a struct
-#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the
- // "standard layout" or if some are missing
-#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct
-#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include()
-#define _CFFI_F_OPAQUE 0x10 // opaque
-
-struct _cffi_field_s {
- const char *name;
- size_t field_offset;
- size_t field_size;
- _cffi_opcode_t field_type_op;
-};
-
-struct _cffi_enum_s {
- const char *name;
- int type_index; // -> _cffi_types, on a OP_ENUM
- int type_prim; // _CFFI_PRIM_xxx
- const char *enumerators; // comma-delimited string
-};
-
-struct _cffi_typename_s {
- const char *name;
- int type_index; /* if opaque, points to a possibly artificial
- OP_STRUCT which is itself opaque */
-};
-
-struct _cffi_type_context_s {
- _cffi_opcode_t *types;
- const struct _cffi_global_s *globals;
- const struct _cffi_field_s *fields;
- const struct _cffi_struct_union_s *struct_unions;
- const struct _cffi_enum_s *enums;
- const struct _cffi_typename_s *typenames;
- int num_globals;
- int num_struct_unions;
- int num_enums;
- int num_typenames;
- const char *const *includes;
- int num_types;
- int flags; /* future extension */
-};
-
-struct _cffi_parse_info_s {
- const struct _cffi_type_context_s *ctx;
- _cffi_opcode_t *output;
- unsigned int output_size;
- size_t error_location;
- const char *error_message;
-};
-
-struct _cffi_externpy_s {
- const char *name;
- size_t size_of_result;
- void *reserved1, *reserved2;
-};
-
-#ifdef _CFFI_INTERNAL
-static int parse_c_type(struct _cffi_parse_info_s *info, const char *input);
-static int search_in_globals(const struct _cffi_type_context_s *ctx,
- const char *search, size_t search_len);
-static int search_in_struct_unions(const struct _cffi_type_context_s *ctx,
- const char *search, size_t search_len);
-#endif
diff --git a/resources/python/bin/3.7/linux/cffi/pkgconfig.py b/resources/python/bin/3.7/linux/cffi/pkgconfig.py
deleted file mode 100644
index 5c93f15a6..000000000
--- a/resources/python/bin/3.7/linux/cffi/pkgconfig.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# pkg-config, https://www.freedesktop.org/wiki/Software/pkg-config/ integration for cffi
-import sys, os, subprocess
-
-from .error import PkgConfigError
-
-
-def merge_flags(cfg1, cfg2):
- """Merge values from cffi config flags cfg2 to cf1
-
- Example:
- merge_flags({"libraries": ["one"]}, {"libraries": ["two"]})
- {"libraries": ["one", "two"]}
- """
- for key, value in cfg2.items():
- if key not in cfg1:
- cfg1[key] = value
- else:
- if not isinstance(cfg1[key], list):
- raise TypeError("cfg1[%r] should be a list of strings" % (key,))
- if not isinstance(value, list):
- raise TypeError("cfg2[%r] should be a list of strings" % (key,))
- cfg1[key].extend(value)
- return cfg1
-
-
-def call(libname, flag, encoding=sys.getfilesystemencoding()):
- """Calls pkg-config and returns the output if found
- """
- a = ["pkg-config", "--print-errors"]
- a.append(flag)
- a.append(libname)
- try:
- pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- except EnvironmentError as e:
- raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),))
-
- bout, berr = pc.communicate()
- if pc.returncode != 0:
- try:
- berr = berr.decode(encoding)
- except Exception:
- pass
- raise PkgConfigError(berr.strip())
-
- if sys.version_info >= (3,) and not isinstance(bout, str): # Python 3.x
- try:
- bout = bout.decode(encoding)
- except UnicodeDecodeError:
- raise PkgConfigError("pkg-config %s %s returned bytes that cannot "
- "be decoded with encoding %r:\n%r" %
- (flag, libname, encoding, bout))
-
- if os.altsep != '\\' and '\\' in bout:
- raise PkgConfigError("pkg-config %s %s returned an unsupported "
- "backslash-escaped output:\n%r" %
- (flag, libname, bout))
- return bout
-
-
-def flags_from_pkgconfig(libs):
- r"""Return compiler line flags for FFI.set_source based on pkg-config output
-
- Usage
- ...
- ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"])
-
- If pkg-config is installed on build machine, then arguments include_dirs,
- library_dirs, libraries, define_macros, extra_compile_args and
- extra_link_args are extended with an output of pkg-config for libfoo and
- libbar.
-
- Raises PkgConfigError in case the pkg-config call fails.
- """
-
- def get_include_dirs(string):
- return [x[2:] for x in string.split() if x.startswith("-I")]
-
- def get_library_dirs(string):
- return [x[2:] for x in string.split() if x.startswith("-L")]
-
- def get_libraries(string):
- return [x[2:] for x in string.split() if x.startswith("-l")]
-
- # convert -Dfoo=bar to list of tuples [("foo", "bar")] expected by distutils
- def get_macros(string):
- def _macro(x):
- x = x[2:] # drop "-D"
- if '=' in x:
- return tuple(x.split("=", 1)) # "-Dfoo=bar" => ("foo", "bar")
- else:
- return (x, None) # "-Dfoo" => ("foo", None)
- return [_macro(x) for x in string.split() if x.startswith("-D")]
-
- def get_other_cflags(string):
- return [x for x in string.split() if not x.startswith("-I") and
- not x.startswith("-D")]
-
- def get_other_libs(string):
- return [x for x in string.split() if not x.startswith("-L") and
- not x.startswith("-l")]
-
- # return kwargs for given libname
- def kwargs(libname):
- fse = sys.getfilesystemencoding()
- all_cflags = call(libname, "--cflags")
- all_libs = call(libname, "--libs")
- return {
- "include_dirs": get_include_dirs(all_cflags),
- "library_dirs": get_library_dirs(all_libs),
- "libraries": get_libraries(all_libs),
- "define_macros": get_macros(all_cflags),
- "extra_compile_args": get_other_cflags(all_cflags),
- "extra_link_args": get_other_libs(all_libs),
- }
-
- # merge all arguments together
- ret = {}
- for libname in libs:
- lib_flags = kwargs(libname)
- merge_flags(ret, lib_flags)
- return ret
diff --git a/resources/python/bin/3.7/linux/cffi/recompiler.py b/resources/python/bin/3.7/linux/cffi/recompiler.py
deleted file mode 100644
index 5d9d32d71..000000000
--- a/resources/python/bin/3.7/linux/cffi/recompiler.py
+++ /dev/null
@@ -1,1581 +0,0 @@
-import os, sys, io
-from . import ffiplatform, model
-from .error import VerificationError
-from .cffi_opcode import *
-
-VERSION_BASE = 0x2601
-VERSION_EMBEDDED = 0x2701
-VERSION_CHAR16CHAR32 = 0x2801
-
-USE_LIMITED_API = (sys.platform != 'win32' or sys.version_info < (3, 0) or
- sys.version_info >= (3, 5))
-
-
-class GlobalExpr:
- def __init__(self, name, address, type_op, size=0, check_value=0):
- self.name = name
- self.address = address
- self.type_op = type_op
- self.size = size
- self.check_value = check_value
-
- def as_c_expr(self):
- return ' { "%s", (void *)%s, %s, (void *)%s },' % (
- self.name, self.address, self.type_op.as_c_expr(), self.size)
-
- def as_python_expr(self):
- return "b'%s%s',%d" % (self.type_op.as_python_bytes(), self.name,
- self.check_value)
-
-class FieldExpr:
- def __init__(self, name, field_offset, field_size, fbitsize, field_type_op):
- self.name = name
- self.field_offset = field_offset
- self.field_size = field_size
- self.fbitsize = fbitsize
- self.field_type_op = field_type_op
-
- def as_c_expr(self):
- spaces = " " * len(self.name)
- return (' { "%s", %s,\n' % (self.name, self.field_offset) +
- ' %s %s,\n' % (spaces, self.field_size) +
- ' %s %s },' % (spaces, self.field_type_op.as_c_expr()))
-
- def as_python_expr(self):
- raise NotImplementedError
-
- def as_field_python_expr(self):
- if self.field_type_op.op == OP_NOOP:
- size_expr = ''
- elif self.field_type_op.op == OP_BITFIELD:
- size_expr = format_four_bytes(self.fbitsize)
- else:
- raise NotImplementedError
- return "b'%s%s%s'" % (self.field_type_op.as_python_bytes(),
- size_expr,
- self.name)
-
-class StructUnionExpr:
- def __init__(self, name, type_index, flags, size, alignment, comment,
- first_field_index, c_fields):
- self.name = name
- self.type_index = type_index
- self.flags = flags
- self.size = size
- self.alignment = alignment
- self.comment = comment
- self.first_field_index = first_field_index
- self.c_fields = c_fields
-
- def as_c_expr(self):
- return (' { "%s", %d, %s,' % (self.name, self.type_index, self.flags)
- + '\n %s, %s, ' % (self.size, self.alignment)
- + '%d, %d ' % (self.first_field_index, len(self.c_fields))
- + ('/* %s */ ' % self.comment if self.comment else '')
- + '},')
-
- def as_python_expr(self):
- flags = eval(self.flags, G_FLAGS)
- fields_expr = [c_field.as_field_python_expr()
- for c_field in self.c_fields]
- return "(b'%s%s%s',%s)" % (
- format_four_bytes(self.type_index),
- format_four_bytes(flags),
- self.name,
- ','.join(fields_expr))
-
-class EnumExpr:
- def __init__(self, name, type_index, size, signed, allenums):
- self.name = name
- self.type_index = type_index
- self.size = size
- self.signed = signed
- self.allenums = allenums
-
- def as_c_expr(self):
- return (' { "%s", %d, _cffi_prim_int(%s, %s),\n'
- ' "%s" },' % (self.name, self.type_index,
- self.size, self.signed, self.allenums))
-
- def as_python_expr(self):
- prim_index = {
- (1, 0): PRIM_UINT8, (1, 1): PRIM_INT8,
- (2, 0): PRIM_UINT16, (2, 1): PRIM_INT16,
- (4, 0): PRIM_UINT32, (4, 1): PRIM_INT32,
- (8, 0): PRIM_UINT64, (8, 1): PRIM_INT64,
- }[self.size, self.signed]
- return "b'%s%s%s\\x00%s'" % (format_four_bytes(self.type_index),
- format_four_bytes(prim_index),
- self.name, self.allenums)
-
-class TypenameExpr:
- def __init__(self, name, type_index):
- self.name = name
- self.type_index = type_index
-
- def as_c_expr(self):
- return ' { "%s", %d },' % (self.name, self.type_index)
-
- def as_python_expr(self):
- return "b'%s%s'" % (format_four_bytes(self.type_index), self.name)
-
-
-# ____________________________________________________________
-
-
-class Recompiler:
- _num_externpy = 0
-
- def __init__(self, ffi, module_name, target_is_python=False):
- self.ffi = ffi
- self.module_name = module_name
- self.target_is_python = target_is_python
- self._version = VERSION_BASE
-
- def needs_version(self, ver):
- self._version = max(self._version, ver)
-
- def collect_type_table(self):
- self._typesdict = {}
- self._generate("collecttype")
- #
- all_decls = sorted(self._typesdict, key=str)
- #
- # prepare all FUNCTION bytecode sequences first
- self.cffi_types = []
- for tp in all_decls:
- if tp.is_raw_function:
- assert self._typesdict[tp] is None
- self._typesdict[tp] = len(self.cffi_types)
- self.cffi_types.append(tp) # placeholder
- for tp1 in tp.args:
- assert isinstance(tp1, (model.VoidType,
- model.BasePrimitiveType,
- model.PointerType,
- model.StructOrUnionOrEnum,
- model.FunctionPtrType))
- if self._typesdict[tp1] is None:
- self._typesdict[tp1] = len(self.cffi_types)
- self.cffi_types.append(tp1) # placeholder
- self.cffi_types.append('END') # placeholder
- #
- # prepare all OTHER bytecode sequences
- for tp in all_decls:
- if not tp.is_raw_function and self._typesdict[tp] is None:
- self._typesdict[tp] = len(self.cffi_types)
- self.cffi_types.append(tp) # placeholder
- if tp.is_array_type and tp.length is not None:
- self.cffi_types.append('LEN') # placeholder
- assert None not in self._typesdict.values()
- #
- # collect all structs and unions and enums
- self._struct_unions = {}
- self._enums = {}
- for tp in all_decls:
- if isinstance(tp, model.StructOrUnion):
- self._struct_unions[tp] = None
- elif isinstance(tp, model.EnumType):
- self._enums[tp] = None
- for i, tp in enumerate(sorted(self._struct_unions,
- key=lambda tp: tp.name)):
- self._struct_unions[tp] = i
- for i, tp in enumerate(sorted(self._enums,
- key=lambda tp: tp.name)):
- self._enums[tp] = i
- #
- # emit all bytecode sequences now
- for tp in all_decls:
- method = getattr(self, '_emit_bytecode_' + tp.__class__.__name__)
- method(tp, self._typesdict[tp])
- #
- # consistency check
- for op in self.cffi_types:
- assert isinstance(op, CffiOp)
- self.cffi_types = tuple(self.cffi_types) # don't change any more
-
- def _enum_fields(self, tp):
- # When producing C, expand all anonymous struct/union fields.
- # That's necessary to have C code checking the offsets of the
- # individual fields contained in them. When producing Python,
- # don't do it and instead write it like it is, with the
- # corresponding fields having an empty name. Empty names are
- # recognized at runtime when we import the generated Python
- # file.
- expand_anonymous_struct_union = not self.target_is_python
- return tp.enumfields(expand_anonymous_struct_union)
-
- def _do_collect_type(self, tp):
- if not isinstance(tp, model.BaseTypeByIdentity):
- if isinstance(tp, tuple):
- for x in tp:
- self._do_collect_type(x)
- return
- if tp not in self._typesdict:
- self._typesdict[tp] = None
- if isinstance(tp, model.FunctionPtrType):
- self._do_collect_type(tp.as_raw_function())
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldtypes is not None and (
- tp not in self.ffi._parser._included_declarations):
- for name1, tp1, _, _ in self._enum_fields(tp):
- self._do_collect_type(self._field_type(tp, name1, tp1))
- else:
- for _, x in tp._get_items():
- self._do_collect_type(x)
-
- def _generate(self, step_name):
- lst = self.ffi._parser._declarations.items()
- for name, (tp, quals) in sorted(lst):
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_cpy_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in recompile(): %r" % name)
- try:
- self._current_quals = quals
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- # ----------
-
- ALL_STEPS = ["global", "field", "struct_union", "enum", "typename"]
-
- def collect_step_tables(self):
- # collect the declarations for '_cffi_globals', '_cffi_typenames', etc.
- self._lsts = {}
- for step_name in self.ALL_STEPS:
- self._lsts[step_name] = []
- self._seen_struct_unions = set()
- self._generate("ctx")
- self._add_missing_struct_unions()
- #
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- if step_name != "field":
- lst.sort(key=lambda entry: entry.name)
- self._lsts[step_name] = tuple(lst) # don't change any more
- #
- # check for a possible internal inconsistency: _cffi_struct_unions
- # should have been generated with exactly self._struct_unions
- lst = self._lsts["struct_union"]
- for tp, i in self._struct_unions.items():
- assert i < len(lst)
- assert lst[i].name == tp.name
- assert len(lst) == len(self._struct_unions)
- # same with enums
- lst = self._lsts["enum"]
- for tp, i in self._enums.items():
- assert i < len(lst)
- assert lst[i].name == tp.name
- assert len(lst) == len(self._enums)
-
- # ----------
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def write_source_to_f(self, f, preamble):
- if self.target_is_python:
- assert preamble is None
- self.write_py_source_to_f(f)
- else:
- assert preamble is not None
- self.write_c_source_to_f(f, preamble)
-
- def _rel_readlines(self, filename):
- g = open(os.path.join(os.path.dirname(__file__), filename), 'r')
- lines = g.readlines()
- g.close()
- return lines
-
- def write_c_source_to_f(self, f, preamble):
- self._f = f
- prnt = self._prnt
- if self.ffi._embedding is not None:
- prnt('#define _CFFI_USE_EMBEDDING')
- if not USE_LIMITED_API:
- prnt('#define _CFFI_NO_LIMITED_API')
- #
- # first the '#include' (actually done by inlining the file's content)
- lines = self._rel_readlines('_cffi_include.h')
- i = lines.index('#include "parse_c_type.h"\n')
- lines[i:i+1] = self._rel_readlines('parse_c_type.h')
- prnt(''.join(lines))
- #
- # if we have ffi._embedding != None, we give it here as a macro
- # and include an extra file
- base_module_name = self.module_name.split('.')[-1]
- if self.ffi._embedding is not None:
- prnt('#define _CFFI_MODULE_NAME "%s"' % (self.module_name,))
- prnt('static const char _CFFI_PYTHON_STARTUP_CODE[] = {')
- self._print_string_literal_in_array(self.ffi._embedding)
- prnt('0 };')
- prnt('#ifdef PYPY_VERSION')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % (
- base_module_name,))
- prnt('#elif PY_MAJOR_VERSION >= 3')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % (
- base_module_name,))
- prnt('#else')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % (
- base_module_name,))
- prnt('#endif')
- lines = self._rel_readlines('_embedding.h')
- i = lines.index('#include "_cffi_errors.h"\n')
- lines[i:i+1] = self._rel_readlines('_cffi_errors.h')
- prnt(''.join(lines))
- self.needs_version(VERSION_EMBEDDED)
- #
- # then paste the C source given by the user, verbatim.
- prnt('/************************************************************/')
- prnt()
- prnt(preamble)
- prnt()
- prnt('/************************************************************/')
- prnt()
- #
- # the declaration of '_cffi_types'
- prnt('static void *_cffi_types[] = {')
- typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()])
- for i, op in enumerate(self.cffi_types):
- comment = ''
- if i in typeindex2type:
- comment = ' // ' + typeindex2type[i]._get_c_name()
- prnt('/* %2d */ %s,%s' % (i, op.as_c_expr(), comment))
- if not self.cffi_types:
- prnt(' 0')
- prnt('};')
- prnt()
- #
- # call generate_cpy_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._seen_constants = set()
- self._generate("decl")
- #
- # the declaration of '_cffi_globals' and '_cffi_typenames'
- nums = {}
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- nums[step_name] = len(lst)
- if nums[step_name] > 0:
- prnt('static const struct _cffi_%s_s _cffi_%ss[] = {' % (
- step_name, step_name))
- for entry in lst:
- prnt(entry.as_c_expr())
- prnt('};')
- prnt()
- #
- # the declaration of '_cffi_includes'
- if self.ffi._included_ffis:
- prnt('static const char * const _cffi_includes[] = {')
- for ffi_to_include in self.ffi._included_ffis:
- try:
- included_module_name, included_source = (
- ffi_to_include._assigned_source[:2])
- except AttributeError:
- raise VerificationError(
- "ffi object %r includes %r, but the latter has not "
- "been prepared with set_source()" % (
- self.ffi, ffi_to_include,))
- if included_source is None:
- raise VerificationError(
- "not implemented yet: ffi.include() of a Python-based "
- "ffi inside a C-based ffi")
- prnt(' "%s",' % (included_module_name,))
- prnt(' NULL')
- prnt('};')
- prnt()
- #
- # the declaration of '_cffi_type_context'
- prnt('static const struct _cffi_type_context_s _cffi_type_context = {')
- prnt(' _cffi_types,')
- for step_name in self.ALL_STEPS:
- if nums[step_name] > 0:
- prnt(' _cffi_%ss,' % step_name)
- else:
- prnt(' NULL, /* no %ss */' % step_name)
- for step_name in self.ALL_STEPS:
- if step_name != "field":
- prnt(' %d, /* num_%ss */' % (nums[step_name], step_name))
- if self.ffi._included_ffis:
- prnt(' _cffi_includes,')
- else:
- prnt(' NULL, /* no includes */')
- prnt(' %d, /* num_types */' % (len(self.cffi_types),))
- flags = 0
- if self._num_externpy > 0 or self.ffi._embedding is not None:
- flags |= 1 # set to mean that we use extern "Python"
- prnt(' %d, /* flags */' % flags)
- prnt('};')
- prnt()
- #
- # the init function
- prnt('#ifdef __GNUC__')
- prnt('# pragma GCC visibility push(default) /* for -fvisibility= */')
- prnt('#endif')
- prnt()
- prnt('#ifdef PYPY_VERSION')
- prnt('PyMODINIT_FUNC')
- prnt('_cffi_pypyinit_%s(const void *p[])' % (base_module_name,))
- prnt('{')
- if flags & 1:
- prnt(' if (((intptr_t)p[0]) >= 0x0A03) {')
- prnt(' _cffi_call_python_org = '
- '(void(*)(struct _cffi_externpy_s *, char *))p[1];')
- prnt(' }')
- prnt(' p[0] = (const void *)0x%x;' % self._version)
- prnt(' p[1] = &_cffi_type_context;')
- prnt('#if PY_MAJOR_VERSION >= 3')
- prnt(' return NULL;')
- prnt('#endif')
- prnt('}')
- # on Windows, distutils insists on putting init_cffi_xyz in
- # 'export_symbols', so instead of fighting it, just give up and
- # give it one
- prnt('# ifdef _MSC_VER')
- prnt(' PyMODINIT_FUNC')
- prnt('# if PY_MAJOR_VERSION >= 3')
- prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,))
- prnt('# else')
- prnt(' init%s(void) { }' % (base_module_name,))
- prnt('# endif')
- prnt('# endif')
- prnt('#elif PY_MAJOR_VERSION >= 3')
- prnt('PyMODINIT_FUNC')
- prnt('PyInit_%s(void)' % (base_module_name,))
- prnt('{')
- prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
- self.module_name, self._version))
- prnt('}')
- prnt('#else')
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % (base_module_name,))
- prnt('{')
- prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
- self.module_name, self._version))
- prnt('}')
- prnt('#endif')
- prnt()
- prnt('#ifdef __GNUC__')
- prnt('# pragma GCC visibility pop')
- prnt('#endif')
- self._version = None
-
- def _to_py(self, x):
- if isinstance(x, str):
- return "b'%s'" % (x,)
- if isinstance(x, (list, tuple)):
- rep = [self._to_py(item) for item in x]
- if len(rep) == 1:
- rep.append('')
- return "(%s)" % (','.join(rep),)
- return x.as_python_expr() # Py2: unicode unexpected; Py3: bytes unexp.
-
- def write_py_source_to_f(self, f):
- self._f = f
- prnt = self._prnt
- #
- # header
- prnt("# auto-generated file")
- prnt("import _cffi_backend")
- #
- # the 'import' of the included ffis
- num_includes = len(self.ffi._included_ffis or ())
- for i in range(num_includes):
- ffi_to_include = self.ffi._included_ffis[i]
- try:
- included_module_name, included_source = (
- ffi_to_include._assigned_source[:2])
- except AttributeError:
- raise VerificationError(
- "ffi object %r includes %r, but the latter has not "
- "been prepared with set_source()" % (
- self.ffi, ffi_to_include,))
- if included_source is not None:
- raise VerificationError(
- "not implemented yet: ffi.include() of a C-based "
- "ffi inside a Python-based ffi")
- prnt('from %s import ffi as _ffi%d' % (included_module_name, i))
- prnt()
- prnt("ffi = _cffi_backend.FFI('%s'," % (self.module_name,))
- prnt(" _version = 0x%x," % (self._version,))
- self._version = None
- #
- # the '_types' keyword argument
- self.cffi_types = tuple(self.cffi_types) # don't change any more
- types_lst = [op.as_python_bytes() for op in self.cffi_types]
- prnt(' _types = %s,' % (self._to_py(''.join(types_lst)),))
- typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()])
- #
- # the keyword arguments from ALL_STEPS
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- if len(lst) > 0 and step_name != "field":
- prnt(' _%ss = %s,' % (step_name, self._to_py(lst)))
- #
- # the '_includes' keyword argument
- if num_includes > 0:
- prnt(' _includes = (%s,),' % (
- ', '.join(['_ffi%d' % i for i in range(num_includes)]),))
- #
- # the footer
- prnt(')')
-
- # ----------
-
- def _gettypenum(self, type):
- # a KeyError here is a bug. please report it! :-)
- return self._typesdict[type]
-
- def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode):
- extraarg = ''
- if isinstance(tp, model.BasePrimitiveType) and not tp.is_complex_type():
- if tp.is_integer_type() and tp.name != '_Bool':
- converter = '_cffi_to_c_int'
- extraarg = ', %s' % tp.name
- elif isinstance(tp, model.UnknownFloatType):
- # don't check with is_float_type(): it may be a 'long
- # double' here, and _cffi_to_c_double would loose precision
- converter = '(%s)_cffi_to_c_double' % (tp.get_c_name(''),)
- else:
- cname = tp.get_c_name('')
- converter = '(%s)_cffi_to_c_%s' % (cname,
- tp.name.replace(' ', '_'))
- if cname in ('char16_t', 'char32_t'):
- self.needs_version(VERSION_CHAR16CHAR32)
- errvalue = '-1'
- #
- elif isinstance(tp, model.PointerType):
- self._convert_funcarg_to_c_ptr_or_array(tp, fromvar,
- tovar, errcode)
- return
- #
- elif (isinstance(tp, model.StructOrUnionOrEnum) or
- isinstance(tp, model.BasePrimitiveType)):
- # a struct (not a struct pointer) as a function argument;
- # or, a complex (the same code works)
- self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)'
- % (tovar, self._gettypenum(tp), fromvar))
- self._prnt(' %s;' % errcode)
- return
- #
- elif isinstance(tp, model.FunctionPtrType):
- converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('')
- extraarg = ', _cffi_type(%d)' % self._gettypenum(tp)
- errvalue = 'NULL'
- #
- else:
- raise NotImplementedError(tp)
- #
- self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg))
- self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % (
- tovar, tp.get_c_name(''), errvalue))
- self._prnt(' %s;' % errcode)
-
- def _extra_local_variables(self, tp, localvars, freelines):
- if isinstance(tp, model.PointerType):
- localvars.add('Py_ssize_t datasize')
- localvars.add('struct _cffi_freeme_s *large_args_free = NULL')
- freelines.add('if (large_args_free != NULL)'
- ' _cffi_free_array_arguments(large_args_free);')
-
- def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode):
- self._prnt(' datasize = _cffi_prepare_pointer_call_argument(')
- self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % (
- self._gettypenum(tp), fromvar, tovar))
- self._prnt(' if (datasize != 0) {')
- self._prnt(' %s = ((size_t)datasize) <= 640 ? '
- '(%s)alloca((size_t)datasize) : NULL;' % (
- tovar, tp.get_c_name('')))
- self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, '
- '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar))
- self._prnt(' datasize, &large_args_free) < 0)')
- self._prnt(' %s;' % errcode)
- self._prnt(' }')
-
- def _convert_expr_from_c(self, tp, var, context):
- if isinstance(tp, model.BasePrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- return '_cffi_from_c_int(%s, %s)' % (var, tp.name)
- elif isinstance(tp, model.UnknownFloatType):
- return '_cffi_from_c_double(%s)' % (var,)
- elif tp.name != 'long double' and not tp.is_complex_type():
- cname = tp.name.replace(' ', '_')
- if cname in ('char16_t', 'char32_t'):
- self.needs_version(VERSION_CHAR16CHAR32)
- return '_cffi_from_c_%s(%s)' % (cname, var)
- else:
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.ArrayType):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(model.PointerType(tp.item)))
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldnames is None:
- raise TypeError("'%s' is used as %s, but is opaque" % (
- tp._get_c_name(), context))
- return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.EnumType):
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- else:
- raise NotImplementedError(tp)
-
- # ----------
- # typedefs
-
- def _typedef_type(self, tp, name):
- return self._global_type(tp, "(*(%s *)0)" % (name,))
-
- def _generate_cpy_typedef_collecttype(self, tp, name):
- self._do_collect_type(self._typedef_type(tp, name))
-
- def _generate_cpy_typedef_decl(self, tp, name):
- pass
-
- def _typedef_ctx(self, tp, name):
- type_index = self._typesdict[tp]
- self._lsts["typename"].append(TypenameExpr(name, type_index))
-
- def _generate_cpy_typedef_ctx(self, tp, name):
- tp = self._typedef_type(tp, name)
- self._typedef_ctx(tp, name)
- if getattr(tp, "origin", None) == "unknown_type":
- self._struct_ctx(tp, tp.name, approxname=None)
- elif isinstance(tp, model.NamedPointerType):
- self._struct_ctx(tp.totype, tp.totype.name, approxname=tp.name,
- named_ptr=tp)
-
- # ----------
- # function declarations
-
- def _generate_cpy_function_collecttype(self, tp, name):
- self._do_collect_type(tp.as_raw_function())
- if tp.ellipsis and not self.target_is_python:
- self._do_collect_type(tp)
-
- def _generate_cpy_function_decl(self, tp, name):
- assert not self.target_is_python
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no CPython wrapper)
- self._generate_cpy_constant_decl(tp, name)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- if numargs == 0:
- argname = 'noarg'
- elif numargs == 1:
- argname = 'arg0'
- else:
- argname = 'args'
- #
- # ------------------------------
- # the 'd' version of the function, only for addressof(lib, 'func')
- arguments = []
- call_arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arguments.append(type.get_c_name(' x%d' % i, context))
- call_arguments.append('x%d' % i)
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- if tp.abi:
- abi = tp.abi + ' '
- else:
- abi = ''
- name_and_arguments = '%s_cffi_d_%s(%s)' % (abi, name, repr_arguments)
- prnt('static %s' % (tp.result.get_c_name(name_and_arguments),))
- prnt('{')
- call_arguments = ', '.join(call_arguments)
- result_code = 'return '
- if isinstance(tp.result, model.VoidType):
- result_code = ''
- prnt(' %s%s(%s);' % (result_code, name, call_arguments))
- prnt('}')
- #
- prnt('#ifndef PYPY_VERSION') # ------------------------------
- #
- prnt('static PyObject *')
- prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname))
- prnt('{')
- #
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arg = type.get_c_name(' x%d' % i, context)
- prnt(' %s;' % arg)
- #
- localvars = set()
- freelines = set()
- for type in tp.args:
- self._extra_local_variables(type, localvars, freelines)
- for decl in sorted(localvars):
- prnt(' %s;' % (decl,))
- #
- if not isinstance(tp.result, model.VoidType):
- result_code = 'result = '
- context = 'result of %s' % name
- result_decl = ' %s;' % tp.result.get_c_name(' result', context)
- prnt(result_decl)
- prnt(' PyObject *pyresult;')
- else:
- result_decl = None
- result_code = ''
- #
- if len(tp.args) > 1:
- rng = range(len(tp.args))
- for i in rng:
- prnt(' PyObject *arg%d;' % i)
- prnt()
- prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % (
- name, len(rng), len(rng),
- ', '.join(['&arg%d' % i for i in rng])))
- prnt(' return NULL;')
- prnt()
- #
- for i, type in enumerate(tp.args):
- self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i,
- 'return NULL')
- prnt()
- #
- prnt(' Py_BEGIN_ALLOW_THREADS')
- prnt(' _cffi_restore_errno();')
- call_arguments = ['x%d' % i for i in range(len(tp.args))]
- call_arguments = ', '.join(call_arguments)
- prnt(' { %s%s(%s); }' % (result_code, name, call_arguments))
- prnt(' _cffi_save_errno();')
- prnt(' Py_END_ALLOW_THREADS')
- prnt()
- #
- prnt(' (void)self; /* unused */')
- if numargs == 0:
- prnt(' (void)noarg; /* unused */')
- if result_code:
- prnt(' pyresult = %s;' %
- self._convert_expr_from_c(tp.result, 'result', 'result type'))
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' return pyresult;')
- else:
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' Py_INCREF(Py_None);')
- prnt(' return Py_None;')
- prnt('}')
- #
- prnt('#else') # ------------------------------
- #
- # the PyPy version: need to replace struct/union arguments with
- # pointers, and if the result is a struct/union, insert a first
- # arg that is a pointer to the result. We also do that for
- # complex args and return type.
- def need_indirection(type):
- return (isinstance(type, model.StructOrUnion) or
- (isinstance(type, model.PrimitiveType) and
- type.is_complex_type()))
- difference = False
- arguments = []
- call_arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- indirection = ''
- if need_indirection(type):
- indirection = '*'
- difference = True
- arg = type.get_c_name(' %sx%d' % (indirection, i), context)
- arguments.append(arg)
- call_arguments.append('%sx%d' % (indirection, i))
- tp_result = tp.result
- if need_indirection(tp_result):
- context = 'result of %s' % name
- arg = tp_result.get_c_name(' *result', context)
- arguments.insert(0, arg)
- tp_result = model.void_type
- result_decl = None
- result_code = '*result = '
- difference = True
- if difference:
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- name_and_arguments = '%s_cffi_f_%s(%s)' % (abi, name,
- repr_arguments)
- prnt('static %s' % (tp_result.get_c_name(name_and_arguments),))
- prnt('{')
- if result_decl:
- prnt(result_decl)
- call_arguments = ', '.join(call_arguments)
- prnt(' { %s%s(%s); }' % (result_code, name, call_arguments))
- if result_decl:
- prnt(' return result;')
- prnt('}')
- else:
- prnt('# define _cffi_f_%s _cffi_d_%s' % (name, name))
- #
- prnt('#endif') # ------------------------------
- prnt()
-
- def _generate_cpy_function_ctx(self, tp, name):
- if tp.ellipsis and not self.target_is_python:
- self._generate_cpy_constant_ctx(tp, name)
- return
- type_index = self._typesdict[tp.as_raw_function()]
- numargs = len(tp.args)
- if self.target_is_python:
- meth_kind = OP_DLOPEN_FUNC
- elif numargs == 0:
- meth_kind = OP_CPYTHON_BLTN_N # 'METH_NOARGS'
- elif numargs == 1:
- meth_kind = OP_CPYTHON_BLTN_O # 'METH_O'
- else:
- meth_kind = OP_CPYTHON_BLTN_V # 'METH_VARARGS'
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_f_%s' % name,
- CffiOp(meth_kind, type_index),
- size='_cffi_d_%s' % name))
-
- # ----------
- # named structs or unions
-
- def _field_type(self, tp_struct, field_name, tp_field):
- if isinstance(tp_field, model.ArrayType):
- actual_length = tp_field.length
- if actual_length == '...':
- ptr_struct_name = tp_struct.get_c_name('*')
- actual_length = '_cffi_array_len(((%s)0)->%s)' % (
- ptr_struct_name, field_name)
- tp_item = self._field_type(tp_struct, '%s[0]' % field_name,
- tp_field.item)
- tp_field = model.ArrayType(tp_item, actual_length)
- return tp_field
-
- def _struct_collecttype(self, tp):
- self._do_collect_type(tp)
- if self.target_is_python:
- # also requires nested anon struct/unions in ABI mode, recursively
- for fldtype in tp.anonymous_struct_fields():
- self._struct_collecttype(fldtype)
-
- def _struct_decl(self, tp, cname, approxname):
- if tp.fldtypes is None:
- return
- prnt = self._prnt
- checkfuncname = '_cffi_checkfld_%s' % (approxname,)
- prnt('_CFFI_UNUSED_FN')
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in self._enum_fields(tp):
- try:
- if ftype.is_integer_type() or fbitsize >= 0:
- # accept all integers, but complain on float or double
- if fname != '':
- prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is "
- "an integer */" % (fname, cname, fname))
- continue
- # only accept exactly the type declared, except that '[]'
- # is interpreted as a '*' and so will match any array length.
- # (It would also match '*', but that's harder to detect...)
- while (isinstance(ftype, model.ArrayType)
- and (ftype.length is None or ftype.length == '...')):
- ftype = ftype.item
- fname = fname + '[0]'
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- prnt('struct _cffi_align_%s { char x; %s y; };' % (approxname, cname))
- prnt()
-
- def _struct_ctx(self, tp, cname, approxname, named_ptr=None):
- type_index = self._typesdict[tp]
- reason_for_not_expanding = None
- flags = []
- if isinstance(tp, model.UnionType):
- flags.append("_CFFI_F_UNION")
- if tp.fldtypes is None:
- flags.append("_CFFI_F_OPAQUE")
- reason_for_not_expanding = "opaque"
- if (tp not in self.ffi._parser._included_declarations and
- (named_ptr is None or
- named_ptr not in self.ffi._parser._included_declarations)):
- if tp.fldtypes is None:
- pass # opaque
- elif tp.partial or any(tp.anonymous_struct_fields()):
- pass # field layout obtained silently from the C compiler
- else:
- flags.append("_CFFI_F_CHECK_FIELDS")
- if tp.packed:
- if tp.packed > 1:
- raise NotImplementedError(
- "%r is declared with 'pack=%r'; only 0 or 1 are "
- "supported in API mode (try to use \"...;\", which "
- "does not require a 'pack' declaration)" %
- (tp, tp.packed))
- flags.append("_CFFI_F_PACKED")
- else:
- flags.append("_CFFI_F_EXTERNAL")
- reason_for_not_expanding = "external"
- flags = '|'.join(flags) or '0'
- c_fields = []
- if reason_for_not_expanding is None:
- enumfields = list(self._enum_fields(tp))
- for fldname, fldtype, fbitsize, fqual in enumfields:
- fldtype = self._field_type(tp, fldname, fldtype)
- self._check_not_opaque(fldtype,
- "field '%s.%s'" % (tp.name, fldname))
- # cname is None for _add_missing_struct_unions() only
- op = OP_NOOP
- if fbitsize >= 0:
- op = OP_BITFIELD
- size = '%d /* bits */' % fbitsize
- elif cname is None or (
- isinstance(fldtype, model.ArrayType) and
- fldtype.length is None):
- size = '(size_t)-1'
- else:
- size = 'sizeof(((%s)0)->%s)' % (
- tp.get_c_name('*') if named_ptr is None
- else named_ptr.name,
- fldname)
- if cname is None or fbitsize >= 0:
- offset = '(size_t)-1'
- elif named_ptr is not None:
- offset = '((char *)&((%s)0)->%s) - (char *)0' % (
- named_ptr.name, fldname)
- else:
- offset = 'offsetof(%s, %s)' % (tp.get_c_name(''), fldname)
- c_fields.append(
- FieldExpr(fldname, offset, size, fbitsize,
- CffiOp(op, self._typesdict[fldtype])))
- first_field_index = len(self._lsts["field"])
- self._lsts["field"].extend(c_fields)
- #
- if cname is None: # unknown name, for _add_missing_struct_unions
- size = '(size_t)-2'
- align = -2
- comment = "unnamed"
- else:
- if named_ptr is not None:
- size = 'sizeof(*(%s)0)' % (named_ptr.name,)
- align = '-1 /* unknown alignment */'
- else:
- size = 'sizeof(%s)' % (cname,)
- align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,)
- comment = None
- else:
- size = '(size_t)-1'
- align = -1
- first_field_index = -1
- comment = reason_for_not_expanding
- self._lsts["struct_union"].append(
- StructUnionExpr(tp.name, type_index, flags, size, align, comment,
- first_field_index, c_fields))
- self._seen_struct_unions.add(tp)
-
- def _check_not_opaque(self, tp, location):
- while isinstance(tp, model.ArrayType):
- tp = tp.item
- if isinstance(tp, model.StructOrUnion) and tp.fldtypes is None:
- raise TypeError(
- "%s is of an opaque type (not declared in cdef())" % location)
-
- def _add_missing_struct_unions(self):
- # not very nice, but some struct declarations might be missing
- # because they don't have any known C name. Check that they are
- # not partial (we can't complete or verify them!) and emit them
- # anonymously.
- lst = list(self._struct_unions.items())
- lst.sort(key=lambda tp_order: tp_order[1])
- for tp, order in lst:
- if tp not in self._seen_struct_unions:
- if tp.partial:
- raise NotImplementedError("internal inconsistency: %r is "
- "partial but was not seen at "
- "this point" % (tp,))
- if tp.name.startswith('$') and tp.name[1:].isdigit():
- approxname = tp.name[1:]
- elif tp.name == '_IO_FILE' and tp.forcename == 'FILE':
- approxname = 'FILE'
- self._typedef_ctx(tp, 'FILE')
- else:
- raise NotImplementedError("internal inconsistency: %r" %
- (tp,))
- self._struct_ctx(tp, None, approxname)
-
- def _generate_cpy_struct_collecttype(self, tp, name):
- self._struct_collecttype(tp)
- _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype
-
- def _struct_names(self, tp):
- cname = tp.get_c_name('')
- if ' ' in cname:
- return cname, cname.replace(' ', '_')
- else:
- return cname, '_' + cname
-
- def _generate_cpy_struct_decl(self, tp, name):
- self._struct_decl(tp, *self._struct_names(tp))
- _generate_cpy_union_decl = _generate_cpy_struct_decl
-
- def _generate_cpy_struct_ctx(self, tp, name):
- self._struct_ctx(tp, *self._struct_names(tp))
- _generate_cpy_union_ctx = _generate_cpy_struct_ctx
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- def _generate_cpy_anonymous_collecttype(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_collecttype(tp, name)
- else:
- self._struct_collecttype(tp)
-
- def _generate_cpy_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_decl(tp)
- else:
- self._struct_decl(tp, name, 'typedef_' + name)
-
- def _generate_cpy_anonymous_ctx(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._enum_ctx(tp, name)
- else:
- self._struct_ctx(tp, name, 'typedef_' + name)
-
- # ----------
- # constants, declared with "static const ..."
-
- def _generate_cpy_const(self, is_int, name, tp=None, category='const',
- check_value=None):
- if (category, name) in self._seen_constants:
- raise VerificationError(
- "duplicate declaration of %s '%s'" % (category, name))
- self._seen_constants.add((category, name))
- #
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- if is_int:
- prnt('static int %s(unsigned long long *o)' % funcname)
- prnt('{')
- prnt(' int n = (%s) <= 0;' % (name,))
- prnt(' *o = (unsigned long long)((%s) | 0);'
- ' /* check that %s is an integer */' % (name, name))
- if check_value is not None:
- if check_value > 0:
- check_value = '%dU' % (check_value,)
- prnt(' if (!_cffi_check_int(*o, n, %s))' % (check_value,))
- prnt(' n |= 2;')
- prnt(' return n;')
- prnt('}')
- else:
- assert check_value is None
- prnt('static void %s(char *o)' % funcname)
- prnt('{')
- prnt(' *(%s)o = %s;' % (tp.get_c_name('*'), name))
- prnt('}')
- prnt()
-
- def _generate_cpy_constant_collecttype(self, tp, name):
- is_int = tp.is_integer_type()
- if not is_int or self.target_is_python:
- self._do_collect_type(tp)
-
- def _generate_cpy_constant_decl(self, tp, name):
- is_int = tp.is_integer_type()
- self._generate_cpy_const(is_int, name, tp)
-
- def _generate_cpy_constant_ctx(self, tp, name):
- if not self.target_is_python and tp.is_integer_type():
- type_op = CffiOp(OP_CONSTANT_INT, -1)
- else:
- if self.target_is_python:
- const_kind = OP_DLOPEN_CONST
- else:
- const_kind = OP_CONSTANT
- type_index = self._typesdict[tp]
- type_op = CffiOp(const_kind, type_index)
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_const_%s' % name, type_op))
-
- # ----------
- # enums
-
- def _generate_cpy_enum_collecttype(self, tp, name):
- self._do_collect_type(tp)
-
- def _generate_cpy_enum_decl(self, tp, name=None):
- for enumerator in tp.enumerators:
- self._generate_cpy_const(True, enumerator)
-
- def _enum_ctx(self, tp, cname):
- type_index = self._typesdict[tp]
- type_op = CffiOp(OP_ENUM, -1)
- if self.target_is_python:
- tp.check_not_partial()
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._lsts["global"].append(
- GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op,
- check_value=enumvalue))
- #
- if cname is not None and '$' not in cname and not self.target_is_python:
- size = "sizeof(%s)" % cname
- signed = "((%s)-1) <= 0" % cname
- else:
- basetp = tp.build_baseinttype(self.ffi, [])
- size = self.ffi.sizeof(basetp)
- signed = int(int(self.ffi.cast(basetp, -1)) < 0)
- allenums = ",".join(tp.enumerators)
- self._lsts["enum"].append(
- EnumExpr(tp.name, type_index, size, signed, allenums))
-
- def _generate_cpy_enum_ctx(self, tp, name):
- self._enum_ctx(tp, tp._get_c_name())
-
- # ----------
- # macros: for now only for integers
-
- def _generate_cpy_macro_collecttype(self, tp, name):
- pass
-
- def _generate_cpy_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_cpy_const(True, name, check_value=check_value)
-
- def _generate_cpy_macro_ctx(self, tp, name):
- if tp == '...':
- if self.target_is_python:
- raise VerificationError(
- "cannot use the syntax '...' in '#define %s ...' when "
- "using the ABI mode" % (name,))
- check_value = None
- else:
- check_value = tp # an integer
- type_op = CffiOp(OP_CONSTANT_INT, -1)
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_const_%s' % name, type_op,
- check_value=check_value))
-
- # ----------
- # global variables
-
- def _global_type(self, tp, global_name):
- if isinstance(tp, model.ArrayType):
- actual_length = tp.length
- if actual_length == '...':
- actual_length = '_cffi_array_len(%s)' % (global_name,)
- tp_item = self._global_type(tp.item, '%s[0]' % global_name)
- tp = model.ArrayType(tp_item, actual_length)
- return tp
-
- def _generate_cpy_variable_collecttype(self, tp, name):
- self._do_collect_type(self._global_type(tp, name))
-
- def _generate_cpy_variable_decl(self, tp, name):
- prnt = self._prnt
- tp = self._global_type(tp, name)
- if isinstance(tp, model.ArrayType) and tp.length is None:
- tp = tp.item
- ampersand = ''
- else:
- ampersand = '&'
- # This code assumes that casts from "tp *" to "void *" is a
- # no-op, i.e. a function that returns a "tp *" can be called
- # as if it returned a "void *". This should be generally true
- # on any modern machine. The only exception to that rule (on
- # uncommon architectures, and as far as I can tell) might be
- # if 'tp' were a function type, but that is not possible here.
- # (If 'tp' is a function _pointer_ type, then casts from "fn_t
- # **" to "void *" are again no-ops, as far as I can tell.)
- decl = '*_cffi_var_%s(void)' % (name,)
- prnt('static ' + tp.get_c_name(decl, quals=self._current_quals))
- prnt('{')
- prnt(' return %s(%s);' % (ampersand, name))
- prnt('}')
- prnt()
-
- def _generate_cpy_variable_ctx(self, tp, name):
- tp = self._global_type(tp, name)
- type_index = self._typesdict[tp]
- if self.target_is_python:
- op = OP_GLOBAL_VAR
- else:
- op = OP_GLOBAL_VAR_F
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_var_%s' % name, CffiOp(op, type_index)))
-
- # ----------
- # extern "Python"
-
- def _generate_cpy_extern_python_collecttype(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- self._do_collect_type(tp)
- _generate_cpy_dllexport_python_collecttype = \
- _generate_cpy_extern_python_plus_c_collecttype = \
- _generate_cpy_extern_python_collecttype
-
- def _extern_python_decl(self, tp, name, tag_and_space):
- prnt = self._prnt
- if isinstance(tp.result, model.VoidType):
- size_of_result = '0'
- else:
- context = 'result of %s' % name
- size_of_result = '(int)sizeof(%s)' % (
- tp.result.get_c_name('', context),)
- prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name)
- prnt(' { "%s.%s", %s, 0, 0 };' % (
- self.module_name, name, size_of_result))
- prnt()
- #
- arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arg = type.get_c_name(' a%d' % i, context)
- arguments.append(arg)
- #
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- name_and_arguments = '%s(%s)' % (name, repr_arguments)
- if tp.abi == "__stdcall":
- name_and_arguments = '_cffi_stdcall ' + name_and_arguments
- #
- def may_need_128_bits(tp):
- return (isinstance(tp, model.PrimitiveType) and
- tp.name == 'long double')
- #
- size_of_a = max(len(tp.args)*8, 8)
- if may_need_128_bits(tp.result):
- size_of_a = max(size_of_a, 16)
- if isinstance(tp.result, model.StructOrUnion):
- size_of_a = 'sizeof(%s) > %d ? sizeof(%s) : %d' % (
- tp.result.get_c_name(''), size_of_a,
- tp.result.get_c_name(''), size_of_a)
- prnt('%s%s' % (tag_and_space, tp.result.get_c_name(name_and_arguments)))
- prnt('{')
- prnt(' char a[%s];' % size_of_a)
- prnt(' char *p = a;')
- for i, type in enumerate(tp.args):
- arg = 'a%d' % i
- if (isinstance(type, model.StructOrUnion) or
- may_need_128_bits(type)):
- arg = '&' + arg
- type = model.PointerType(type)
- prnt(' *(%s)(p + %d) = %s;' % (type.get_c_name('*'), i*8, arg))
- prnt(' _cffi_call_python(&_cffi_externpy__%s, p);' % name)
- if not isinstance(tp.result, model.VoidType):
- prnt(' return *(%s)p;' % (tp.result.get_c_name('*'),))
- prnt('}')
- prnt()
- self._num_externpy += 1
-
- def _generate_cpy_extern_python_decl(self, tp, name):
- self._extern_python_decl(tp, name, 'static ')
-
- def _generate_cpy_dllexport_python_decl(self, tp, name):
- self._extern_python_decl(tp, name, 'CFFI_DLLEXPORT ')
-
- def _generate_cpy_extern_python_plus_c_decl(self, tp, name):
- self._extern_python_decl(tp, name, '')
-
- def _generate_cpy_extern_python_ctx(self, tp, name):
- if self.target_is_python:
- raise VerificationError(
- "cannot use 'extern \"Python\"' in the ABI mode")
- if tp.ellipsis:
- raise NotImplementedError("a vararg function is extern \"Python\"")
- type_index = self._typesdict[tp]
- type_op = CffiOp(OP_EXTERN_PYTHON, type_index)
- self._lsts["global"].append(
- GlobalExpr(name, '&_cffi_externpy__%s' % name, type_op, name))
-
- _generate_cpy_dllexport_python_ctx = \
- _generate_cpy_extern_python_plus_c_ctx = \
- _generate_cpy_extern_python_ctx
-
- def _print_string_literal_in_array(self, s):
- prnt = self._prnt
- prnt('// # NB. this is not a string because of a size limit in MSVC')
- if not isinstance(s, bytes): # unicode
- s = s.encode('utf-8') # -> bytes
- else:
- s.decode('utf-8') # got bytes, check for valid utf-8
- try:
- s.decode('ascii')
- except UnicodeDecodeError:
- s = b'# -*- encoding: utf8 -*-\n' + s
- for line in s.splitlines(True):
- comment = line
- if type('//') is bytes: # python2
- line = map(ord, line) # make a list of integers
- else: # python3
- # type(line) is bytes, which enumerates like a list of integers
- comment = ascii(comment)[1:-1]
- prnt(('// ' + comment).rstrip())
- printed_line = ''
- for c in line:
- if len(printed_line) >= 76:
- prnt(printed_line)
- printed_line = ''
- printed_line += '%d,' % (c,)
- prnt(printed_line)
-
- # ----------
- # emitting the opcodes for individual types
-
- def _emit_bytecode_VoidType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, PRIM_VOID)
-
- def _emit_bytecode_PrimitiveType(self, tp, index):
- prim_index = PRIMITIVE_TO_INDEX[tp.name]
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, prim_index)
-
- def _emit_bytecode_UnknownIntegerType(self, tp, index):
- s = ('_cffi_prim_int(sizeof(%s), (\n'
- ' ((%s)-1) | 0 /* check that %s is an integer type */\n'
- ' ) <= 0)' % (tp.name, tp.name, tp.name))
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s)
-
- def _emit_bytecode_UnknownFloatType(self, tp, index):
- s = ('_cffi_prim_float(sizeof(%s) *\n'
- ' (((%s)1) / 2) * 2 /* integer => 0, float => 1 */\n'
- ' )' % (tp.name, tp.name))
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s)
-
- def _emit_bytecode_RawFunctionType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_FUNCTION, self._typesdict[tp.result])
- index += 1
- for tp1 in tp.args:
- realindex = self._typesdict[tp1]
- if index != realindex:
- if isinstance(tp1, model.PrimitiveType):
- self._emit_bytecode_PrimitiveType(tp1, index)
- else:
- self.cffi_types[index] = CffiOp(OP_NOOP, realindex)
- index += 1
- flags = int(tp.ellipsis)
- if tp.abi is not None:
- if tp.abi == '__stdcall':
- flags |= 2
- else:
- raise NotImplementedError("abi=%r" % (tp.abi,))
- self.cffi_types[index] = CffiOp(OP_FUNCTION_END, flags)
-
- def _emit_bytecode_PointerType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[tp.totype])
-
- _emit_bytecode_ConstPointerType = _emit_bytecode_PointerType
- _emit_bytecode_NamedPointerType = _emit_bytecode_PointerType
-
- def _emit_bytecode_FunctionPtrType(self, tp, index):
- raw = tp.as_raw_function()
- self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[raw])
-
- def _emit_bytecode_ArrayType(self, tp, index):
- item_index = self._typesdict[tp.item]
- if tp.length is None:
- self.cffi_types[index] = CffiOp(OP_OPEN_ARRAY, item_index)
- elif tp.length == '...':
- raise VerificationError(
- "type %s badly placed: the '...' array length can only be "
- "used on global arrays or on fields of structures" % (
- str(tp).replace('/*...*/', '...'),))
- else:
- assert self.cffi_types[index + 1] == 'LEN'
- self.cffi_types[index] = CffiOp(OP_ARRAY, item_index)
- self.cffi_types[index + 1] = CffiOp(None, str(tp.length))
-
- def _emit_bytecode_StructType(self, tp, index):
- struct_index = self._struct_unions[tp]
- self.cffi_types[index] = CffiOp(OP_STRUCT_UNION, struct_index)
- _emit_bytecode_UnionType = _emit_bytecode_StructType
-
- def _emit_bytecode_EnumType(self, tp, index):
- enum_index = self._enums[tp]
- self.cffi_types[index] = CffiOp(OP_ENUM, enum_index)
-
-
-if sys.version_info >= (3,):
- NativeIO = io.StringIO
-else:
- class NativeIO(io.BytesIO):
- def write(self, s):
- if isinstance(s, unicode):
- s = s.encode('ascii')
- super(NativeIO, self).write(s)
-
-def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose):
- if verbose:
- print("generating %s" % (target_file,))
- recompiler = Recompiler(ffi, module_name,
- target_is_python=(preamble is None))
- recompiler.collect_type_table()
- recompiler.collect_step_tables()
- f = NativeIO()
- recompiler.write_source_to_f(f, preamble)
- output = f.getvalue()
- try:
- with open(target_file, 'r') as f1:
- if f1.read(len(output) + 1) != output:
- raise IOError
- if verbose:
- print("(already up-to-date)")
- return False # already up-to-date
- except IOError:
- tmp_file = '%s.~%d' % (target_file, os.getpid())
- with open(tmp_file, 'w') as f1:
- f1.write(output)
- try:
- os.rename(tmp_file, target_file)
- except OSError:
- os.unlink(target_file)
- os.rename(tmp_file, target_file)
- return True
-
-def make_c_source(ffi, module_name, preamble, target_c_file, verbose=False):
- assert preamble is not None
- return _make_c_or_py_source(ffi, module_name, preamble, target_c_file,
- verbose)
-
-def make_py_source(ffi, module_name, target_py_file, verbose=False):
- return _make_c_or_py_source(ffi, module_name, None, target_py_file,
- verbose)
-
-def _modname_to_file(outputdir, modname, extension):
- parts = modname.split('.')
- try:
- os.makedirs(os.path.join(outputdir, *parts[:-1]))
- except OSError:
- pass
- parts[-1] += extension
- return os.path.join(outputdir, *parts), parts
-
-
-# Aaargh. Distutils is not tested at all for the purpose of compiling
-# DLLs that are not extension modules. Here are some hacks to work
-# around that, in the _patch_for_*() functions...
-
-def _patch_meth(patchlist, cls, name, new_meth):
- old = getattr(cls, name)
- patchlist.append((cls, name, old))
- setattr(cls, name, new_meth)
- return old
-
-def _unpatch_meths(patchlist):
- for cls, name, old_meth in reversed(patchlist):
- setattr(cls, name, old_meth)
-
-def _patch_for_embedding(patchlist):
- if sys.platform == 'win32':
- # we must not remove the manifest when building for embedding!
- from distutils.msvc9compiler import MSVCCompiler
- _patch_meth(patchlist, MSVCCompiler, '_remove_visual_c_ref',
- lambda self, manifest_file: manifest_file)
-
- if sys.platform == 'darwin':
- # we must not make a '-bundle', but a '-dynamiclib' instead
- from distutils.ccompiler import CCompiler
- def my_link_shared_object(self, *args, **kwds):
- if '-bundle' in self.linker_so:
- self.linker_so = list(self.linker_so)
- i = self.linker_so.index('-bundle')
- self.linker_so[i] = '-dynamiclib'
- return old_link_shared_object(self, *args, **kwds)
- old_link_shared_object = _patch_meth(patchlist, CCompiler,
- 'link_shared_object',
- my_link_shared_object)
-
-def _patch_for_target(patchlist, target):
- from distutils.command.build_ext import build_ext
- # if 'target' is different from '*', we need to patch some internal
- # method to just return this 'target' value, instead of having it
- # built from module_name
- if target.endswith('.*'):
- target = target[:-2]
- if sys.platform == 'win32':
- target += '.dll'
- elif sys.platform == 'darwin':
- target += '.dylib'
- else:
- target += '.so'
- _patch_meth(patchlist, build_ext, 'get_ext_filename',
- lambda self, ext_name: target)
-
-
-def recompile(ffi, module_name, preamble, tmpdir='.', call_c_compiler=True,
- c_file=None, source_extension='.c', extradir=None,
- compiler_verbose=1, target=None, debug=None, **kwds):
- if not isinstance(module_name, str):
- module_name = module_name.encode('ascii')
- if ffi._windows_unicode:
- ffi._apply_windows_unicode(kwds)
- if preamble is not None:
- embedding = (ffi._embedding is not None)
- if embedding:
- ffi._apply_embedding_fix(kwds)
- if c_file is None:
- c_file, parts = _modname_to_file(tmpdir, module_name,
- source_extension)
- if extradir:
- parts = [extradir] + parts
- ext_c_file = os.path.join(*parts)
- else:
- ext_c_file = c_file
- #
- if target is None:
- if embedding:
- target = '%s.*' % module_name
- else:
- target = '*'
- #
- ext = ffiplatform.get_extension(ext_c_file, module_name, **kwds)
- updated = make_c_source(ffi, module_name, preamble, c_file,
- verbose=compiler_verbose)
- if call_c_compiler:
- patchlist = []
- cwd = os.getcwd()
- try:
- if embedding:
- _patch_for_embedding(patchlist)
- if target != '*':
- _patch_for_target(patchlist, target)
- if compiler_verbose:
- if tmpdir == '.':
- msg = 'the current directory is'
- else:
- msg = 'setting the current directory to'
- print('%s %r' % (msg, os.path.abspath(tmpdir)))
- os.chdir(tmpdir)
- outputfilename = ffiplatform.compile('.', ext,
- compiler_verbose, debug)
- finally:
- os.chdir(cwd)
- _unpatch_meths(patchlist)
- return outputfilename
- else:
- return ext, updated
- else:
- if c_file is None:
- c_file, _ = _modname_to_file(tmpdir, module_name, '.py')
- updated = make_py_source(ffi, module_name, c_file,
- verbose=compiler_verbose)
- if call_c_compiler:
- return c_file
- else:
- return None, updated
-
diff --git a/resources/python/bin/3.7/linux/cffi/setuptools_ext.py b/resources/python/bin/3.7/linux/cffi/setuptools_ext.py
deleted file mode 100644
index 8fe361487..000000000
--- a/resources/python/bin/3.7/linux/cffi/setuptools_ext.py
+++ /dev/null
@@ -1,219 +0,0 @@
-import os
-import sys
-
-try:
- basestring
-except NameError:
- # Python 3.x
- basestring = str
-
-def error(msg):
- from distutils.errors import DistutilsSetupError
- raise DistutilsSetupError(msg)
-
-
-def execfile(filename, glob):
- # We use execfile() (here rewritten for Python 3) instead of
- # __import__() to load the build script. The problem with
- # a normal import is that in some packages, the intermediate
- # __init__.py files may already try to import the file that
- # we are generating.
- with open(filename) as f:
- src = f.read()
- src += '\n' # Python 2.6 compatibility
- code = compile(src, filename, 'exec')
- exec(code, glob, glob)
-
-
-def add_cffi_module(dist, mod_spec):
- from cffi.api import FFI
-
- if not isinstance(mod_spec, basestring):
- error("argument to 'cffi_modules=...' must be a str or a list of str,"
- " not %r" % (type(mod_spec).__name__,))
- mod_spec = str(mod_spec)
- try:
- build_file_name, ffi_var_name = mod_spec.split(':')
- except ValueError:
- error("%r must be of the form 'path/build.py:ffi_variable'" %
- (mod_spec,))
- if not os.path.exists(build_file_name):
- ext = ''
- rewritten = build_file_name.replace('.', '/') + '.py'
- if os.path.exists(rewritten):
- ext = ' (rewrite cffi_modules to [%r])' % (
- rewritten + ':' + ffi_var_name,)
- error("%r does not name an existing file%s" % (build_file_name, ext))
-
- mod_vars = {'__name__': '__cffi__', '__file__': build_file_name}
- execfile(build_file_name, mod_vars)
-
- try:
- ffi = mod_vars[ffi_var_name]
- except KeyError:
- error("%r: object %r not found in module" % (mod_spec,
- ffi_var_name))
- if not isinstance(ffi, FFI):
- ffi = ffi() # maybe it's a function instead of directly an ffi
- if not isinstance(ffi, FFI):
- error("%r is not an FFI instance (got %r)" % (mod_spec,
- type(ffi).__name__))
- if not hasattr(ffi, '_assigned_source'):
- error("%r: the set_source() method was not called" % (mod_spec,))
- module_name, source, source_extension, kwds = ffi._assigned_source
- if ffi._windows_unicode:
- kwds = kwds.copy()
- ffi._apply_windows_unicode(kwds)
-
- if source is None:
- _add_py_module(dist, ffi, module_name)
- else:
- _add_c_module(dist, ffi, module_name, source, source_extension, kwds)
-
-def _set_py_limited_api(Extension, kwds):
- """
- Add py_limited_api to kwds if setuptools >= 26 is in use.
- Do not alter the setting if it already exists.
- Setuptools takes care of ignoring the flag on Python 2 and PyPy.
-
- CPython itself should ignore the flag in a debugging version
- (by not listing .abi3.so in the extensions it supports), but
- it doesn't so far, creating troubles. That's why we check
- for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent
- of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401)
-
- On Windows, with CPython <= 3.4, it's better not to use py_limited_api
- because virtualenv *still* doesn't copy PYTHON3.DLL on these versions.
- Recently (2020) we started shipping only >= 3.5 wheels, though. So
- we'll give it another try and set py_limited_api on Windows >= 3.5.
- """
- from cffi import recompiler
-
- if ('py_limited_api' not in kwds and not hasattr(sys, 'gettotalrefcount')
- and recompiler.USE_LIMITED_API):
- import setuptools
- try:
- setuptools_major_version = int(setuptools.__version__.partition('.')[0])
- if setuptools_major_version >= 26:
- kwds['py_limited_api'] = True
- except ValueError: # certain development versions of setuptools
- # If we don't know the version number of setuptools, we
- # try to set 'py_limited_api' anyway. At worst, we get a
- # warning.
- kwds['py_limited_api'] = True
- return kwds
-
-def _add_c_module(dist, ffi, module_name, source, source_extension, kwds):
- from distutils.core import Extension
- # We are a setuptools extension. Need this build_ext for py_limited_api.
- from setuptools.command.build_ext import build_ext
- from distutils.dir_util import mkpath
- from distutils import log
- from cffi import recompiler
-
- allsources = ['$PLACEHOLDER']
- allsources.extend(kwds.pop('sources', []))
- kwds = _set_py_limited_api(Extension, kwds)
- ext = Extension(name=module_name, sources=allsources, **kwds)
-
- def make_mod(tmpdir, pre_run=None):
- c_file = os.path.join(tmpdir, module_name + source_extension)
- log.info("generating cffi module %r" % c_file)
- mkpath(tmpdir)
- # a setuptools-only, API-only hook: called with the "ext" and "ffi"
- # arguments just before we turn the ffi into C code. To use it,
- # subclass the 'distutils.command.build_ext.build_ext' class and
- # add a method 'def pre_run(self, ext, ffi)'.
- if pre_run is not None:
- pre_run(ext, ffi)
- updated = recompiler.make_c_source(ffi, module_name, source, c_file)
- if not updated:
- log.info("already up-to-date")
- return c_file
-
- if dist.ext_modules is None:
- dist.ext_modules = []
- dist.ext_modules.append(ext)
-
- base_class = dist.cmdclass.get('build_ext', build_ext)
- class build_ext_make_mod(base_class):
- def run(self):
- if ext.sources[0] == '$PLACEHOLDER':
- pre_run = getattr(self, 'pre_run', None)
- ext.sources[0] = make_mod(self.build_temp, pre_run)
- base_class.run(self)
- dist.cmdclass['build_ext'] = build_ext_make_mod
- # NB. multiple runs here will create multiple 'build_ext_make_mod'
- # classes. Even in this case the 'build_ext' command should be
- # run once; but just in case, the logic above does nothing if
- # called again.
-
-
-def _add_py_module(dist, ffi, module_name):
- from distutils.dir_util import mkpath
- from setuptools.command.build_py import build_py
- from setuptools.command.build_ext import build_ext
- from distutils import log
- from cffi import recompiler
-
- def generate_mod(py_file):
- log.info("generating cffi module %r" % py_file)
- mkpath(os.path.dirname(py_file))
- updated = recompiler.make_py_source(ffi, module_name, py_file)
- if not updated:
- log.info("already up-to-date")
-
- base_class = dist.cmdclass.get('build_py', build_py)
- class build_py_make_mod(base_class):
- def run(self):
- base_class.run(self)
- module_path = module_name.split('.')
- module_path[-1] += '.py'
- generate_mod(os.path.join(self.build_lib, *module_path))
- def get_source_files(self):
- # This is called from 'setup.py sdist' only. Exclude
- # the generate .py module in this case.
- saved_py_modules = self.py_modules
- try:
- if saved_py_modules:
- self.py_modules = [m for m in saved_py_modules
- if m != module_name]
- return base_class.get_source_files(self)
- finally:
- self.py_modules = saved_py_modules
- dist.cmdclass['build_py'] = build_py_make_mod
-
- # distutils and setuptools have no notion I could find of a
- # generated python module. If we don't add module_name to
- # dist.py_modules, then things mostly work but there are some
- # combination of options (--root and --record) that will miss
- # the module. So we add it here, which gives a few apparently
- # harmless warnings about not finding the file outside the
- # build directory.
- # Then we need to hack more in get_source_files(); see above.
- if dist.py_modules is None:
- dist.py_modules = []
- dist.py_modules.append(module_name)
-
- # the following is only for "build_ext -i"
- base_class_2 = dist.cmdclass.get('build_ext', build_ext)
- class build_ext_make_mod(base_class_2):
- def run(self):
- base_class_2.run(self)
- if self.inplace:
- # from get_ext_fullpath() in distutils/command/build_ext.py
- module_path = module_name.split('.')
- package = '.'.join(module_path[:-1])
- build_py = self.get_finalized_command('build_py')
- package_dir = build_py.get_package_dir(package)
- file_name = module_path[-1] + '.py'
- generate_mod(os.path.join(package_dir, file_name))
- dist.cmdclass['build_ext'] = build_ext_make_mod
-
-def cffi_modules(dist, attr, value):
- assert attr == 'cffi_modules'
- if isinstance(value, basestring):
- value = [value]
-
- for cffi_module in value:
- add_cffi_module(dist, cffi_module)
diff --git a/resources/python/bin/3.7/linux/cffi/vengine_cpy.py b/resources/python/bin/3.7/linux/cffi/vengine_cpy.py
deleted file mode 100644
index 6de0df0ea..000000000
--- a/resources/python/bin/3.7/linux/cffi/vengine_cpy.py
+++ /dev/null
@@ -1,1076 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, imp
-from . import model
-from .error import VerificationError
-
-
-class VCPythonEngine(object):
- _class_key = 'x'
- _gen_python_module = True
-
- def __init__(self, verifier):
- self.verifier = verifier
- self.ffi = verifier.ffi
- self._struct_pending_verification = {}
- self._types_of_builtin_functions = {}
-
- def patch_extension_kwds(self, kwds):
- pass
-
- def find_module(self, module_name, path, so_suffixes):
- try:
- f, filename, descr = imp.find_module(module_name, path)
- except ImportError:
- return None
- if f is not None:
- f.close()
- # Note that after a setuptools installation, there are both .py
- # and .so files with the same basename. The code here relies on
- # imp.find_module() locating the .so in priority.
- if descr[0] not in so_suffixes:
- return None
- return filename
-
- def collect_types(self):
- self._typesdict = {}
- self._generate("collecttype")
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def _gettypenum(self, type):
- # a KeyError here is a bug. please report it! :-)
- return self._typesdict[type]
-
- def _do_collect_type(self, tp):
- if ((not isinstance(tp, model.PrimitiveType)
- or tp.name == 'long double')
- and tp not in self._typesdict):
- num = len(self._typesdict)
- self._typesdict[tp] = num
-
- def write_source_to_f(self):
- self.collect_types()
- #
- # The new module will have a _cffi_setup() function that receives
- # objects from the ffi world, and that calls some setup code in
- # the module. This setup code is split in several independent
- # functions, e.g. one per constant. The functions are "chained"
- # by ending in a tail call to each other.
- #
- # This is further split in two chained lists, depending on if we
- # can do it at import-time or if we must wait for _cffi_setup() to
- # provide us with the objects. This is needed because we
- # need the values of the enum constants in order to build the
- # that we may have to pass to _cffi_setup().
- #
- # The following two 'chained_list_constants' items contains
- # the head of these two chained lists, as a string that gives the
- # call to do, if any.
- self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)']
- #
- prnt = self._prnt
- # first paste some standard set of lines that are mostly '#define'
- prnt(cffimod_header)
- prnt()
- # then paste the C source given by the user, verbatim.
- prnt(self.verifier.preamble)
- prnt()
- #
- # call generate_cpy_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._generate("decl")
- #
- # implement the function _cffi_setup_custom() as calling the
- # head of the chained list.
- self._generate_setup_custom()
- prnt()
- #
- # produce the method table, including the entries for the
- # generated Python->C function wrappers, which are done
- # by generate_cpy_function_method().
- prnt('static PyMethodDef _cffi_methods[] = {')
- self._generate("method")
- prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},')
- prnt(' {NULL, NULL, 0, NULL} /* Sentinel */')
- prnt('};')
- prnt()
- #
- # standard init.
- modname = self.verifier.get_module_name()
- constants = self._chained_list_constants[False]
- prnt('#if PY_MAJOR_VERSION >= 3')
- prnt()
- prnt('static struct PyModuleDef _cffi_module_def = {')
- prnt(' PyModuleDef_HEAD_INIT,')
- prnt(' "%s",' % modname)
- prnt(' NULL,')
- prnt(' -1,')
- prnt(' _cffi_methods,')
- prnt(' NULL, NULL, NULL, NULL')
- prnt('};')
- prnt()
- prnt('PyMODINIT_FUNC')
- prnt('PyInit_%s(void)' % modname)
- prnt('{')
- prnt(' PyObject *lib;')
- prnt(' lib = PyModule_Create(&_cffi_module_def);')
- prnt(' if (lib == NULL)')
- prnt(' return NULL;')
- prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,))
- prnt(' Py_DECREF(lib);')
- prnt(' return NULL;')
- prnt(' }')
- prnt(' return lib;')
- prnt('}')
- prnt()
- prnt('#else')
- prnt()
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % modname)
- prnt('{')
- prnt(' PyObject *lib;')
- prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname)
- prnt(' if (lib == NULL)')
- prnt(' return;')
- prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,))
- prnt(' return;')
- prnt(' return;')
- prnt('}')
- prnt()
- prnt('#endif')
-
- def load_library(self, flags=None):
- # XXX review all usages of 'self' here!
- # import it as a new extension module
- imp.acquire_lock()
- try:
- if hasattr(sys, "getdlopenflags"):
- previous_flags = sys.getdlopenflags()
- try:
- if hasattr(sys, "setdlopenflags") and flags is not None:
- sys.setdlopenflags(flags)
- module = imp.load_dynamic(self.verifier.get_module_name(),
- self.verifier.modulefilename)
- except ImportError as e:
- error = "importing %r: %s" % (self.verifier.modulefilename, e)
- raise VerificationError(error)
- finally:
- if hasattr(sys, "setdlopenflags"):
- sys.setdlopenflags(previous_flags)
- finally:
- imp.release_lock()
- #
- # call loading_cpy_struct() to get the struct layout inferred by
- # the C compiler
- self._load(module, 'loading')
- #
- # the C code will need the objects. Collect them in
- # order in a list.
- revmapping = dict([(value, key)
- for (key, value) in self._typesdict.items()])
- lst = [revmapping[i] for i in range(len(revmapping))]
- lst = list(map(self.ffi._get_cached_btype, lst))
- #
- # build the FFILibrary class and instance and call _cffi_setup().
- # this will set up some fields like '_cffi_types', and only then
- # it will invoke the chained list of functions that will really
- # build (notably) the constant objects, as if they are
- # pointers, and store them as attributes on the 'library' object.
- class FFILibrary(object):
- _cffi_python_module = module
- _cffi_ffi = self.ffi
- _cffi_dir = []
- def __dir__(self):
- return FFILibrary._cffi_dir + list(self.__dict__)
- library = FFILibrary()
- if module._cffi_setup(lst, VerificationError, library):
- import warnings
- warnings.warn("reimporting %r might overwrite older definitions"
- % (self.verifier.get_module_name()))
- #
- # finally, call the loaded_cpy_xxx() functions. This will perform
- # the final adjustments, like copying the Python->C wrapper
- # functions from the module to the 'library' object, and setting
- # up the FFILibrary class with properties for the global C variables.
- self._load(module, 'loaded', library=library)
- module._cffi_original_ffi = self.ffi
- module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions
- return library
-
- def _get_declarations(self):
- lst = [(key, tp) for (key, (tp, qual)) in
- self.ffi._parser._declarations.items()]
- lst.sort()
- return lst
-
- def _generate(self, step_name):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_cpy_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in verify(): %r" % name)
- try:
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _load(self, module, step_name, **kwds):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- method = getattr(self, '_%s_cpy_%s' % (step_name, kind))
- try:
- method(tp, realname, module, **kwds)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _generate_nothing(self, tp, name):
- pass
-
- def _loaded_noop(self, tp, name, module, **kwds):
- pass
-
- # ----------
-
- def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode):
- extraarg = ''
- if isinstance(tp, model.PrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- converter = '_cffi_to_c_int'
- extraarg = ', %s' % tp.name
- else:
- converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''),
- tp.name.replace(' ', '_'))
- errvalue = '-1'
- #
- elif isinstance(tp, model.PointerType):
- self._convert_funcarg_to_c_ptr_or_array(tp, fromvar,
- tovar, errcode)
- return
- #
- elif isinstance(tp, (model.StructOrUnion, model.EnumType)):
- # a struct (not a struct pointer) as a function argument
- self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)'
- % (tovar, self._gettypenum(tp), fromvar))
- self._prnt(' %s;' % errcode)
- return
- #
- elif isinstance(tp, model.FunctionPtrType):
- converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('')
- extraarg = ', _cffi_type(%d)' % self._gettypenum(tp)
- errvalue = 'NULL'
- #
- else:
- raise NotImplementedError(tp)
- #
- self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg))
- self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % (
- tovar, tp.get_c_name(''), errvalue))
- self._prnt(' %s;' % errcode)
-
- def _extra_local_variables(self, tp, localvars, freelines):
- if isinstance(tp, model.PointerType):
- localvars.add('Py_ssize_t datasize')
- localvars.add('struct _cffi_freeme_s *large_args_free = NULL')
- freelines.add('if (large_args_free != NULL)'
- ' _cffi_free_array_arguments(large_args_free);')
-
- def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode):
- self._prnt(' datasize = _cffi_prepare_pointer_call_argument(')
- self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % (
- self._gettypenum(tp), fromvar, tovar))
- self._prnt(' if (datasize != 0) {')
- self._prnt(' %s = ((size_t)datasize) <= 640 ? '
- 'alloca((size_t)datasize) : NULL;' % (tovar,))
- self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, '
- '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar))
- self._prnt(' datasize, &large_args_free) < 0)')
- self._prnt(' %s;' % errcode)
- self._prnt(' }')
-
- def _convert_expr_from_c(self, tp, var, context):
- if isinstance(tp, model.PrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- return '_cffi_from_c_int(%s, %s)' % (var, tp.name)
- elif tp.name != 'long double':
- return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var)
- else:
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.ArrayType):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(model.PointerType(tp.item)))
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldnames is None:
- raise TypeError("'%s' is used as %s, but is opaque" % (
- tp._get_c_name(), context))
- return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.EnumType):
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- else:
- raise NotImplementedError(tp)
-
- # ----------
- # typedefs: generates no code so far
-
- _generate_cpy_typedef_collecttype = _generate_nothing
- _generate_cpy_typedef_decl = _generate_nothing
- _generate_cpy_typedef_method = _generate_nothing
- _loading_cpy_typedef = _loaded_noop
- _loaded_cpy_typedef = _loaded_noop
-
- # ----------
- # function declarations
-
- def _generate_cpy_function_collecttype(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- self._do_collect_type(tp)
- else:
- # don't call _do_collect_type(tp) in this common case,
- # otherwise test_autofilled_struct_as_argument fails
- for type in tp.args:
- self._do_collect_type(type)
- self._do_collect_type(tp.result)
-
- def _generate_cpy_function_decl(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no CPython wrapper)
- self._generate_cpy_const(False, name, tp)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- if numargs == 0:
- argname = 'noarg'
- elif numargs == 1:
- argname = 'arg0'
- else:
- argname = 'args'
- prnt('static PyObject *')
- prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname))
- prnt('{')
- #
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- prnt(' %s;' % type.get_c_name(' x%d' % i, context))
- #
- localvars = set()
- freelines = set()
- for type in tp.args:
- self._extra_local_variables(type, localvars, freelines)
- for decl in sorted(localvars):
- prnt(' %s;' % (decl,))
- #
- if not isinstance(tp.result, model.VoidType):
- result_code = 'result = '
- context = 'result of %s' % name
- prnt(' %s;' % tp.result.get_c_name(' result', context))
- prnt(' PyObject *pyresult;')
- else:
- result_code = ''
- #
- if len(tp.args) > 1:
- rng = range(len(tp.args))
- for i in rng:
- prnt(' PyObject *arg%d;' % i)
- prnt()
- prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % (
- 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng])))
- prnt(' return NULL;')
- prnt()
- #
- for i, type in enumerate(tp.args):
- self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i,
- 'return NULL')
- prnt()
- #
- prnt(' Py_BEGIN_ALLOW_THREADS')
- prnt(' _cffi_restore_errno();')
- prnt(' { %s%s(%s); }' % (
- result_code, name,
- ', '.join(['x%d' % i for i in range(len(tp.args))])))
- prnt(' _cffi_save_errno();')
- prnt(' Py_END_ALLOW_THREADS')
- prnt()
- #
- prnt(' (void)self; /* unused */')
- if numargs == 0:
- prnt(' (void)noarg; /* unused */')
- if result_code:
- prnt(' pyresult = %s;' %
- self._convert_expr_from_c(tp.result, 'result', 'result type'))
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' return pyresult;')
- else:
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' Py_INCREF(Py_None);')
- prnt(' return Py_None;')
- prnt('}')
- prnt()
-
- def _generate_cpy_function_method(self, tp, name):
- if tp.ellipsis:
- return
- numargs = len(tp.args)
- if numargs == 0:
- meth = 'METH_NOARGS'
- elif numargs == 1:
- meth = 'METH_O'
- else:
- meth = 'METH_VARARGS'
- self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth))
-
- _loading_cpy_function = _loaded_noop
-
- def _loaded_cpy_function(self, tp, name, module, library):
- if tp.ellipsis:
- return
- func = getattr(module, name)
- setattr(library, name, func)
- self._types_of_builtin_functions[func] = tp
-
- # ----------
- # named structs
-
- _generate_cpy_struct_collecttype = _generate_nothing
- def _generate_cpy_struct_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'struct', name)
- def _generate_cpy_struct_method(self, tp, name):
- self._generate_struct_or_union_method(tp, 'struct', name)
- def _loading_cpy_struct(self, tp, name, module):
- self._loading_struct_or_union(tp, 'struct', name, module)
- def _loaded_cpy_struct(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- _generate_cpy_union_collecttype = _generate_nothing
- def _generate_cpy_union_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'union', name)
- def _generate_cpy_union_method(self, tp, name):
- self._generate_struct_or_union_method(tp, 'union', name)
- def _loading_cpy_union(self, tp, name, module):
- self._loading_struct_or_union(tp, 'union', name, module)
- def _loaded_cpy_union(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_struct_or_union_decl(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- checkfuncname = '_cffi_check_%s_%s' % (prefix, name)
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- cname = ('%s %s' % (prefix, name)).strip()
- #
- prnt = self._prnt
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if (isinstance(ftype, model.PrimitiveType)
- and ftype.is_integer_type()) or fbitsize >= 0:
- # accept all integers, but complain on float or double
- prnt(' (void)((p->%s) << 1);' % fname)
- else:
- # only accept exactly the type declared.
- try:
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- prnt('static PyObject *')
- prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,))
- prnt('{')
- prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname)
- prnt(' static Py_ssize_t nums[] = {')
- prnt(' sizeof(%s),' % cname)
- prnt(' offsetof(struct _cffi_aligncheck, y),')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- prnt(' offsetof(%s, %s),' % (cname, fname))
- if isinstance(ftype, model.ArrayType) and ftype.length is None:
- prnt(' 0, /* %s */' % ftype._get_c_name())
- else:
- prnt(' sizeof(((%s *)0)->%s),' % (cname, fname))
- prnt(' -1')
- prnt(' };')
- prnt(' (void)self; /* unused */')
- prnt(' (void)noarg; /* unused */')
- prnt(' return _cffi_get_struct_layout(nums);')
- prnt(' /* the next line is not executed, but compiled */')
- prnt(' %s(0);' % (checkfuncname,))
- prnt('}')
- prnt()
-
- def _generate_struct_or_union_method(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname,
- layoutfuncname))
-
- def _loading_struct_or_union(self, tp, prefix, name, module):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- #
- function = getattr(module, layoutfuncname)
- layout = function()
- if isinstance(tp, model.StructOrUnion) and tp.partial:
- # use the function()'s sizes and offsets to guide the
- # layout of the struct
- totalsize = layout[0]
- totalalignment = layout[1]
- fieldofs = layout[2::2]
- fieldsize = layout[3::2]
- tp.force_flatten()
- assert len(fieldofs) == len(fieldsize) == len(tp.fldnames)
- tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment
- else:
- cname = ('%s %s' % (prefix, name)).strip()
- self._struct_pending_verification[tp] = layout, cname
-
- def _loaded_struct_or_union(self, tp):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered
-
- if tp in self._struct_pending_verification:
- # check that the layout sizes and offsets match the real ones
- def check(realvalue, expectedvalue, msg):
- if realvalue != expectedvalue:
- raise VerificationError(
- "%s (we have %d, but C compiler says %d)"
- % (msg, expectedvalue, realvalue))
- ffi = self.ffi
- BStruct = ffi._get_cached_btype(tp)
- layout, cname = self._struct_pending_verification.pop(tp)
- check(layout[0], ffi.sizeof(BStruct), "wrong total size")
- check(layout[1], ffi.alignof(BStruct), "wrong total alignment")
- i = 2
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- check(layout[i], ffi.offsetof(BStruct, fname),
- "wrong offset for field %r" % (fname,))
- if layout[i+1] != 0:
- BField = ffi._get_cached_btype(ftype)
- check(layout[i+1], ffi.sizeof(BField),
- "wrong size for field %r" % (fname,))
- i += 2
- assert i == len(layout)
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- _generate_cpy_anonymous_collecttype = _generate_nothing
-
- def _generate_cpy_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_decl(tp, name, '')
- else:
- self._generate_struct_or_union_decl(tp, '', name)
-
- def _generate_cpy_anonymous_method(self, tp, name):
- if not isinstance(tp, model.EnumType):
- self._generate_struct_or_union_method(tp, '', name)
-
- def _loading_cpy_anonymous(self, tp, name, module):
- if isinstance(tp, model.EnumType):
- self._loading_cpy_enum(tp, name, module)
- else:
- self._loading_struct_or_union(tp, '', name, module)
-
- def _loaded_cpy_anonymous(self, tp, name, module, **kwds):
- if isinstance(tp, model.EnumType):
- self._loaded_cpy_enum(tp, name, module, **kwds)
- else:
- self._loaded_struct_or_union(tp)
-
- # ----------
- # constants, likely declared with '#define'
-
- def _generate_cpy_const(self, is_int, name, tp=None, category='const',
- vartp=None, delayed=True, size_too=False,
- check_value=None):
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- prnt('static int %s(PyObject *lib)' % funcname)
- prnt('{')
- prnt(' PyObject *o;')
- prnt(' int res;')
- if not is_int:
- prnt(' %s;' % (vartp or tp).get_c_name(' i', name))
- else:
- assert category == 'const'
- #
- if check_value is not None:
- self._check_int_constant_value(name, check_value)
- #
- if not is_int:
- if category == 'var':
- realexpr = '&' + name
- else:
- realexpr = name
- prnt(' i = (%s);' % (realexpr,))
- prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i',
- 'variable type'),))
- assert delayed
- else:
- prnt(' o = _cffi_from_c_int_const(%s);' % name)
- prnt(' if (o == NULL)')
- prnt(' return -1;')
- if size_too:
- prnt(' {')
- prnt(' PyObject *o1 = o;')
- prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));'
- % (name,))
- prnt(' Py_DECREF(o1);')
- prnt(' if (o == NULL)')
- prnt(' return -1;')
- prnt(' }')
- prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name)
- prnt(' Py_DECREF(o);')
- prnt(' if (res < 0)')
- prnt(' return -1;')
- prnt(' return %s;' % self._chained_list_constants[delayed])
- self._chained_list_constants[delayed] = funcname + '(lib)'
- prnt('}')
- prnt()
-
- def _generate_cpy_constant_collecttype(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- if not is_int:
- self._do_collect_type(tp)
-
- def _generate_cpy_constant_decl(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- self._generate_cpy_const(is_int, name, tp)
-
- _generate_cpy_constant_method = _generate_nothing
- _loading_cpy_constant = _loaded_noop
- _loaded_cpy_constant = _loaded_noop
-
- # ----------
- # enums
-
- def _check_int_constant_value(self, name, value, err_prefix=''):
- prnt = self._prnt
- if value <= 0:
- prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % (
- name, name, value))
- else:
- prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % (
- name, name, value))
- prnt(' char buf[64];')
- prnt(' if ((%s) <= 0)' % name)
- prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name)
- prnt(' else')
- prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' %
- name)
- prnt(' PyErr_Format(_cffi_VerificationError,')
- prnt(' "%s%s has the real value %s, not %s",')
- prnt(' "%s", "%s", buf, "%d");' % (
- err_prefix, name, value))
- prnt(' return -1;')
- prnt(' }')
-
- def _enum_funcname(self, prefix, name):
- # "$enum_$1" => "___D_enum____D_1"
- name = name.replace('$', '___D_')
- return '_cffi_e_%s_%s' % (prefix, name)
-
- def _generate_cpy_enum_decl(self, tp, name, prefix='enum'):
- if tp.partial:
- for enumerator in tp.enumerators:
- self._generate_cpy_const(True, enumerator, delayed=False)
- return
- #
- funcname = self._enum_funcname(prefix, name)
- prnt = self._prnt
- prnt('static int %s(PyObject *lib)' % funcname)
- prnt('{')
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._check_int_constant_value(enumerator, enumvalue,
- "enum %s: " % name)
- prnt(' return %s;' % self._chained_list_constants[True])
- self._chained_list_constants[True] = funcname + '(lib)'
- prnt('}')
- prnt()
-
- _generate_cpy_enum_collecttype = _generate_nothing
- _generate_cpy_enum_method = _generate_nothing
-
- def _loading_cpy_enum(self, tp, name, module):
- if tp.partial:
- enumvalues = [getattr(module, enumerator)
- for enumerator in tp.enumerators]
- tp.enumvalues = tuple(enumvalues)
- tp.partial_resolved = True
-
- def _loaded_cpy_enum(self, tp, name, module, library):
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- setattr(library, enumerator, enumvalue)
-
- # ----------
- # macros: for now only for integers
-
- def _generate_cpy_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_cpy_const(True, name, check_value=check_value)
-
- _generate_cpy_macro_collecttype = _generate_nothing
- _generate_cpy_macro_method = _generate_nothing
- _loading_cpy_macro = _loaded_noop
- _loaded_cpy_macro = _loaded_noop
-
- # ----------
- # global variables
-
- def _generate_cpy_variable_collecttype(self, tp, name):
- if isinstance(tp, model.ArrayType):
- tp_ptr = model.PointerType(tp.item)
- else:
- tp_ptr = model.PointerType(tp)
- self._do_collect_type(tp_ptr)
-
- def _generate_cpy_variable_decl(self, tp, name):
- if isinstance(tp, model.ArrayType):
- tp_ptr = model.PointerType(tp.item)
- self._generate_cpy_const(False, name, tp, vartp=tp_ptr,
- size_too = tp.length_is_unknown())
- else:
- tp_ptr = model.PointerType(tp)
- self._generate_cpy_const(False, name, tp_ptr, category='var')
-
- _generate_cpy_variable_method = _generate_nothing
- _loading_cpy_variable = _loaded_noop
-
- def _loaded_cpy_variable(self, tp, name, module, library):
- value = getattr(library, name)
- if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the
- # sense that "a=..." is forbidden
- if tp.length_is_unknown():
- assert isinstance(value, tuple)
- (value, size) = value
- BItemType = self.ffi._get_cached_btype(tp.item)
- length, rest = divmod(size, self.ffi.sizeof(BItemType))
- if rest != 0:
- raise VerificationError(
- "bad size: %r does not seem to be an array of %s" %
- (name, tp.item))
- tp = tp.resolve_length(length)
- # 'value' is a which we have to replace with
- # a if the N is actually known
- if tp.length is not None:
- BArray = self.ffi._get_cached_btype(tp)
- value = self.ffi.cast(BArray, value)
- setattr(library, name, value)
- return
- # remove ptr= from the library instance, and replace
- # it by a property on the class, which reads/writes into ptr[0].
- ptr = value
- delattr(library, name)
- def getter(library):
- return ptr[0]
- def setter(library, value):
- ptr[0] = value
- setattr(type(library), name, property(getter, setter))
- type(library)._cffi_dir.append(name)
-
- # ----------
-
- def _generate_setup_custom(self):
- prnt = self._prnt
- prnt('static int _cffi_setup_custom(PyObject *lib)')
- prnt('{')
- prnt(' return %s;' % self._chained_list_constants[True])
- prnt('}')
-
-cffimod_header = r'''
-#include
-#include
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-
-#if PY_MAJOR_VERSION < 3
-# undef PyCapsule_CheckExact
-# undef PyCapsule_GetPointer
-# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule))
-# define PyCapsule_GetPointer(capsule, name) \
- (PyCObject_AsVoidPtr(capsule))
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
-#define _cffi_from_c_double PyFloat_FromDouble
-#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
-#define _cffi_from_c_ulong PyLong_FromUnsignedLong
-#define _cffi_from_c_longlong PyLong_FromLongLong
-#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
-#define _cffi_from_c__Bool PyBool_FromLong
-
-#define _cffi_to_c_double PyFloat_AsDouble
-#define _cffi_to_c_float PyFloat_AsDouble
-
-#define _cffi_from_c_int_const(x) \
- (((x) > 0) ? \
- ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \
- PyInt_FromLong((long)(x)) : \
- PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \
- ((long long)(x) >= (long long)LONG_MIN) ? \
- PyInt_FromLong((long)(x)) : \
- PyLong_FromLongLong((long long)(x)))
-
-#define _cffi_from_c_int(x, type) \
- (((type)-1) > 0 ? /* unsigned */ \
- (sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- sizeof(type) == sizeof(long) ? \
- PyLong_FromUnsignedLong((unsigned long)x) : \
- PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
- (sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- PyLong_FromLongLong((long long)x)))
-
-#define _cffi_to_c_int(o, type) \
- ((type)( \
- sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
- : (type)_cffi_to_c_i8(o)) : \
- sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
- : (type)_cffi_to_c_i16(o)) : \
- sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
- : (type)_cffi_to_c_i32(o)) : \
- sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
- : (type)_cffi_to_c_i64(o)) : \
- (Py_FatalError("unsupported size for type " #type), (type)0)))
-
-#define _cffi_to_c_i8 \
- ((int(*)(PyObject *))_cffi_exports[1])
-#define _cffi_to_c_u8 \
- ((int(*)(PyObject *))_cffi_exports[2])
-#define _cffi_to_c_i16 \
- ((int(*)(PyObject *))_cffi_exports[3])
-#define _cffi_to_c_u16 \
- ((int(*)(PyObject *))_cffi_exports[4])
-#define _cffi_to_c_i32 \
- ((int(*)(PyObject *))_cffi_exports[5])
-#define _cffi_to_c_u32 \
- ((unsigned int(*)(PyObject *))_cffi_exports[6])
-#define _cffi_to_c_i64 \
- ((long long(*)(PyObject *))_cffi_exports[7])
-#define _cffi_to_c_u64 \
- ((unsigned long long(*)(PyObject *))_cffi_exports[8])
-#define _cffi_to_c_char \
- ((int(*)(PyObject *))_cffi_exports[9])
-#define _cffi_from_c_pointer \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10])
-#define _cffi_to_c_pointer \
- ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11])
-#define _cffi_get_struct_layout \
- ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12])
-#define _cffi_restore_errno \
- ((void(*)(void))_cffi_exports[13])
-#define _cffi_save_errno \
- ((void(*)(void))_cffi_exports[14])
-#define _cffi_from_c_char \
- ((PyObject *(*)(char))_cffi_exports[15])
-#define _cffi_from_c_deref \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16])
-#define _cffi_to_c \
- ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17])
-#define _cffi_from_c_struct \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18])
-#define _cffi_to_c_wchar_t \
- ((wchar_t(*)(PyObject *))_cffi_exports[19])
-#define _cffi_from_c_wchar_t \
- ((PyObject *(*)(wchar_t))_cffi_exports[20])
-#define _cffi_to_c_long_double \
- ((long double(*)(PyObject *))_cffi_exports[21])
-#define _cffi_to_c__Bool \
- ((_Bool(*)(PyObject *))_cffi_exports[22])
-#define _cffi_prepare_pointer_call_argument \
- ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23])
-#define _cffi_convert_array_from_object \
- ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24])
-#define _CFFI_NUM_EXPORTS 25
-
-typedef struct _ctypedescr CTypeDescrObject;
-
-static void *_cffi_exports[_CFFI_NUM_EXPORTS];
-static PyObject *_cffi_types, *_cffi_VerificationError;
-
-static int _cffi_setup_custom(PyObject *lib); /* forward */
-
-static PyObject *_cffi_setup(PyObject *self, PyObject *args)
-{
- PyObject *library;
- int was_alive = (_cffi_types != NULL);
- (void)self; /* unused */
- if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError,
- &library))
- return NULL;
- Py_INCREF(_cffi_types);
- Py_INCREF(_cffi_VerificationError);
- if (_cffi_setup_custom(library) < 0)
- return NULL;
- return PyBool_FromLong(was_alive);
-}
-
-union _cffi_union_alignment_u {
- unsigned char m_char;
- unsigned short m_short;
- unsigned int m_int;
- unsigned long m_long;
- unsigned long long m_longlong;
- float m_float;
- double m_double;
- long double m_longdouble;
-};
-
-struct _cffi_freeme_s {
- struct _cffi_freeme_s *next;
- union _cffi_union_alignment_u alignment;
-};
-
-#ifdef __GNUC__
- __attribute__((unused))
-#endif
-static int _cffi_convert_array_argument(CTypeDescrObject *ctptr, PyObject *arg,
- char **output_data, Py_ssize_t datasize,
- struct _cffi_freeme_s **freeme)
-{
- char *p;
- if (datasize < 0)
- return -1;
-
- p = *output_data;
- if (p == NULL) {
- struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc(
- offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize);
- if (fp == NULL)
- return -1;
- fp->next = *freeme;
- *freeme = fp;
- p = *output_data = (char *)&fp->alignment;
- }
- memset((void *)p, 0, (size_t)datasize);
- return _cffi_convert_array_from_object(p, ctptr, arg);
-}
-
-#ifdef __GNUC__
- __attribute__((unused))
-#endif
-static void _cffi_free_array_arguments(struct _cffi_freeme_s *freeme)
-{
- do {
- void *p = (void *)freeme;
- freeme = freeme->next;
- PyObject_Free(p);
- } while (freeme != NULL);
-}
-
-static int _cffi_init(void)
-{
- PyObject *module, *c_api_object = NULL;
-
- module = PyImport_ImportModule("_cffi_backend");
- if (module == NULL)
- goto failure;
-
- c_api_object = PyObject_GetAttrString(module, "_C_API");
- if (c_api_object == NULL)
- goto failure;
- if (!PyCapsule_CheckExact(c_api_object)) {
- PyErr_SetNone(PyExc_ImportError);
- goto failure;
- }
- memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"),
- _CFFI_NUM_EXPORTS * sizeof(void *));
-
- Py_DECREF(module);
- Py_DECREF(c_api_object);
- return 0;
-
- failure:
- Py_XDECREF(module);
- Py_XDECREF(c_api_object);
- return -1;
-}
-
-#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num))
-
-/**********/
-'''
diff --git a/resources/python/bin/3.7/linux/cffi/vengine_gen.py b/resources/python/bin/3.7/linux/cffi/vengine_gen.py
deleted file mode 100644
index 26421526f..000000000
--- a/resources/python/bin/3.7/linux/cffi/vengine_gen.py
+++ /dev/null
@@ -1,675 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, os
-import types
-
-from . import model
-from .error import VerificationError
-
-
-class VGenericEngine(object):
- _class_key = 'g'
- _gen_python_module = False
-
- def __init__(self, verifier):
- self.verifier = verifier
- self.ffi = verifier.ffi
- self.export_symbols = []
- self._struct_pending_verification = {}
-
- def patch_extension_kwds(self, kwds):
- # add 'export_symbols' to the dictionary. Note that we add the
- # list before filling it. When we fill it, it will thus also show
- # up in kwds['export_symbols'].
- kwds.setdefault('export_symbols', self.export_symbols)
-
- def find_module(self, module_name, path, so_suffixes):
- for so_suffix in so_suffixes:
- basename = module_name + so_suffix
- if path is None:
- path = sys.path
- for dirname in path:
- filename = os.path.join(dirname, basename)
- if os.path.isfile(filename):
- return filename
-
- def collect_types(self):
- pass # not needed in the generic engine
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def write_source_to_f(self):
- prnt = self._prnt
- # first paste some standard set of lines that are mostly '#include'
- prnt(cffimod_header)
- # then paste the C source given by the user, verbatim.
- prnt(self.verifier.preamble)
- #
- # call generate_gen_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._generate('decl')
- #
- # on Windows, distutils insists on putting init_cffi_xyz in
- # 'export_symbols', so instead of fighting it, just give up and
- # give it one
- if sys.platform == 'win32':
- if sys.version_info >= (3,):
- prefix = 'PyInit_'
- else:
- prefix = 'init'
- modname = self.verifier.get_module_name()
- prnt("void %s%s(void) { }\n" % (prefix, modname))
-
- def load_library(self, flags=0):
- # import it with the CFFI backend
- backend = self.ffi._backend
- # needs to make a path that contains '/', on Posix
- filename = os.path.join(os.curdir, self.verifier.modulefilename)
- module = backend.load_library(filename, flags)
- #
- # call loading_gen_struct() to get the struct layout inferred by
- # the C compiler
- self._load(module, 'loading')
-
- # build the FFILibrary class and instance, this is a module subclass
- # because modules are expected to have usually-constant-attributes and
- # in PyPy this means the JIT is able to treat attributes as constant,
- # which we want.
- class FFILibrary(types.ModuleType):
- _cffi_generic_module = module
- _cffi_ffi = self.ffi
- _cffi_dir = []
- def __dir__(self):
- return FFILibrary._cffi_dir
- library = FFILibrary("")
- #
- # finally, call the loaded_gen_xxx() functions. This will set
- # up the 'library' object.
- self._load(module, 'loaded', library=library)
- return library
-
- def _get_declarations(self):
- lst = [(key, tp) for (key, (tp, qual)) in
- self.ffi._parser._declarations.items()]
- lst.sort()
- return lst
-
- def _generate(self, step_name):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_gen_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in verify(): %r" % name)
- try:
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _load(self, module, step_name, **kwds):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- method = getattr(self, '_%s_gen_%s' % (step_name, kind))
- try:
- method(tp, realname, module, **kwds)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _generate_nothing(self, tp, name):
- pass
-
- def _loaded_noop(self, tp, name, module, **kwds):
- pass
-
- # ----------
- # typedefs: generates no code so far
-
- _generate_gen_typedef_decl = _generate_nothing
- _loading_gen_typedef = _loaded_noop
- _loaded_gen_typedef = _loaded_noop
-
- # ----------
- # function declarations
-
- def _generate_gen_function_decl(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no _cffi_f_%s wrapper)
- self._generate_gen_const(False, name, tp)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- argnames = []
- for i, type in enumerate(tp.args):
- indirection = ''
- if isinstance(type, model.StructOrUnion):
- indirection = '*'
- argnames.append('%sx%d' % (indirection, i))
- context = 'argument of %s' % name
- arglist = [type.get_c_name(' %s' % arg, context)
- for type, arg in zip(tp.args, argnames)]
- tpresult = tp.result
- if isinstance(tpresult, model.StructOrUnion):
- arglist.insert(0, tpresult.get_c_name(' *r', context))
- tpresult = model.void_type
- arglist = ', '.join(arglist) or 'void'
- wrappername = '_cffi_f_%s' % name
- self.export_symbols.append(wrappername)
- if tp.abi:
- abi = tp.abi + ' '
- else:
- abi = ''
- funcdecl = ' %s%s(%s)' % (abi, wrappername, arglist)
- context = 'result of %s' % name
- prnt(tpresult.get_c_name(funcdecl, context))
- prnt('{')
- #
- if isinstance(tp.result, model.StructOrUnion):
- result_code = '*r = '
- elif not isinstance(tp.result, model.VoidType):
- result_code = 'return '
- else:
- result_code = ''
- prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames)))
- prnt('}')
- prnt()
-
- _loading_gen_function = _loaded_noop
-
- def _loaded_gen_function(self, tp, name, module, library):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- newfunction = self._load_constant(False, tp, name, module)
- else:
- indirections = []
- base_tp = tp
- if (any(isinstance(typ, model.StructOrUnion) for typ in tp.args)
- or isinstance(tp.result, model.StructOrUnion)):
- indirect_args = []
- for i, typ in enumerate(tp.args):
- if isinstance(typ, model.StructOrUnion):
- typ = model.PointerType(typ)
- indirections.append((i, typ))
- indirect_args.append(typ)
- indirect_result = tp.result
- if isinstance(indirect_result, model.StructOrUnion):
- if indirect_result.fldtypes is None:
- raise TypeError("'%s' is used as result type, "
- "but is opaque" % (
- indirect_result._get_c_name(),))
- indirect_result = model.PointerType(indirect_result)
- indirect_args.insert(0, indirect_result)
- indirections.insert(0, ("result", indirect_result))
- indirect_result = model.void_type
- tp = model.FunctionPtrType(tuple(indirect_args),
- indirect_result, tp.ellipsis)
- BFunc = self.ffi._get_cached_btype(tp)
- wrappername = '_cffi_f_%s' % name
- newfunction = module.load_function(BFunc, wrappername)
- for i, typ in indirections:
- newfunction = self._make_struct_wrapper(newfunction, i, typ,
- base_tp)
- setattr(library, name, newfunction)
- type(library)._cffi_dir.append(name)
-
- def _make_struct_wrapper(self, oldfunc, i, tp, base_tp):
- backend = self.ffi._backend
- BType = self.ffi._get_cached_btype(tp)
- if i == "result":
- ffi = self.ffi
- def newfunc(*args):
- res = ffi.new(BType)
- oldfunc(res, *args)
- return res[0]
- else:
- def newfunc(*args):
- args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:]
- return oldfunc(*args)
- newfunc._cffi_base_type = base_tp
- return newfunc
-
- # ----------
- # named structs
-
- def _generate_gen_struct_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'struct', name)
-
- def _loading_gen_struct(self, tp, name, module):
- self._loading_struct_or_union(tp, 'struct', name, module)
-
- def _loaded_gen_struct(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_gen_union_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'union', name)
-
- def _loading_gen_union(self, tp, name, module):
- self._loading_struct_or_union(tp, 'union', name, module)
-
- def _loaded_gen_union(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_struct_or_union_decl(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- checkfuncname = '_cffi_check_%s_%s' % (prefix, name)
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- cname = ('%s %s' % (prefix, name)).strip()
- #
- prnt = self._prnt
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if (isinstance(ftype, model.PrimitiveType)
- and ftype.is_integer_type()) or fbitsize >= 0:
- # accept all integers, but complain on float or double
- prnt(' (void)((p->%s) << 1);' % fname)
- else:
- # only accept exactly the type declared.
- try:
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- self.export_symbols.append(layoutfuncname)
- prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,))
- prnt('{')
- prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname)
- prnt(' static intptr_t nums[] = {')
- prnt(' sizeof(%s),' % cname)
- prnt(' offsetof(struct _cffi_aligncheck, y),')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- prnt(' offsetof(%s, %s),' % (cname, fname))
- if isinstance(ftype, model.ArrayType) and ftype.length is None:
- prnt(' 0, /* %s */' % ftype._get_c_name())
- else:
- prnt(' sizeof(((%s *)0)->%s),' % (cname, fname))
- prnt(' -1')
- prnt(' };')
- prnt(' return nums[i];')
- prnt(' /* the next line is not executed, but compiled */')
- prnt(' %s(0);' % (checkfuncname,))
- prnt('}')
- prnt()
-
- def _loading_struct_or_union(self, tp, prefix, name, module):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- #
- BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0]
- function = module.load_function(BFunc, layoutfuncname)
- layout = []
- num = 0
- while True:
- x = function(num)
- if x < 0: break
- layout.append(x)
- num += 1
- if isinstance(tp, model.StructOrUnion) and tp.partial:
- # use the function()'s sizes and offsets to guide the
- # layout of the struct
- totalsize = layout[0]
- totalalignment = layout[1]
- fieldofs = layout[2::2]
- fieldsize = layout[3::2]
- tp.force_flatten()
- assert len(fieldofs) == len(fieldsize) == len(tp.fldnames)
- tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment
- else:
- cname = ('%s %s' % (prefix, name)).strip()
- self._struct_pending_verification[tp] = layout, cname
-
- def _loaded_struct_or_union(self, tp):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered
-
- if tp in self._struct_pending_verification:
- # check that the layout sizes and offsets match the real ones
- def check(realvalue, expectedvalue, msg):
- if realvalue != expectedvalue:
- raise VerificationError(
- "%s (we have %d, but C compiler says %d)"
- % (msg, expectedvalue, realvalue))
- ffi = self.ffi
- BStruct = ffi._get_cached_btype(tp)
- layout, cname = self._struct_pending_verification.pop(tp)
- check(layout[0], ffi.sizeof(BStruct), "wrong total size")
- check(layout[1], ffi.alignof(BStruct), "wrong total alignment")
- i = 2
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- check(layout[i], ffi.offsetof(BStruct, fname),
- "wrong offset for field %r" % (fname,))
- if layout[i+1] != 0:
- BField = ffi._get_cached_btype(ftype)
- check(layout[i+1], ffi.sizeof(BField),
- "wrong size for field %r" % (fname,))
- i += 2
- assert i == len(layout)
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- def _generate_gen_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_gen_enum_decl(tp, name, '')
- else:
- self._generate_struct_or_union_decl(tp, '', name)
-
- def _loading_gen_anonymous(self, tp, name, module):
- if isinstance(tp, model.EnumType):
- self._loading_gen_enum(tp, name, module, '')
- else:
- self._loading_struct_or_union(tp, '', name, module)
-
- def _loaded_gen_anonymous(self, tp, name, module, **kwds):
- if isinstance(tp, model.EnumType):
- self._loaded_gen_enum(tp, name, module, **kwds)
- else:
- self._loaded_struct_or_union(tp)
-
- # ----------
- # constants, likely declared with '#define'
-
- def _generate_gen_const(self, is_int, name, tp=None, category='const',
- check_value=None):
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- self.export_symbols.append(funcname)
- if check_value is not None:
- assert is_int
- assert category == 'const'
- prnt('int %s(char *out_error)' % funcname)
- prnt('{')
- self._check_int_constant_value(name, check_value)
- prnt(' return 0;')
- prnt('}')
- elif is_int:
- assert category == 'const'
- prnt('int %s(long long *out_value)' % funcname)
- prnt('{')
- prnt(' *out_value = (long long)(%s);' % (name,))
- prnt(' return (%s) <= 0;' % (name,))
- prnt('}')
- else:
- assert tp is not None
- assert check_value is None
- if category == 'var':
- ampersand = '&'
- else:
- ampersand = ''
- extra = ''
- if category == 'const' and isinstance(tp, model.StructOrUnion):
- extra = 'const *'
- ampersand = '&'
- prnt(tp.get_c_name(' %s%s(void)' % (extra, funcname), name))
- prnt('{')
- prnt(' return (%s%s);' % (ampersand, name))
- prnt('}')
- prnt()
-
- def _generate_gen_constant_decl(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- self._generate_gen_const(is_int, name, tp)
-
- _loading_gen_constant = _loaded_noop
-
- def _load_constant(self, is_int, tp, name, module, check_value=None):
- funcname = '_cffi_const_%s' % name
- if check_value is not None:
- assert is_int
- self._load_known_int_constant(module, funcname)
- value = check_value
- elif is_int:
- BType = self.ffi._typeof_locked("long long*")[0]
- BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0]
- function = module.load_function(BFunc, funcname)
- p = self.ffi.new(BType)
- negative = function(p)
- value = int(p[0])
- if value < 0 and not negative:
- BLongLong = self.ffi._typeof_locked("long long")[0]
- value += (1 << (8*self.ffi.sizeof(BLongLong)))
- else:
- assert check_value is None
- fntypeextra = '(*)(void)'
- if isinstance(tp, model.StructOrUnion):
- fntypeextra = '*' + fntypeextra
- BFunc = self.ffi._typeof_locked(tp.get_c_name(fntypeextra, name))[0]
- function = module.load_function(BFunc, funcname)
- value = function()
- if isinstance(tp, model.StructOrUnion):
- value = value[0]
- return value
-
- def _loaded_gen_constant(self, tp, name, module, library):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- value = self._load_constant(is_int, tp, name, module)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
-
- # ----------
- # enums
-
- def _check_int_constant_value(self, name, value):
- prnt = self._prnt
- if value <= 0:
- prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % (
- name, name, value))
- else:
- prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % (
- name, name, value))
- prnt(' char buf[64];')
- prnt(' if ((%s) <= 0)' % name)
- prnt(' sprintf(buf, "%%ld", (long)(%s));' % name)
- prnt(' else')
- prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' %
- name)
- prnt(' sprintf(out_error, "%s has the real value %s, not %s",')
- prnt(' "%s", buf, "%d");' % (name[:100], value))
- prnt(' return -1;')
- prnt(' }')
-
- def _load_known_int_constant(self, module, funcname):
- BType = self.ffi._typeof_locked("char[]")[0]
- BFunc = self.ffi._typeof_locked("int(*)(char*)")[0]
- function = module.load_function(BFunc, funcname)
- p = self.ffi.new(BType, 256)
- if function(p) < 0:
- error = self.ffi.string(p)
- if sys.version_info >= (3,):
- error = str(error, 'utf-8')
- raise VerificationError(error)
-
- def _enum_funcname(self, prefix, name):
- # "$enum_$1" => "___D_enum____D_1"
- name = name.replace('$', '___D_')
- return '_cffi_e_%s_%s' % (prefix, name)
-
- def _generate_gen_enum_decl(self, tp, name, prefix='enum'):
- if tp.partial:
- for enumerator in tp.enumerators:
- self._generate_gen_const(True, enumerator)
- return
- #
- funcname = self._enum_funcname(prefix, name)
- self.export_symbols.append(funcname)
- prnt = self._prnt
- prnt('int %s(char *out_error)' % funcname)
- prnt('{')
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._check_int_constant_value(enumerator, enumvalue)
- prnt(' return 0;')
- prnt('}')
- prnt()
-
- def _loading_gen_enum(self, tp, name, module, prefix='enum'):
- if tp.partial:
- enumvalues = [self._load_constant(True, tp, enumerator, module)
- for enumerator in tp.enumerators]
- tp.enumvalues = tuple(enumvalues)
- tp.partial_resolved = True
- else:
- funcname = self._enum_funcname(prefix, name)
- self._load_known_int_constant(module, funcname)
-
- def _loaded_gen_enum(self, tp, name, module, library):
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- setattr(library, enumerator, enumvalue)
- type(library)._cffi_dir.append(enumerator)
-
- # ----------
- # macros: for now only for integers
-
- def _generate_gen_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_gen_const(True, name, check_value=check_value)
-
- _loading_gen_macro = _loaded_noop
-
- def _loaded_gen_macro(self, tp, name, module, library):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- value = self._load_constant(True, tp, name, module,
- check_value=check_value)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
-
- # ----------
- # global variables
-
- def _generate_gen_variable_decl(self, tp, name):
- if isinstance(tp, model.ArrayType):
- if tp.length_is_unknown():
- prnt = self._prnt
- funcname = '_cffi_sizeof_%s' % (name,)
- self.export_symbols.append(funcname)
- prnt("size_t %s(void)" % funcname)
- prnt("{")
- prnt(" return sizeof(%s);" % (name,))
- prnt("}")
- tp_ptr = model.PointerType(tp.item)
- self._generate_gen_const(False, name, tp_ptr)
- else:
- tp_ptr = model.PointerType(tp)
- self._generate_gen_const(False, name, tp_ptr, category='var')
-
- _loading_gen_variable = _loaded_noop
-
- def _loaded_gen_variable(self, tp, name, module, library):
- if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the
- # sense that "a=..." is forbidden
- if tp.length_is_unknown():
- funcname = '_cffi_sizeof_%s' % (name,)
- BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0]
- function = module.load_function(BFunc, funcname)
- size = function()
- BItemType = self.ffi._get_cached_btype(tp.item)
- length, rest = divmod(size, self.ffi.sizeof(BItemType))
- if rest != 0:
- raise VerificationError(
- "bad size: %r does not seem to be an array of %s" %
- (name, tp.item))
- tp = tp.resolve_length(length)
- tp_ptr = model.PointerType(tp.item)
- value = self._load_constant(False, tp_ptr, name, module)
- # 'value' is a which we have to replace with
- # a if the N is actually known
- if tp.length is not None:
- BArray = self.ffi._get_cached_btype(tp)
- value = self.ffi.cast(BArray, value)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
- return
- # remove ptr= from the library instance, and replace
- # it by a property on the class, which reads/writes into ptr[0].
- funcname = '_cffi_var_%s' % name
- BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0]
- function = module.load_function(BFunc, funcname)
- ptr = function()
- def getter(library):
- return ptr[0]
- def setter(library, value):
- ptr[0] = value
- setattr(type(library), name, property(getter, setter))
- type(library)._cffi_dir.append(name)
-
-cffimod_header = r'''
-#include
-#include
-#include
-#include
-#include /* XXX for ssize_t on some platforms */
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-'''
diff --git a/resources/python/bin/3.7/linux/cffi/verifier.py b/resources/python/bin/3.7/linux/cffi/verifier.py
deleted file mode 100644
index a500c7814..000000000
--- a/resources/python/bin/3.7/linux/cffi/verifier.py
+++ /dev/null
@@ -1,307 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, os, binascii, shutil, io
-from . import __version_verifier_modules__
-from . import ffiplatform
-from .error import VerificationError
-
-if sys.version_info >= (3, 3):
- import importlib.machinery
- def _extension_suffixes():
- return importlib.machinery.EXTENSION_SUFFIXES[:]
-else:
- import imp
- def _extension_suffixes():
- return [suffix for suffix, _, type in imp.get_suffixes()
- if type == imp.C_EXTENSION]
-
-
-if sys.version_info >= (3,):
- NativeIO = io.StringIO
-else:
- class NativeIO(io.BytesIO):
- def write(self, s):
- if isinstance(s, unicode):
- s = s.encode('ascii')
- super(NativeIO, self).write(s)
-
-
-class Verifier(object):
-
- def __init__(self, ffi, preamble, tmpdir=None, modulename=None,
- ext_package=None, tag='', force_generic_engine=False,
- source_extension='.c', flags=None, relative_to=None, **kwds):
- if ffi._parser._uses_new_feature:
- raise VerificationError(
- "feature not supported with ffi.verify(), but only "
- "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,))
- self.ffi = ffi
- self.preamble = preamble
- if not modulename:
- flattened_kwds = ffiplatform.flatten(kwds)
- vengine_class = _locate_engine_class(ffi, force_generic_engine)
- self._vengine = vengine_class(self)
- self._vengine.patch_extension_kwds(kwds)
- self.flags = flags
- self.kwds = self.make_relative_to(kwds, relative_to)
- #
- if modulename:
- if tag:
- raise TypeError("can't specify both 'modulename' and 'tag'")
- else:
- key = '\x00'.join(['%d.%d' % sys.version_info[:2],
- __version_verifier_modules__,
- preamble, flattened_kwds] +
- ffi._cdefsources)
- if sys.version_info >= (3,):
- key = key.encode('utf-8')
- k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff)
- k1 = k1.lstrip('0x').rstrip('L')
- k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff)
- k2 = k2.lstrip('0').rstrip('L')
- modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key,
- k1, k2)
- suffix = _get_so_suffixes()[0]
- self.tmpdir = tmpdir or _caller_dir_pycache()
- self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension)
- self.modulefilename = os.path.join(self.tmpdir, modulename + suffix)
- self.ext_package = ext_package
- self._has_source = False
- self._has_module = False
-
- def write_source(self, file=None):
- """Write the C source code. It is produced in 'self.sourcefilename',
- which can be tweaked beforehand."""
- with self.ffi._lock:
- if self._has_source and file is None:
- raise VerificationError(
- "source code already written")
- self._write_source(file)
-
- def compile_module(self):
- """Write the C source code (if not done already) and compile it.
- This produces a dynamic link library in 'self.modulefilename'."""
- with self.ffi._lock:
- if self._has_module:
- raise VerificationError("module already compiled")
- if not self._has_source:
- self._write_source()
- self._compile_module()
-
- def load_library(self):
- """Get a C module from this Verifier instance.
- Returns an instance of a FFILibrary class that behaves like the
- objects returned by ffi.dlopen(), but that delegates all
- operations to the C module. If necessary, the C code is written
- and compiled first.
- """
- with self.ffi._lock:
- if not self._has_module:
- self._locate_module()
- if not self._has_module:
- if not self._has_source:
- self._write_source()
- self._compile_module()
- return self._load_library()
-
- def get_module_name(self):
- basename = os.path.basename(self.modulefilename)
- # kill both the .so extension and the other .'s, as introduced
- # by Python 3: 'basename.cpython-33m.so'
- basename = basename.split('.', 1)[0]
- # and the _d added in Python 2 debug builds --- but try to be
- # conservative and not kill a legitimate _d
- if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'):
- basename = basename[:-2]
- return basename
-
- def get_extension(self):
- ffiplatform._hack_at_distutils() # backward compatibility hack
- if not self._has_source:
- with self.ffi._lock:
- if not self._has_source:
- self._write_source()
- sourcename = ffiplatform.maybe_relative_path(self.sourcefilename)
- modname = self.get_module_name()
- return ffiplatform.get_extension(sourcename, modname, **self.kwds)
-
- def generates_python_module(self):
- return self._vengine._gen_python_module
-
- def make_relative_to(self, kwds, relative_to):
- if relative_to and os.path.dirname(relative_to):
- dirname = os.path.dirname(relative_to)
- kwds = kwds.copy()
- for key in ffiplatform.LIST_OF_FILE_NAMES:
- if key in kwds:
- lst = kwds[key]
- if not isinstance(lst, (list, tuple)):
- raise TypeError("keyword '%s' should be a list or tuple"
- % (key,))
- lst = [os.path.join(dirname, fn) for fn in lst]
- kwds[key] = lst
- return kwds
-
- # ----------
-
- def _locate_module(self):
- if not os.path.isfile(self.modulefilename):
- if self.ext_package:
- try:
- pkg = __import__(self.ext_package, None, None, ['__doc__'])
- except ImportError:
- return # cannot import the package itself, give up
- # (e.g. it might be called differently before installation)
- path = pkg.__path__
- else:
- path = None
- filename = self._vengine.find_module(self.get_module_name(), path,
- _get_so_suffixes())
- if filename is None:
- return
- self.modulefilename = filename
- self._vengine.collect_types()
- self._has_module = True
-
- def _write_source_to(self, file):
- self._vengine._f = file
- try:
- self._vengine.write_source_to_f()
- finally:
- del self._vengine._f
-
- def _write_source(self, file=None):
- if file is not None:
- self._write_source_to(file)
- else:
- # Write our source file to an in memory file.
- f = NativeIO()
- self._write_source_to(f)
- source_data = f.getvalue()
-
- # Determine if this matches the current file
- if os.path.exists(self.sourcefilename):
- with open(self.sourcefilename, "r") as fp:
- needs_written = not (fp.read() == source_data)
- else:
- needs_written = True
-
- # Actually write the file out if it doesn't match
- if needs_written:
- _ensure_dir(self.sourcefilename)
- with open(self.sourcefilename, "w") as fp:
- fp.write(source_data)
-
- # Set this flag
- self._has_source = True
-
- def _compile_module(self):
- # compile this C source
- tmpdir = os.path.dirname(self.sourcefilename)
- outputfilename = ffiplatform.compile(tmpdir, self.get_extension())
- try:
- same = ffiplatform.samefile(outputfilename, self.modulefilename)
- except OSError:
- same = False
- if not same:
- _ensure_dir(self.modulefilename)
- shutil.move(outputfilename, self.modulefilename)
- self._has_module = True
-
- def _load_library(self):
- assert self._has_module
- if self.flags is not None:
- return self._vengine.load_library(self.flags)
- else:
- return self._vengine.load_library()
-
-# ____________________________________________________________
-
-_FORCE_GENERIC_ENGINE = False # for tests
-
-def _locate_engine_class(ffi, force_generic_engine):
- if _FORCE_GENERIC_ENGINE:
- force_generic_engine = True
- if not force_generic_engine:
- if '__pypy__' in sys.builtin_module_names:
- force_generic_engine = True
- else:
- try:
- import _cffi_backend
- except ImportError:
- _cffi_backend = '?'
- if ffi._backend is not _cffi_backend:
- force_generic_engine = True
- if force_generic_engine:
- from . import vengine_gen
- return vengine_gen.VGenericEngine
- else:
- from . import vengine_cpy
- return vengine_cpy.VCPythonEngine
-
-# ____________________________________________________________
-
-_TMPDIR = None
-
-def _caller_dir_pycache():
- if _TMPDIR:
- return _TMPDIR
- result = os.environ.get('CFFI_TMPDIR')
- if result:
- return result
- filename = sys._getframe(2).f_code.co_filename
- return os.path.abspath(os.path.join(os.path.dirname(filename),
- '__pycache__'))
-
-def set_tmpdir(dirname):
- """Set the temporary directory to use instead of __pycache__."""
- global _TMPDIR
- _TMPDIR = dirname
-
-def cleanup_tmpdir(tmpdir=None, keep_so=False):
- """Clean up the temporary directory by removing all files in it
- called `_cffi_*.{c,so}` as well as the `build` subdirectory."""
- tmpdir = tmpdir or _caller_dir_pycache()
- try:
- filelist = os.listdir(tmpdir)
- except OSError:
- return
- if keep_so:
- suffix = '.c' # only remove .c files
- else:
- suffix = _get_so_suffixes()[0].lower()
- for fn in filelist:
- if fn.lower().startswith('_cffi_') and (
- fn.lower().endswith(suffix) or fn.lower().endswith('.c')):
- try:
- os.unlink(os.path.join(tmpdir, fn))
- except OSError:
- pass
- clean_dir = [os.path.join(tmpdir, 'build')]
- for dir in clean_dir:
- try:
- for fn in os.listdir(dir):
- fn = os.path.join(dir, fn)
- if os.path.isdir(fn):
- clean_dir.append(fn)
- else:
- os.unlink(fn)
- except OSError:
- pass
-
-def _get_so_suffixes():
- suffixes = _extension_suffixes()
- if not suffixes:
- # bah, no C_EXTENSION available. Occurs on pypy without cpyext
- if sys.platform == 'win32':
- suffixes = [".pyd"]
- else:
- suffixes = [".so"]
-
- return suffixes
-
-def _ensure_dir(filename):
- dirname = os.path.dirname(filename)
- if dirname and not os.path.isdir(dirname):
- os.makedirs(dirname)
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/INSTALLER b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/METADATA b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/METADATA
deleted file mode 100644
index a67ad96ac..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/METADATA
+++ /dev/null
@@ -1,140 +0,0 @@
-Metadata-Version: 2.3
-Name: cryptography
-Version: 44.0.3
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Natural Language :: English
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: BSD
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: 3.13
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Security :: Cryptography
-Requires-Dist: cffi >=1.12 ; platform_python_implementation != 'PyPy'
-Requires-Dist: bcrypt >=3.1.5 ; extra == 'ssh'
-Requires-Dist: nox >=2024.4.15 ; extra == 'nox'
-Requires-Dist: nox[uv] >=2024.3.2 ; python_version >= '3.8' and extra == 'nox'
-Requires-Dist: cryptography-vectors ==44.0.3 ; extra == 'test'
-Requires-Dist: pytest >=7.4.0 ; extra == 'test'
-Requires-Dist: pytest-benchmark >=4.0 ; extra == 'test'
-Requires-Dist: pytest-cov >=2.10.1 ; extra == 'test'
-Requires-Dist: pytest-xdist >=3.5.0 ; extra == 'test'
-Requires-Dist: pretend >=0.7 ; extra == 'test'
-Requires-Dist: certifi >=2024 ; extra == 'test'
-Requires-Dist: pytest-randomly ; extra == 'test-randomorder'
-Requires-Dist: sphinx >=5.3.0 ; extra == 'docs'
-Requires-Dist: sphinx-rtd-theme >=3.0.0 ; python_version >= '3.8' and extra == 'docs'
-Requires-Dist: pyenchant >=3 ; extra == 'docstest'
-Requires-Dist: readme-renderer >=30.0 ; extra == 'docstest'
-Requires-Dist: sphinxcontrib-spelling >=7.3.1 ; extra == 'docstest'
-Requires-Dist: build >=1.0.0 ; extra == 'sdist'
-Requires-Dist: ruff >=0.3.6 ; extra == 'pep8test'
-Requires-Dist: mypy >=1.4 ; extra == 'pep8test'
-Requires-Dist: check-sdist ; python_version >= '3.8' and extra == 'pep8test'
-Requires-Dist: click >=8.0.1 ; extra == 'pep8test'
-Provides-Extra: ssh
-Provides-Extra: nox
-Provides-Extra: test
-Provides-Extra: test-randomorder
-Provides-Extra: docs
-Provides-Extra: docstest
-Provides-Extra: sdist
-Provides-Extra: pep8test
-License-File: LICENSE
-License-File: LICENSE.APACHE
-License-File: LICENSE.BSD
-Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.
-Author: The cryptography developers
-Author-email: The Python Cryptographic Authority and individual contributors
-License: Apache-2.0 OR BSD-3-Clause
-Requires-Python: >=3.7, !=3.9.0, !=3.9.1
-Description-Content-Type: text/x-rst; charset=UTF-8
-Project-URL: homepage, https://github.com/pyca/cryptography
-Project-URL: documentation, https://cryptography.io/
-Project-URL: source, https://github.com/pyca/cryptography/
-Project-URL: issues, https://github.com/pyca/cryptography/issues
-Project-URL: changelog, https://cryptography.io/en/latest/changelog/
-
-pyca/cryptography
-=================
-
-.. image:: https://img.shields.io/pypi/v/cryptography.svg
- :target: https://pypi.org/project/cryptography/
- :alt: Latest Version
-
-.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest
- :target: https://cryptography.io
- :alt: Latest Docs
-
-.. image:: https://github.com/pyca/cryptography/workflows/CI/badge.svg?branch=main
- :target: https://github.com/pyca/cryptography/actions?query=workflow%3ACI+branch%3Amain
-
-
-``cryptography`` is a package which provides cryptographic recipes and
-primitives to Python developers. Our goal is for it to be your "cryptographic
-standard library". It supports Python 3.7+ and PyPy3 7.3.11+.
-
-``cryptography`` includes both high level recipes and low level interfaces to
-common cryptographic algorithms such as symmetric ciphers, message digests, and
-key derivation functions. For example, to encrypt something with
-``cryptography``'s high level symmetric encryption recipe:
-
-.. code-block:: pycon
-
- >>> from cryptography.fernet import Fernet
- >>> # Put this somewhere safe!
- >>> key = Fernet.generate_key()
- >>> f = Fernet(key)
- >>> token = f.encrypt(b"A really secret message. Not for prying eyes.")
- >>> token
- b'...'
- >>> f.decrypt(token)
- b'A really secret message. Not for prying eyes.'
-
-You can find more information in the `documentation`_.
-
-You can install ``cryptography`` with:
-
-.. code-block:: console
-
- $ pip install cryptography
-
-For full details see `the installation documentation`_.
-
-Discussion
-~~~~~~~~~~
-
-If you run into bugs, you can file them in our `issue tracker`_.
-
-We maintain a `cryptography-dev`_ mailing list for development discussion.
-
-You can also join ``#pyca`` on ``irc.libera.chat`` to ask questions or get
-involved.
-
-Security
-~~~~~~~~
-
-Need to report a security issue? Please consult our `security reporting`_
-documentation.
-
-
-.. _`documentation`: https://cryptography.io/
-.. _`the installation documentation`: https://cryptography.io/en/latest/installation/
-.. _`issue tracker`: https://github.com/pyca/cryptography/issues
-.. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev
-.. _`security reporting`: https://cryptography.io/en/latest/security/
-
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/RECORD b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/RECORD
deleted file mode 100644
index c93ce1522..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/RECORD
+++ /dev/null
@@ -1,183 +0,0 @@
-cryptography-44.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-cryptography-44.0.3.dist-info/METADATA,sha256=N2HCybALCy-5akCnV9cwLVzy7MWOxK7US732RZhSnOw,5724
-cryptography-44.0.3.dist-info/RECORD,,
-cryptography-44.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cryptography-44.0.3.dist-info/WHEEL,sha256=EjCD8OU8aWpb4AnGR1G7-DK7WqSI5OGxvUfMHROnTWM,107
-cryptography-44.0.3.dist-info/licenses/LICENSE,sha256=Pgx8CRqUi4JTO6mP18u0BDLW8amsv4X1ki0vmak65rs,197
-cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE,sha256=qsc7MUj20dcRHbyjIJn2jSbGRMaBOuHk8F9leaomY_4,11360
-cryptography-44.0.3.dist-info/licenses/LICENSE.BSD,sha256=YCxMdILeZHndLpeTzaJ15eY9dz2s0eymiSMqtwCPtPs,1532
-cryptography/__about__.py,sha256=awPE0zq9hPdDu1cYrUd7hGJcA-POPpSD-ams74j4eag,445
-cryptography/__init__.py,sha256=XsRL_PxbU6UgoyoglAgJQSrJCP97ovBA8YIEQ2-uI68,762
-cryptography/__pycache__/__about__.cpython-37.pyc,,
-cryptography/__pycache__/__init__.cpython-37.pyc,,
-cryptography/__pycache__/exceptions.cpython-37.pyc,,
-cryptography/__pycache__/fernet.cpython-37.pyc,,
-cryptography/__pycache__/utils.cpython-37.pyc,,
-cryptography/exceptions.py,sha256=835EWILc2fwxw-gyFMriciC2SqhViETB10LBSytnDIc,1087
-cryptography/fernet.py,sha256=aMU2HyDJ5oRGjg8AkFvHwE7BSmHY4fVUCaioxZcd8gA,6933
-cryptography/hazmat/__init__.py,sha256=5IwrLWrVp0AjEr_4FdWG_V057NSJGY_W4egNNsuct0g,455
-cryptography/hazmat/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/__pycache__/_oid.cpython-37.pyc,,
-cryptography/hazmat/_oid.py,sha256=xcGtygUQX1p2ozVjhqKk016E5--BC7ituI1EGuoiWds,15294
-cryptography/hazmat/backends/__init__.py,sha256=O5jvKFQdZnXhKeqJ-HtulaEL9Ni7mr1mDzZY5kHlYhI,361
-cryptography/hazmat/backends/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/__init__.py,sha256=p3jmJfnCag9iE5sdMrN6VvVEu55u46xaS_IjoI0SrmA,305
-cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/backend.py,sha256=_H02YwpjWOV19Mcc04QgedqGTSSjBaWEb6KIIvLyfzk,9655
-cryptography/hazmat/bindings/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/bindings/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/bindings/_rust.abi3.so,sha256=7sC4J-WiMwh7ykrcQMCq4F72wVCTcqNWf0sYDglsSrM,11541720
-cryptography/hazmat/bindings/_rust/__init__.pyi,sha256=s73-NWxZs-5r2vAzDT9Eqo9mRiWE__A4VJKyFBkjHdM,879
-cryptography/hazmat/bindings/_rust/_openssl.pyi,sha256=mpNJLuYLbCVrd5i33FBTmWwL_55Dw7JPkSLlSX9Q7oI,230
-cryptography/hazmat/bindings/_rust/asn1.pyi,sha256=BrGjC8J6nwuS-r3EVcdXJB8ndotfY9mbQYOfpbPG0HA,354
-cryptography/hazmat/bindings/_rust/exceptions.pyi,sha256=exXr2xw_0pB1kk93cYbM3MohbzoUkjOms1ZMUi0uQZE,640
-cryptography/hazmat/bindings/_rust/ocsp.pyi,sha256=mNrMO5sYEnftD_b2-NvvR6M8QdYGZ1jpTdazpgzXgl0,4004
-cryptography/hazmat/bindings/_rust/openssl/__init__.pyi,sha256=FS2gi2eALVzqTTic8an8enD431pkwKbRxeAZaNMV4Ts,1410
-cryptography/hazmat/bindings/_rust/openssl/aead.pyi,sha256=i0gA3jUQ4rkJXTGGZrq-AuY-VQLN31lyDeWuDZ0zJYw,2553
-cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi,sha256=iK0ZhQ-WyCQbjaraaFgK6q4PpD-7Rf5RDHkFD3YEW_g,1301
-cryptography/hazmat/bindings/_rust/openssl/cmac.pyi,sha256=nPH0X57RYpsAkRowVpjQiHE566ThUTx7YXrsadmrmHk,564
-cryptography/hazmat/bindings/_rust/openssl/dh.pyi,sha256=Z3TC-G04-THtSdAOPLM1h2G7ml5bda1ElZUcn5wpuhk,1564
-cryptography/hazmat/bindings/_rust/openssl/dsa.pyi,sha256=qBtkgj2albt2qFcnZ9UDrhzoNhCVO7HTby5VSf1EXMI,1299
-cryptography/hazmat/bindings/_rust/openssl/ec.pyi,sha256=zJy0pRa5n-_p2dm45PxECB_-B6SVZyNKfjxFDpPqT38,1691
-cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi,sha256=OJsrblS2nHptZctva-pAKFL5q8yPEAkhmjPZpJ6TA94,493
-cryptography/hazmat/bindings/_rust/openssl/ed448.pyi,sha256=SkPHK2HdbYN02TVQEUOgW3iTdiEY7HBE4DijpdkAzmk,475
-cryptography/hazmat/bindings/_rust/openssl/hashes.pyi,sha256=p8sdf41mPBlV_W9v_18JItuMoHE8UkBxj9Tuqi0WiTE,639
-cryptography/hazmat/bindings/_rust/openssl/hmac.pyi,sha256=ZmLJ73pmxcZFC1XosWEiXMRYtvJJor3ZLdCQOJu85Cw,662
-cryptography/hazmat/bindings/_rust/openssl/kdf.pyi,sha256=hvZSV2C3MQd9jC1Tuh5Lsb0iGBgcLVF2xFYdTo7USO4,1129
-cryptography/hazmat/bindings/_rust/openssl/keys.pyi,sha256=JSrlGNaW49ZCZ1hcb-YJdS1EAbsMwRbVEcLL0P9OApA,872
-cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi,sha256=9iogF7Q4i81IkOS-IMXp6HvxFF_3cNy_ucrAjVQnn14,540
-cryptography/hazmat/bindings/_rust/openssl/rsa.pyi,sha256=2OQCNSXkxgc-3uw1xiCCloIQTV6p9_kK79Yu0rhZgPc,1364
-cryptography/hazmat/bindings/_rust/openssl/x25519.pyi,sha256=2BKdbrddM_9SMUpdvHKGhb9MNjURCarPxccbUDzHeoA,484
-cryptography/hazmat/bindings/_rust/openssl/x448.pyi,sha256=AoRMWNvCJTiH5L-lkIkCdPlrPLUdJvvfXpIvf1GmxpM,466
-cryptography/hazmat/bindings/_rust/pkcs12.pyi,sha256=afhB_6M8xI1MIE5vxkaDF1jSxA48ib1--NiOxtf6boM,1394
-cryptography/hazmat/bindings/_rust/pkcs7.pyi,sha256=Ag9coB8kRwrUJEg1do6BJABs9DqxZiY8WJIFUVa7StE,1545
-cryptography/hazmat/bindings/_rust/test_support.pyi,sha256=FXe7t_tqI3e9ULirYcr5Zlw5szGY7TiZyb7W83ak0Nk,718
-cryptography/hazmat/bindings/_rust/x509.pyi,sha256=0p-Ak_zj-9WfyZKPo08YT6cOx1c-lhjeYd0jJ8c4oT0,8318
-cryptography/hazmat/bindings/openssl/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/_conditional.py,sha256=dkGKGU-22uR2ZKeOOwaSxEJCGaafgUjb2romWcu03QE,5163
-cryptography/hazmat/bindings/openssl/binding.py,sha256=e1gnFAZBPrkJ3CsiZV-ug6kaPdNTAEROaUFiFrUh71M,4042
-cryptography/hazmat/decrepit/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216
-cryptography/hazmat/decrepit/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216
-cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/algorithms.py,sha256=HWA4PKDS2w4D2dQoRerpLRU7Kntt5vJeJC7j--AlZVU,2520
-cryptography/hazmat/primitives/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/primitives/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_serialization.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/cmac.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/constant_time.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/hashes.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/hmac.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/keywrap.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/padding.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/poly1305.cpython-37.pyc,,
-cryptography/hazmat/primitives/_asymmetric.py,sha256=RhgcouUB6HTiFDBrR1LxqkMjpUxIiNvQ1r_zJjRG6qQ,532
-cryptography/hazmat/primitives/_cipheralgorithm.py,sha256=gKa0WrLz6K4fqhnGbfBYKDSxgLxsPU0uj_EK2UT47W4,1495
-cryptography/hazmat/primitives/_serialization.py,sha256=qrozc8fw2WZSbjk3DAlSl3ResxpauwJ74ZgGoUL-mj0,5142
-cryptography/hazmat/primitives/asymmetric/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/dh.py,sha256=OOCjMClH1Bf14Sy7jAdwzEeCxFPb8XUe2qePbExvXwc,3420
-cryptography/hazmat/primitives/asymmetric/dsa.py,sha256=xBwdf0pZOgvqjUKcO7Q0L3NxwalYj0SJDUqThemhSmI,3945
-cryptography/hazmat/primitives/asymmetric/ec.py,sha256=lwZmtAwi3PM8lsY1MsNaby_bVi--49OCxwE_1yqKC-A,10428
-cryptography/hazmat/primitives/asymmetric/ed25519.py,sha256=kl63fg7myuMjNTmMoVFeH6iVr0x5FkjNmggxIRTloJk,3423
-cryptography/hazmat/primitives/asymmetric/ed448.py,sha256=2UzEDzzfkPn83UFVFlMZfIMbAixxY09WmQyrwinWTn8,3456
-cryptography/hazmat/primitives/asymmetric/padding.py,sha256=eZcvUqVLbe3u48SunLdeniaPlV4-k6pwBl67OW4jSy8,2885
-cryptography/hazmat/primitives/asymmetric/rsa.py,sha256=dvj4i2js78qpgotEKn3SU5Eh2unDSMiZpTVo2kx_NWU,7668
-cryptography/hazmat/primitives/asymmetric/types.py,sha256=LnsOJym-wmPUJ7Knu_7bCNU3kIiELCd6krOaW_JU08I,2996
-cryptography/hazmat/primitives/asymmetric/utils.py,sha256=DPTs6T4F-UhwzFQTh-1fSEpQzazH2jf2xpIro3ItF4o,790
-cryptography/hazmat/primitives/asymmetric/x25519.py,sha256=VGYuRdIYuVBtizpFdNWd2bTrT10JRa1admQdBr08xz8,3341
-cryptography/hazmat/primitives/asymmetric/x448.py,sha256=GKKJBqYLr03VewMF18bXIM941aaWcZIQ4rC02GLLEmw,3374
-cryptography/hazmat/primitives/ciphers/__init__.py,sha256=eyEXmjk6_CZXaOPYDr7vAYGXr29QvzgWL2-4CSolLFs,680
-cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/aead.py,sha256=Fzlyx7w8KYQakzDp1zWgJnIr62zgZrgVh1u2h4exB54,634
-cryptography/hazmat/primitives/ciphers/algorithms.py,sha256=cPzrUizm_RfUi7DDqf3WNezkFy2IxfllsJv6s16bWS8,4493
-cryptography/hazmat/primitives/ciphers/base.py,sha256=tg-XNaKUyETBi7ounGDEL1_ICn-s4FF9LR7moV58blI,4211
-cryptography/hazmat/primitives/ciphers/modes.py,sha256=BFpxEGSaxoeZjrQ4sqpyPDvKClrqfDKIBv7kYtFURhE,8192
-cryptography/hazmat/primitives/cmac.py,sha256=sz_s6H_cYnOvx-VNWdIKhRhe3Ymp8z8J0D3CBqOX3gg,338
-cryptography/hazmat/primitives/constant_time.py,sha256=xdunWT0nf8OvKdcqUhhlFKayGp4_PgVJRU2W1wLSr_A,422
-cryptography/hazmat/primitives/hashes.py,sha256=EvDIJBhj83Z7f-oHbsA0TzZLFSDV_Yv8hQRdM4o8FD0,5091
-cryptography/hazmat/primitives/hmac.py,sha256=RpB3z9z5skirCQrm7zQbtnp9pLMnAjrlTUvKqF5aDDc,423
-cryptography/hazmat/primitives/kdf/__init__.py,sha256=4XibZnrYq4hh5xBjWiIXzaYW6FKx8hPbVaa_cB9zS64,750
-cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/argon2.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/concatkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/kbkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/scrypt.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/x963kdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/argon2.py,sha256=UFDNXG0v-rw3DqAQTB1UQAsQC2M5Ejg0k_6OCyhLKus,460
-cryptography/hazmat/primitives/kdf/concatkdf.py,sha256=bcn4NGXse-EsFl7nlU83e5ilop7TSHcX-CJJS107W80,3686
-cryptography/hazmat/primitives/kdf/hkdf.py,sha256=uhN5L87w4JvtAqQcPh_Ji2TPSc18IDThpaYJiHOWy3A,3015
-cryptography/hazmat/primitives/kdf/kbkdf.py,sha256=eSuLK1sATkamgCAit794jLr7sDNlu5X0USdcWhwJdmk,9146
-cryptography/hazmat/primitives/kdf/pbkdf2.py,sha256=Xj3YIeX30h2BUaoJAtOo1RMXV_em0-eCG0PU_0FHJzM,1950
-cryptography/hazmat/primitives/kdf/scrypt.py,sha256=XyWUdUUmhuI9V6TqAPOvujCSMGv1XQdg0a21IWCmO-U,590
-cryptography/hazmat/primitives/kdf/x963kdf.py,sha256=wCpWmwQjZ2vAu2rlk3R_PX0nINl8WGXYBmlyMOC5iPw,1992
-cryptography/hazmat/primitives/keywrap.py,sha256=XV4Pj2fqSeD-RqZVvY2cA3j5_7RwJSFygYuLfk2ujCo,5650
-cryptography/hazmat/primitives/padding.py,sha256=Qu1VVsCiqfQMPPqU0qU6ig9Y802jZlXVOUDLIxN5KeQ,4932
-cryptography/hazmat/primitives/poly1305.py,sha256=P5EPQV-RB_FJPahpg01u0Ts4S_PnAmsroxIGXbGeRRo,355
-cryptography/hazmat/primitives/serialization/__init__.py,sha256=jyNx_7NcOEbVRBY4nP9ks0IVXBafbcYnTK27vafPLW8,1653
-cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/pkcs12.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/pkcs7.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/base.py,sha256=ikq5MJIwp_oUnjiaBco_PmQwOTYuGi-XkYUYHKy8Vo0,615
-cryptography/hazmat/primitives/serialization/pkcs12.py,sha256=7vVXbiP7qhhvKAHJT_M8-LBZdbpOwrpWRHWxNrNqzXE,4492
-cryptography/hazmat/primitives/serialization/pkcs7.py,sha256=n25jEw__vkZWSlumwgYnqJ0lzyPh5xljMsJDyp2QomM,12346
-cryptography/hazmat/primitives/serialization/ssh.py,sha256=VKscMrVdYK5B9PQISjjdRMglRvqa_L3sDNm5vdjVHJY,51915
-cryptography/hazmat/primitives/twofactor/__init__.py,sha256=tmMZGB-g4IU1r7lIFqASU019zr0uPp_wEBYcwdDCKCA,258
-cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/hotp.py,sha256=rv507uNznUs22XlaqGBbZKkkGjmiTUAcwghTYMem6uM,3219
-cryptography/hazmat/primitives/twofactor/totp.py,sha256=BQ0oPTp2JW1SMZqdgv95NBG3u_ODiDtzVJENHWYhvXY,1613
-cryptography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cryptography/utils.py,sha256=Rp7ppg4XIBVVzNQ6XngGndwkICJoYp6FoFOOgTWLJ7g,3925
-cryptography/x509/__init__.py,sha256=Q8P-MnUGrgFxRt5423bE-gzSvgZLAdddWuPheHnuA_c,8132
-cryptography/x509/__pycache__/__init__.cpython-37.pyc,,
-cryptography/x509/__pycache__/base.cpython-37.pyc,,
-cryptography/x509/__pycache__/certificate_transparency.cpython-37.pyc,,
-cryptography/x509/__pycache__/extensions.cpython-37.pyc,,
-cryptography/x509/__pycache__/general_name.cpython-37.pyc,,
-cryptography/x509/__pycache__/name.cpython-37.pyc,,
-cryptography/x509/__pycache__/ocsp.cpython-37.pyc,,
-cryptography/x509/__pycache__/oid.cpython-37.pyc,,
-cryptography/x509/__pycache__/verification.cpython-37.pyc,,
-cryptography/x509/base.py,sha256=-F5KWjxbyjSqluUSr7LRC_sqN_s-qHP5K0rW-41PI4E,26909
-cryptography/x509/certificate_transparency.py,sha256=JqoOIDhlwInrYMFW6IFn77WJ0viF-PB_rlZV3vs9MYc,797
-cryptography/x509/extensions.py,sha256=iX-3WFm4yFjstFIs1F30f3tixIp6i0WgGdc6GwJ-QiQ,76158
-cryptography/x509/general_name.py,sha256=sP_rV11Qlpsk4x3XXGJY_Mv0Q_s9dtjeLckHsjpLQoQ,7836
-cryptography/x509/name.py,sha256=MYCxCSTQTpzhjxFPZaANqJ9fGrhESH73vPkoay8HSWM,14830
-cryptography/x509/ocsp.py,sha256=vbrg3p1hBJQEEFIZ35GHcjbGwTrsxPhlot-OVpyP-C8,11390
-cryptography/x509/oid.py,sha256=X8EbhkRTLrGuv9vHZSGqPd9zpvRVsonU_joWAL5LLY8,885
-cryptography/x509/verification.py,sha256=alfx3VaTSb2bMz7_7s788oL90vzgHwBjVINssdz0Gv0,796
-rust/Cargo.toml,sha256=gaBJTn9TwBCG7U3JgETYbTmK8DNUxl4gKKS65nDWuwM,1320
-rust/cryptography-cffi/Cargo.toml,sha256=CjVBJTYW1TwzXgLgY8TZ92NP_9XSmHzSfRIzVaZh9Bk,386
-rust/cryptography-keepalive/Cargo.toml,sha256=_ABt1o-uFnxDqhb7YzNynb6YEQ2eW2QpnPD1RXBUsrI,210
-rust/cryptography-key-parsing/Cargo.toml,sha256=yLWh172kspq6BJVZA2PjFw17Rt0xTYKn_TTzp3IVhxg,455
-rust/cryptography-openssl/Cargo.toml,sha256=mI0cIDv-kQTl24C-bLvDCqiWn6QobBdqCMYSi_UWPE0,545
-rust/cryptography-x509-verification/Cargo.toml,sha256=vECbxPiNu-dQhW4baTuSPzgqaBnBgwZYnJCSaJQbIUA,426
-rust/cryptography-x509/Cargo.toml,sha256=wAuwnc1eKnSUNFjf4GpQM__FTig-hqF2ZPXJPmqb6cA,248
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/REQUESTED b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/REQUESTED
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/WHEEL b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/WHEEL
deleted file mode 100644
index 871054fb6..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: maturin (1.7.5)
-Root-Is-Purelib: false
-Tag: cp37-abi3-manylinux_2_28_x86_64
-
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE
deleted file mode 100644
index b11f379ef..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE
+++ /dev/null
@@ -1,3 +0,0 @@
-This software is made available under the terms of *either* of the licenses
-found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made
-under the terms of *both* these licenses.
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE
deleted file mode 100644
index 62589edd1..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- https://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD b/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD
deleted file mode 100644
index ec1a29d34..000000000
--- a/resources/python/bin/3.7/linux/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) Individual contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of PyCA Cryptography nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/resources/python/bin/3.7/linux/cryptography/__about__.py b/resources/python/bin/3.7/linux/cryptography/__about__.py
deleted file mode 100644
index 8bbf96e34..000000000
--- a/resources/python/bin/3.7/linux/cryptography/__about__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-__all__ = [
- "__author__",
- "__copyright__",
- "__version__",
-]
-
-__version__ = "44.0.3"
-
-
-__author__ = "The Python Cryptographic Authority and individual contributors"
-__copyright__ = f"Copyright 2013-2024 {__author__}"
diff --git a/resources/python/bin/3.7/linux/cryptography/__init__.py b/resources/python/bin/3.7/linux/cryptography/__init__.py
deleted file mode 100644
index f37370e90..000000000
--- a/resources/python/bin/3.7/linux/cryptography/__init__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import sys
-import warnings
-
-from cryptography import utils
-from cryptography.__about__ import __author__, __copyright__, __version__
-
-__all__ = [
- "__author__",
- "__copyright__",
- "__version__",
-]
-
-if sys.version_info[:2] == (3, 7):
- warnings.warn(
- "Python 3.7 is no longer supported by the Python core team "
- "and support for it is deprecated in cryptography. A future "
- "release of cryptography will remove support for Python 3.7.",
- utils.CryptographyDeprecationWarning,
- stacklevel=2,
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/exceptions.py b/resources/python/bin/3.7/linux/cryptography/exceptions.py
deleted file mode 100644
index fe125ea9a..000000000
--- a/resources/python/bin/3.7/linux/cryptography/exceptions.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.bindings._rust import exceptions as rust_exceptions
-
-if typing.TYPE_CHECKING:
- from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-_Reasons = rust_exceptions._Reasons
-
-
-class UnsupportedAlgorithm(Exception):
- def __init__(self, message: str, reason: _Reasons | None = None) -> None:
- super().__init__(message)
- self._reason = reason
-
-
-class AlreadyFinalized(Exception):
- pass
-
-
-class AlreadyUpdated(Exception):
- pass
-
-
-class NotYetFinalized(Exception):
- pass
-
-
-class InvalidTag(Exception):
- pass
-
-
-class InvalidSignature(Exception):
- pass
-
-
-class InternalError(Exception):
- def __init__(
- self, msg: str, err_code: list[rust_openssl.OpenSSLError]
- ) -> None:
- super().__init__(msg)
- self.err_code = err_code
-
-
-class InvalidKey(Exception):
- pass
diff --git a/resources/python/bin/3.7/linux/cryptography/fernet.py b/resources/python/bin/3.7/linux/cryptography/fernet.py
deleted file mode 100644
index 868ecb277..000000000
--- a/resources/python/bin/3.7/linux/cryptography/fernet.py
+++ /dev/null
@@ -1,223 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import base64
-import binascii
-import os
-import time
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import InvalidSignature
-from cryptography.hazmat.primitives import hashes, padding
-from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
-from cryptography.hazmat.primitives.hmac import HMAC
-
-
-class InvalidToken(Exception):
- pass
-
-
-_MAX_CLOCK_SKEW = 60
-
-
-class Fernet:
- def __init__(
- self,
- key: bytes | str,
- backend: typing.Any = None,
- ) -> None:
- try:
- key = base64.urlsafe_b64decode(key)
- except binascii.Error as exc:
- raise ValueError(
- "Fernet key must be 32 url-safe base64-encoded bytes."
- ) from exc
- if len(key) != 32:
- raise ValueError(
- "Fernet key must be 32 url-safe base64-encoded bytes."
- )
-
- self._signing_key = key[:16]
- self._encryption_key = key[16:]
-
- @classmethod
- def generate_key(cls) -> bytes:
- return base64.urlsafe_b64encode(os.urandom(32))
-
- def encrypt(self, data: bytes) -> bytes:
- return self.encrypt_at_time(data, int(time.time()))
-
- def encrypt_at_time(self, data: bytes, current_time: int) -> bytes:
- iv = os.urandom(16)
- return self._encrypt_from_parts(data, current_time, iv)
-
- def _encrypt_from_parts(
- self, data: bytes, current_time: int, iv: bytes
- ) -> bytes:
- utils._check_bytes("data", data)
-
- padder = padding.PKCS7(algorithms.AES.block_size).padder()
- padded_data = padder.update(data) + padder.finalize()
- encryptor = Cipher(
- algorithms.AES(self._encryption_key),
- modes.CBC(iv),
- ).encryptor()
- ciphertext = encryptor.update(padded_data) + encryptor.finalize()
-
- basic_parts = (
- b"\x80"
- + current_time.to_bytes(length=8, byteorder="big")
- + iv
- + ciphertext
- )
-
- h = HMAC(self._signing_key, hashes.SHA256())
- h.update(basic_parts)
- hmac = h.finalize()
- return base64.urlsafe_b64encode(basic_parts + hmac)
-
- def decrypt(self, token: bytes | str, ttl: int | None = None) -> bytes:
- timestamp, data = Fernet._get_unverified_token_data(token)
- if ttl is None:
- time_info = None
- else:
- time_info = (ttl, int(time.time()))
- return self._decrypt_data(data, timestamp, time_info)
-
- def decrypt_at_time(
- self, token: bytes | str, ttl: int, current_time: int
- ) -> bytes:
- if ttl is None:
- raise ValueError(
- "decrypt_at_time() can only be used with a non-None ttl"
- )
- timestamp, data = Fernet._get_unverified_token_data(token)
- return self._decrypt_data(data, timestamp, (ttl, current_time))
-
- def extract_timestamp(self, token: bytes | str) -> int:
- timestamp, data = Fernet._get_unverified_token_data(token)
- # Verify the token was not tampered with.
- self._verify_signature(data)
- return timestamp
-
- @staticmethod
- def _get_unverified_token_data(token: bytes | str) -> tuple[int, bytes]:
- if not isinstance(token, (str, bytes)):
- raise TypeError("token must be bytes or str")
-
- try:
- data = base64.urlsafe_b64decode(token)
- except (TypeError, binascii.Error):
- raise InvalidToken
-
- if not data or data[0] != 0x80:
- raise InvalidToken
-
- if len(data) < 9:
- raise InvalidToken
-
- timestamp = int.from_bytes(data[1:9], byteorder="big")
- return timestamp, data
-
- def _verify_signature(self, data: bytes) -> None:
- h = HMAC(self._signing_key, hashes.SHA256())
- h.update(data[:-32])
- try:
- h.verify(data[-32:])
- except InvalidSignature:
- raise InvalidToken
-
- def _decrypt_data(
- self,
- data: bytes,
- timestamp: int,
- time_info: tuple[int, int] | None,
- ) -> bytes:
- if time_info is not None:
- ttl, current_time = time_info
- if timestamp + ttl < current_time:
- raise InvalidToken
-
- if current_time + _MAX_CLOCK_SKEW < timestamp:
- raise InvalidToken
-
- self._verify_signature(data)
-
- iv = data[9:25]
- ciphertext = data[25:-32]
- decryptor = Cipher(
- algorithms.AES(self._encryption_key), modes.CBC(iv)
- ).decryptor()
- plaintext_padded = decryptor.update(ciphertext)
- try:
- plaintext_padded += decryptor.finalize()
- except ValueError:
- raise InvalidToken
- unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
-
- unpadded = unpadder.update(plaintext_padded)
- try:
- unpadded += unpadder.finalize()
- except ValueError:
- raise InvalidToken
- return unpadded
-
-
-class MultiFernet:
- def __init__(self, fernets: typing.Iterable[Fernet]):
- fernets = list(fernets)
- if not fernets:
- raise ValueError(
- "MultiFernet requires at least one Fernet instance"
- )
- self._fernets = fernets
-
- def encrypt(self, msg: bytes) -> bytes:
- return self.encrypt_at_time(msg, int(time.time()))
-
- def encrypt_at_time(self, msg: bytes, current_time: int) -> bytes:
- return self._fernets[0].encrypt_at_time(msg, current_time)
-
- def rotate(self, msg: bytes | str) -> bytes:
- timestamp, data = Fernet._get_unverified_token_data(msg)
- for f in self._fernets:
- try:
- p = f._decrypt_data(data, timestamp, None)
- break
- except InvalidToken:
- pass
- else:
- raise InvalidToken
-
- iv = os.urandom(16)
- return self._fernets[0]._encrypt_from_parts(p, timestamp, iv)
-
- def decrypt(self, msg: bytes | str, ttl: int | None = None) -> bytes:
- for f in self._fernets:
- try:
- return f.decrypt(msg, ttl)
- except InvalidToken:
- pass
- raise InvalidToken
-
- def decrypt_at_time(
- self, msg: bytes | str, ttl: int, current_time: int
- ) -> bytes:
- for f in self._fernets:
- try:
- return f.decrypt_at_time(msg, ttl, current_time)
- except InvalidToken:
- pass
- raise InvalidToken
-
- def extract_timestamp(self, msg: bytes | str) -> int:
- for f in self._fernets:
- try:
- return f.extract_timestamp(msg)
- except InvalidToken:
- pass
- raise InvalidToken
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/__init__.py
deleted file mode 100644
index b9f118701..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-"""
-Hazardous Materials
-
-This is a "Hazardous Materials" module. You should ONLY use it if you're
-100% absolutely sure that you know what you're doing because this module
-is full of land mines, dragons, and dinosaurs with laser guns.
-"""
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/_oid.py b/resources/python/bin/3.7/linux/cryptography/hazmat/_oid.py
deleted file mode 100644
index 8bd240d09..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/_oid.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import (
- ObjectIdentifier as ObjectIdentifier,
-)
-from cryptography.hazmat.primitives import hashes
-
-
-class ExtensionOID:
- SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9")
- SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14")
- KEY_USAGE = ObjectIdentifier("2.5.29.15")
- SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17")
- ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18")
- BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19")
- NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30")
- CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31")
- CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32")
- POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33")
- AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35")
- POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36")
- EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37")
- FRESHEST_CRL = ObjectIdentifier("2.5.29.46")
- INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54")
- ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28")
- AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1")
- SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11")
- OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5")
- TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24")
- CRL_NUMBER = ObjectIdentifier("2.5.29.20")
- DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27")
- PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier(
- "1.3.6.1.4.1.11129.2.4.2"
- )
- PRECERT_POISON = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3")
- SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.5")
- MS_CERTIFICATE_TEMPLATE = ObjectIdentifier("1.3.6.1.4.1.311.21.7")
- ADMISSIONS = ObjectIdentifier("1.3.36.8.3.3")
-
-
-class OCSPExtensionOID:
- NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2")
- ACCEPTABLE_RESPONSES = ObjectIdentifier("1.3.6.1.5.5.7.48.1.4")
-
-
-class CRLEntryExtensionOID:
- CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29")
- CRL_REASON = ObjectIdentifier("2.5.29.21")
- INVALIDITY_DATE = ObjectIdentifier("2.5.29.24")
-
-
-class NameOID:
- COMMON_NAME = ObjectIdentifier("2.5.4.3")
- COUNTRY_NAME = ObjectIdentifier("2.5.4.6")
- LOCALITY_NAME = ObjectIdentifier("2.5.4.7")
- STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8")
- STREET_ADDRESS = ObjectIdentifier("2.5.4.9")
- ORGANIZATION_IDENTIFIER = ObjectIdentifier("2.5.4.97")
- ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10")
- ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11")
- SERIAL_NUMBER = ObjectIdentifier("2.5.4.5")
- SURNAME = ObjectIdentifier("2.5.4.4")
- GIVEN_NAME = ObjectIdentifier("2.5.4.42")
- TITLE = ObjectIdentifier("2.5.4.12")
- INITIALS = ObjectIdentifier("2.5.4.43")
- GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44")
- X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45")
- DN_QUALIFIER = ObjectIdentifier("2.5.4.46")
- PSEUDONYM = ObjectIdentifier("2.5.4.65")
- USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1")
- DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25")
- EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1")
- JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3")
- JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1")
- JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier(
- "1.3.6.1.4.1.311.60.2.1.2"
- )
- BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15")
- POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16")
- POSTAL_CODE = ObjectIdentifier("2.5.4.17")
- INN = ObjectIdentifier("1.2.643.3.131.1.1")
- OGRN = ObjectIdentifier("1.2.643.100.1")
- SNILS = ObjectIdentifier("1.2.643.100.3")
- UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")
-
-
-class SignatureAlgorithmOID:
- RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4")
- RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5")
- # This is an alternate OID for RSA with SHA1 that is occasionally seen
- _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29")
- RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14")
- RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11")
- RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12")
- RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13")
- RSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.13")
- RSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.14")
- RSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.15")
- RSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.16")
- RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")
- ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1")
- ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1")
- ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2")
- ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3")
- ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4")
- ECDSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.9")
- ECDSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.10")
- ECDSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.11")
- ECDSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.12")
- DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3")
- DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1")
- DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2")
- DSA_WITH_SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.3.3")
- DSA_WITH_SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.3.4")
- ED25519 = ObjectIdentifier("1.3.101.112")
- ED448 = ObjectIdentifier("1.3.101.113")
- GOSTR3411_94_WITH_3410_2001 = ObjectIdentifier("1.2.643.2.2.3")
- GOSTR3410_2012_WITH_3411_2012_256 = ObjectIdentifier("1.2.643.7.1.1.3.2")
- GOSTR3410_2012_WITH_3411_2012_512 = ObjectIdentifier("1.2.643.7.1.1.3.3")
-
-
-_SIG_OIDS_TO_HASH: dict[ObjectIdentifier, hashes.HashAlgorithm | None] = {
- SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(),
- SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(),
- SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_224: hashes.SHA3_224(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_256: hashes.SHA3_256(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_384: hashes.SHA3_384(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_512: hashes.SHA3_512(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_224: hashes.SHA3_224(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_256: hashes.SHA3_256(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_384: hashes.SHA3_384(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_512: hashes.SHA3_512(),
- SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.ED25519: None,
- SignatureAlgorithmOID.ED448: None,
- SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: None,
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: None,
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: None,
-}
-
-
-class PublicKeyAlgorithmOID:
- DSA = ObjectIdentifier("1.2.840.10040.4.1")
- EC_PUBLIC_KEY = ObjectIdentifier("1.2.840.10045.2.1")
- RSAES_PKCS1_v1_5 = ObjectIdentifier("1.2.840.113549.1.1.1")
- RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")
- X25519 = ObjectIdentifier("1.3.101.110")
- X448 = ObjectIdentifier("1.3.101.111")
- ED25519 = ObjectIdentifier("1.3.101.112")
- ED448 = ObjectIdentifier("1.3.101.113")
-
-
-class ExtendedKeyUsageOID:
- SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1")
- CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2")
- CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3")
- EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4")
- TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8")
- OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9")
- ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0")
- SMARTCARD_LOGON = ObjectIdentifier("1.3.6.1.4.1.311.20.2.2")
- KERBEROS_PKINIT_KDC = ObjectIdentifier("1.3.6.1.5.2.3.5")
- IPSEC_IKE = ObjectIdentifier("1.3.6.1.5.5.7.3.17")
- CERTIFICATE_TRANSPARENCY = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.4")
-
-
-class AuthorityInformationAccessOID:
- CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2")
- OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1")
-
-
-class SubjectInformationAccessOID:
- CA_REPOSITORY = ObjectIdentifier("1.3.6.1.5.5.7.48.5")
-
-
-class CertificatePoliciesOID:
- CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1")
- CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2")
- ANY_POLICY = ObjectIdentifier("2.5.29.32.0")
-
-
-class AttributeOID:
- CHALLENGE_PASSWORD = ObjectIdentifier("1.2.840.113549.1.9.7")
- UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")
-
-
-_OID_NAMES = {
- NameOID.COMMON_NAME: "commonName",
- NameOID.COUNTRY_NAME: "countryName",
- NameOID.LOCALITY_NAME: "localityName",
- NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName",
- NameOID.STREET_ADDRESS: "streetAddress",
- NameOID.ORGANIZATION_NAME: "organizationName",
- NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName",
- NameOID.SERIAL_NUMBER: "serialNumber",
- NameOID.SURNAME: "surname",
- NameOID.GIVEN_NAME: "givenName",
- NameOID.TITLE: "title",
- NameOID.GENERATION_QUALIFIER: "generationQualifier",
- NameOID.X500_UNIQUE_IDENTIFIER: "x500UniqueIdentifier",
- NameOID.DN_QUALIFIER: "dnQualifier",
- NameOID.PSEUDONYM: "pseudonym",
- NameOID.USER_ID: "userID",
- NameOID.DOMAIN_COMPONENT: "domainComponent",
- NameOID.EMAIL_ADDRESS: "emailAddress",
- NameOID.JURISDICTION_COUNTRY_NAME: "jurisdictionCountryName",
- NameOID.JURISDICTION_LOCALITY_NAME: "jurisdictionLocalityName",
- NameOID.JURISDICTION_STATE_OR_PROVINCE_NAME: (
- "jurisdictionStateOrProvinceName"
- ),
- NameOID.BUSINESS_CATEGORY: "businessCategory",
- NameOID.POSTAL_ADDRESS: "postalAddress",
- NameOID.POSTAL_CODE: "postalCode",
- NameOID.INN: "INN",
- NameOID.OGRN: "OGRN",
- NameOID.SNILS: "SNILS",
- NameOID.UNSTRUCTURED_NAME: "unstructuredName",
- SignatureAlgorithmOID.RSA_WITH_MD5: "md5WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA1: "sha1WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA224: "sha224WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA256: "sha256WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA384: "sha384WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA512: "sha512WithRSAEncryption",
- SignatureAlgorithmOID.RSASSA_PSS: "RSASSA-PSS",
- SignatureAlgorithmOID.ECDSA_WITH_SHA1: "ecdsa-with-SHA1",
- SignatureAlgorithmOID.ECDSA_WITH_SHA224: "ecdsa-with-SHA224",
- SignatureAlgorithmOID.ECDSA_WITH_SHA256: "ecdsa-with-SHA256",
- SignatureAlgorithmOID.ECDSA_WITH_SHA384: "ecdsa-with-SHA384",
- SignatureAlgorithmOID.ECDSA_WITH_SHA512: "ecdsa-with-SHA512",
- SignatureAlgorithmOID.DSA_WITH_SHA1: "dsa-with-sha1",
- SignatureAlgorithmOID.DSA_WITH_SHA224: "dsa-with-sha224",
- SignatureAlgorithmOID.DSA_WITH_SHA256: "dsa-with-sha256",
- SignatureAlgorithmOID.ED25519: "ed25519",
- SignatureAlgorithmOID.ED448: "ed448",
- SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: (
- "GOST R 34.11-94 with GOST R 34.10-2001"
- ),
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: (
- "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)"
- ),
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: (
- "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)"
- ),
- PublicKeyAlgorithmOID.DSA: "dsaEncryption",
- PublicKeyAlgorithmOID.EC_PUBLIC_KEY: "id-ecPublicKey",
- PublicKeyAlgorithmOID.RSAES_PKCS1_v1_5: "rsaEncryption",
- PublicKeyAlgorithmOID.RSASSA_PSS: "rsassaPss",
- PublicKeyAlgorithmOID.X25519: "X25519",
- PublicKeyAlgorithmOID.X448: "X448",
- ExtendedKeyUsageOID.SERVER_AUTH: "serverAuth",
- ExtendedKeyUsageOID.CLIENT_AUTH: "clientAuth",
- ExtendedKeyUsageOID.CODE_SIGNING: "codeSigning",
- ExtendedKeyUsageOID.EMAIL_PROTECTION: "emailProtection",
- ExtendedKeyUsageOID.TIME_STAMPING: "timeStamping",
- ExtendedKeyUsageOID.OCSP_SIGNING: "OCSPSigning",
- ExtendedKeyUsageOID.SMARTCARD_LOGON: "msSmartcardLogin",
- ExtendedKeyUsageOID.KERBEROS_PKINIT_KDC: "pkInitKDC",
- ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES: "subjectDirectoryAttributes",
- ExtensionOID.SUBJECT_KEY_IDENTIFIER: "subjectKeyIdentifier",
- ExtensionOID.KEY_USAGE: "keyUsage",
- ExtensionOID.SUBJECT_ALTERNATIVE_NAME: "subjectAltName",
- ExtensionOID.ISSUER_ALTERNATIVE_NAME: "issuerAltName",
- ExtensionOID.BASIC_CONSTRAINTS: "basicConstraints",
- ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS: (
- "signedCertificateTimestampList"
- ),
- ExtensionOID.SIGNED_CERTIFICATE_TIMESTAMPS: (
- "signedCertificateTimestampList"
- ),
- ExtensionOID.PRECERT_POISON: "ctPoison",
- ExtensionOID.MS_CERTIFICATE_TEMPLATE: "msCertificateTemplate",
- ExtensionOID.ADMISSIONS: "Admissions",
- CRLEntryExtensionOID.CRL_REASON: "cRLReason",
- CRLEntryExtensionOID.INVALIDITY_DATE: "invalidityDate",
- CRLEntryExtensionOID.CERTIFICATE_ISSUER: "certificateIssuer",
- ExtensionOID.NAME_CONSTRAINTS: "nameConstraints",
- ExtensionOID.CRL_DISTRIBUTION_POINTS: "cRLDistributionPoints",
- ExtensionOID.CERTIFICATE_POLICIES: "certificatePolicies",
- ExtensionOID.POLICY_MAPPINGS: "policyMappings",
- ExtensionOID.AUTHORITY_KEY_IDENTIFIER: "authorityKeyIdentifier",
- ExtensionOID.POLICY_CONSTRAINTS: "policyConstraints",
- ExtensionOID.EXTENDED_KEY_USAGE: "extendedKeyUsage",
- ExtensionOID.FRESHEST_CRL: "freshestCRL",
- ExtensionOID.INHIBIT_ANY_POLICY: "inhibitAnyPolicy",
- ExtensionOID.ISSUING_DISTRIBUTION_POINT: "issuingDistributionPoint",
- ExtensionOID.AUTHORITY_INFORMATION_ACCESS: "authorityInfoAccess",
- ExtensionOID.SUBJECT_INFORMATION_ACCESS: "subjectInfoAccess",
- ExtensionOID.OCSP_NO_CHECK: "OCSPNoCheck",
- ExtensionOID.CRL_NUMBER: "cRLNumber",
- ExtensionOID.DELTA_CRL_INDICATOR: "deltaCRLIndicator",
- ExtensionOID.TLS_FEATURE: "TLSFeature",
- AuthorityInformationAccessOID.OCSP: "OCSP",
- AuthorityInformationAccessOID.CA_ISSUERS: "caIssuers",
- SubjectInformationAccessOID.CA_REPOSITORY: "caRepository",
- CertificatePoliciesOID.CPS_QUALIFIER: "id-qt-cps",
- CertificatePoliciesOID.CPS_USER_NOTICE: "id-qt-unotice",
- OCSPExtensionOID.NONCE: "OCSPNonce",
- AttributeOID.CHALLENGE_PASSWORD: "challengePassword",
-}
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/backends/__init__.py
deleted file mode 100644
index b4400aa03..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from typing import Any
-
-
-def default_backend() -> Any:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- return backend
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/__init__.py
deleted file mode 100644
index 51b04476c..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.backends.openssl.backend import backend
-
-__all__ = ["backend"]
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/backend.py b/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/backend.py
deleted file mode 100644
index 34899d4eb..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/backends/openssl/backend.py
+++ /dev/null
@@ -1,288 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.bindings.openssl import binding
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding
-from cryptography.hazmat.primitives.asymmetric import ec
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-from cryptography.hazmat.primitives.asymmetric.padding import (
- MGF1,
- OAEP,
- PSS,
- PKCS1v15,
-)
-from cryptography.hazmat.primitives.ciphers import (
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers.algorithms import (
- AES,
-)
-from cryptography.hazmat.primitives.ciphers.modes import (
- CBC,
- Mode,
-)
-
-
-class Backend:
- """
- OpenSSL API binding interfaces.
- """
-
- name = "openssl"
-
- # TripleDES encryption is disallowed/deprecated throughout 2023 in
- # FIPS 140-3. To keep it simple we denylist any use of TripleDES (TDEA).
- _fips_ciphers = (AES,)
- # Sometimes SHA1 is still permissible. That logic is contained
- # within the various *_supported methods.
- _fips_hashes = (
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- hashes.SHA512_224,
- hashes.SHA512_256,
- hashes.SHA3_224,
- hashes.SHA3_256,
- hashes.SHA3_384,
- hashes.SHA3_512,
- hashes.SHAKE128,
- hashes.SHAKE256,
- )
- _fips_ecdh_curves = (
- ec.SECP224R1,
- ec.SECP256R1,
- ec.SECP384R1,
- ec.SECP521R1,
- )
- _fips_rsa_min_key_size = 2048
- _fips_rsa_min_public_exponent = 65537
- _fips_dsa_min_modulus = 1 << 2048
- _fips_dh_min_key_size = 2048
- _fips_dh_min_modulus = 1 << _fips_dh_min_key_size
-
- def __init__(self) -> None:
- self._binding = binding.Binding()
- self._ffi = self._binding.ffi
- self._lib = self._binding.lib
- self._fips_enabled = rust_openssl.is_fips_enabled()
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def openssl_assert(self, ok: bool) -> None:
- return binding._openssl_assert(ok)
-
- def _enable_fips(self) -> None:
- # This function enables FIPS mode for OpenSSL 3.0.0 on installs that
- # have the FIPS provider installed properly.
- rust_openssl.enable_fips(rust_openssl._providers)
- assert rust_openssl.is_fips_enabled()
- self._fips_enabled = rust_openssl.is_fips_enabled()
-
- def openssl_version_text(self) -> str:
- """
- Friendly string name of the loaded OpenSSL library. This is not
- necessarily the same version as it was compiled against.
-
- Example: OpenSSL 3.2.1 30 Jan 2024
- """
- return rust_openssl.openssl_version_text()
-
- def openssl_version_number(self) -> int:
- return rust_openssl.openssl_version()
-
- def hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if self._fips_enabled and not isinstance(algorithm, self._fips_hashes):
- return False
-
- return rust_openssl.hashes.hash_supported(algorithm)
-
- def signature_hash_supported(
- self, algorithm: hashes.HashAlgorithm
- ) -> bool:
- # Dedicated check for hashing algorithm use in message digest for
- # signatures, e.g. RSA PKCS#1 v1.5 SHA1 (sha1WithRSAEncryption).
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return False
- return self.hash_supported(algorithm)
-
- def scrypt_supported(self) -> bool:
- if self._fips_enabled:
- return False
- else:
- return hasattr(rust_openssl.kdf.Scrypt, "derive")
-
- def argon2_supported(self) -> bool:
- if self._fips_enabled:
- return False
- else:
- return hasattr(rust_openssl.kdf.Argon2id, "derive")
-
- def hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- # FIPS mode still allows SHA1 for HMAC
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return True
-
- return self.hash_supported(algorithm)
-
- def cipher_supported(self, cipher: CipherAlgorithm, mode: Mode) -> bool:
- if self._fips_enabled:
- # FIPS mode requires AES. TripleDES is disallowed/deprecated in
- # FIPS 140-3.
- if not isinstance(cipher, self._fips_ciphers):
- return False
-
- return rust_openssl.ciphers.cipher_supported(cipher, mode)
-
- def pbkdf2_hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- return self.hmac_supported(algorithm)
-
- def _consume_errors(self) -> list[rust_openssl.OpenSSLError]:
- return rust_openssl.capture_error_stack()
-
- def _oaep_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return False
-
- return isinstance(
- algorithm,
- (
- hashes.SHA1,
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- ),
- )
-
- def rsa_padding_supported(self, padding: AsymmetricPadding) -> bool:
- if isinstance(padding, PKCS1v15):
- return True
- elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1):
- # FIPS 186-4 only allows salt length == digest length for PSS
- # It is technically acceptable to set an explicit salt length
- # equal to the digest length and this will incorrectly fail, but
- # since we don't do that in the tests and this method is
- # private, we'll ignore that until we need to do otherwise.
- if (
- self._fips_enabled
- and padding._salt_length != PSS.DIGEST_LENGTH
- ):
- return False
- return self.hash_supported(padding._mgf._algorithm)
- elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1):
- return self._oaep_hash_supported(
- padding._mgf._algorithm
- ) and self._oaep_hash_supported(padding._algorithm)
- else:
- return False
-
- def rsa_encryption_supported(self, padding: AsymmetricPadding) -> bool:
- if self._fips_enabled and isinstance(padding, PKCS1v15):
- return False
- else:
- return self.rsa_padding_supported(padding)
-
- def dsa_supported(self) -> bool:
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- and not self._fips_enabled
- )
-
- def dsa_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if not self.dsa_supported():
- return False
- return self.signature_hash_supported(algorithm)
-
- def cmac_algorithm_supported(self, algorithm) -> bool:
- return self.cipher_supported(
- algorithm, CBC(b"\x00" * algorithm.block_size)
- )
-
- def elliptic_curve_supported(self, curve: ec.EllipticCurve) -> bool:
- if self._fips_enabled and not isinstance(
- curve, self._fips_ecdh_curves
- ):
- return False
-
- return rust_openssl.ec.curve_supported(curve)
-
- def elliptic_curve_signature_algorithm_supported(
- self,
- signature_algorithm: ec.EllipticCurveSignatureAlgorithm,
- curve: ec.EllipticCurve,
- ) -> bool:
- # We only support ECDSA right now.
- if not isinstance(signature_algorithm, ec.ECDSA):
- return False
-
- return self.elliptic_curve_supported(curve) and (
- isinstance(signature_algorithm.algorithm, asym_utils.Prehashed)
- or self.hash_supported(signature_algorithm.algorithm)
- )
-
- def elliptic_curve_exchange_algorithm_supported(
- self, algorithm: ec.ECDH, curve: ec.EllipticCurve
- ) -> bool:
- return self.elliptic_curve_supported(curve) and isinstance(
- algorithm, ec.ECDH
- )
-
- def dh_supported(self) -> bool:
- return not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
-
- def dh_x942_serialization_supported(self) -> bool:
- return self._lib.Cryptography_HAS_EVP_PKEY_DHX == 1
-
- def x25519_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def x448_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL
- and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- )
-
- def ed25519_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def ed448_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL
- and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- )
-
- def ecdsa_deterministic_supported(self) -> bool:
- return (
- rust_openssl.CRYPTOGRAPHY_OPENSSL_320_OR_GREATER
- and not self._fips_enabled
- )
-
- def poly1305_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def pkcs7_supported(self) -> bool:
- return not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
-
-
-backend = Backend()
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust.abi3.so b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust.abi3.so
deleted file mode 100755
index 1e7f7c6cd..000000000
Binary files a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust.abi3.so and /dev/null differ
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/__init__.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/__init__.pyi
deleted file mode 100644
index 30b67d855..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/__init__.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import padding
-
-def check_ansix923_padding(data: bytes) -> bool: ...
-
-class PKCS7PaddingContext(padding.PaddingContext):
- def __init__(self, block_size: int) -> None: ...
- def update(self, data: bytes) -> bytes: ...
- def finalize(self) -> bytes: ...
-
-class PKCS7UnpaddingContext(padding.PaddingContext):
- def __init__(self, block_size: int) -> None: ...
- def update(self, data: bytes) -> bytes: ...
- def finalize(self) -> bytes: ...
-
-class ObjectIdentifier:
- def __init__(self, val: str) -> None: ...
- @property
- def dotted_string(self) -> str: ...
- @property
- def _name(self) -> str: ...
-
-T = typing.TypeVar("T")
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/_openssl.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/_openssl.pyi
deleted file mode 100644
index 80100082a..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/_openssl.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-lib = typing.Any
-ffi = typing.Any
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/asn1.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/asn1.pyi
deleted file mode 100644
index 3b5f208ec..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/asn1.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-def decode_dss_signature(signature: bytes) -> tuple[int, int]: ...
-def encode_dss_signature(r: int, s: int) -> bytes: ...
-def parse_spki_for_data(data: bytes) -> bytes: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/exceptions.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/exceptions.pyi
deleted file mode 100644
index 09f46b1e8..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/exceptions.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class _Reasons:
- BACKEND_MISSING_INTERFACE: _Reasons
- UNSUPPORTED_HASH: _Reasons
- UNSUPPORTED_CIPHER: _Reasons
- UNSUPPORTED_PADDING: _Reasons
- UNSUPPORTED_MGF: _Reasons
- UNSUPPORTED_PUBLIC_KEY_ALGORITHM: _Reasons
- UNSUPPORTED_ELLIPTIC_CURVE: _Reasons
- UNSUPPORTED_SERIALIZATION: _Reasons
- UNSUPPORTED_X509: _Reasons
- UNSUPPORTED_EXCHANGE_ALGORITHM: _Reasons
- UNSUPPORTED_DIFFIE_HELLMAN: _Reasons
- UNSUPPORTED_MAC: _Reasons
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/ocsp.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/ocsp.pyi
deleted file mode 100644
index e4321bec2..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/ocsp.pyi
+++ /dev/null
@@ -1,117 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import datetime
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-from cryptography.x509 import ocsp
-
-class OCSPRequest:
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- @property
- def extensions(self) -> x509.Extensions: ...
-
-class OCSPResponse:
- @property
- def responses(self) -> typing.Iterator[OCSPSingleResponse]: ...
- @property
- def response_status(self) -> ocsp.OCSPResponseStatus: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_response_bytes(self) -> bytes: ...
- @property
- def certificates(self) -> list[x509.Certificate]: ...
- @property
- def responder_key_hash(self) -> bytes | None: ...
- @property
- def responder_name(self) -> x509.Name | None: ...
- @property
- def produced_at(self) -> datetime.datetime: ...
- @property
- def produced_at_utc(self) -> datetime.datetime: ...
- @property
- def certificate_status(self) -> ocsp.OCSPCertStatus: ...
- @property
- def revocation_time(self) -> datetime.datetime | None: ...
- @property
- def revocation_time_utc(self) -> datetime.datetime | None: ...
- @property
- def revocation_reason(self) -> x509.ReasonFlags | None: ...
- @property
- def this_update(self) -> datetime.datetime: ...
- @property
- def this_update_utc(self) -> datetime.datetime: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def single_extensions(self) -> x509.Extensions: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
-
-class OCSPSingleResponse:
- @property
- def certificate_status(self) -> ocsp.OCSPCertStatus: ...
- @property
- def revocation_time(self) -> datetime.datetime | None: ...
- @property
- def revocation_time_utc(self) -> datetime.datetime | None: ...
- @property
- def revocation_reason(self) -> x509.ReasonFlags | None: ...
- @property
- def this_update(self) -> datetime.datetime: ...
- @property
- def this_update_utc(self) -> datetime.datetime: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
-
-def load_der_ocsp_request(data: bytes) -> ocsp.OCSPRequest: ...
-def load_der_ocsp_response(data: bytes) -> ocsp.OCSPResponse: ...
-def create_ocsp_request(
- builder: ocsp.OCSPRequestBuilder,
-) -> ocsp.OCSPRequest: ...
-def create_ocsp_response(
- status: ocsp.OCSPResponseStatus,
- builder: ocsp.OCSPResponseBuilder | None,
- private_key: PrivateKeyTypes | None,
- hash_algorithm: hashes.HashAlgorithm | None,
-) -> ocsp.OCSPResponse: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi
deleted file mode 100644
index 320cef102..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi
+++ /dev/null
@@ -1,72 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.bindings._rust.openssl import (
- aead,
- ciphers,
- cmac,
- dh,
- dsa,
- ec,
- ed448,
- ed25519,
- hashes,
- hmac,
- kdf,
- keys,
- poly1305,
- rsa,
- x448,
- x25519,
-)
-
-__all__ = [
- "aead",
- "ciphers",
- "cmac",
- "dh",
- "dsa",
- "ec",
- "ed448",
- "ed25519",
- "hashes",
- "hmac",
- "kdf",
- "keys",
- "openssl_version",
- "openssl_version_text",
- "poly1305",
- "raise_openssl_error",
- "rsa",
- "x448",
- "x25519",
-]
-
-CRYPTOGRAPHY_IS_LIBRESSL: bool
-CRYPTOGRAPHY_IS_BORINGSSL: bool
-CRYPTOGRAPHY_OPENSSL_300_OR_GREATER: bool
-CRYPTOGRAPHY_OPENSSL_309_OR_GREATER: bool
-CRYPTOGRAPHY_OPENSSL_320_OR_GREATER: bool
-
-class Providers: ...
-
-_legacy_provider_loaded: bool
-_providers: Providers
-
-def openssl_version() -> int: ...
-def openssl_version_text() -> str: ...
-def raise_openssl_error() -> typing.NoReturn: ...
-def capture_error_stack() -> list[OpenSSLError]: ...
-def is_fips_enabled() -> bool: ...
-def enable_fips(providers: Providers) -> None: ...
-
-class OpenSSLError:
- @property
- def lib(self) -> int: ...
- @property
- def reason(self) -> int: ...
- @property
- def reason_text(self) -> bytes: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/aead.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/aead.pyi
deleted file mode 100644
index 047f49d81..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/aead.pyi
+++ /dev/null
@@ -1,103 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class AESGCM:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class ChaCha20Poly1305:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key() -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESCCM:
- def __init__(self, key: bytes, tag_length: int = 16) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESSIV:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- data: bytes,
- associated_data: list[bytes] | None,
- ) -> bytes: ...
- def decrypt(
- self,
- data: bytes,
- associated_data: list[bytes] | None,
- ) -> bytes: ...
-
-class AESOCB3:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESGCMSIV:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi
deleted file mode 100644
index 759f3b591..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import ciphers
-from cryptography.hazmat.primitives.ciphers import modes
-
-@typing.overload
-def create_encryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.ModeWithAuthenticationTag
-) -> ciphers.AEADEncryptionContext: ...
-@typing.overload
-def create_encryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> ciphers.CipherContext: ...
-@typing.overload
-def create_decryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.ModeWithAuthenticationTag
-) -> ciphers.AEADDecryptionContext: ...
-@typing.overload
-def create_decryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> ciphers.CipherContext: ...
-def cipher_supported(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> bool: ...
-def _advance(
- ctx: ciphers.AEADEncryptionContext | ciphers.AEADDecryptionContext, n: int
-) -> None: ...
-def _advance_aad(
- ctx: ciphers.AEADEncryptionContext | ciphers.AEADDecryptionContext, n: int
-) -> None: ...
-
-class CipherContext: ...
-class AEADEncryptionContext: ...
-class AEADDecryptionContext: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi
deleted file mode 100644
index 9c03508bc..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import ciphers
-
-class CMAC:
- def __init__(
- self,
- algorithm: ciphers.BlockCipherAlgorithm,
- backend: typing.Any = None,
- ) -> None: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, signature: bytes) -> None: ...
- def copy(self) -> CMAC: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dh.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dh.pyi
deleted file mode 100644
index 08733d745..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dh.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import dh
-
-MIN_MODULUS_SIZE: int
-
-class DHPrivateKey: ...
-class DHPublicKey: ...
-class DHParameters: ...
-
-class DHPrivateNumbers:
- def __init__(self, x: int, public_numbers: DHPublicNumbers) -> None: ...
- def private_key(self, backend: typing.Any = None) -> dh.DHPrivateKey: ...
- @property
- def x(self) -> int: ...
- @property
- def public_numbers(self) -> DHPublicNumbers: ...
-
-class DHPublicNumbers:
- def __init__(
- self, y: int, parameter_numbers: DHParameterNumbers
- ) -> None: ...
- def public_key(self, backend: typing.Any = None) -> dh.DHPublicKey: ...
- @property
- def y(self) -> int: ...
- @property
- def parameter_numbers(self) -> DHParameterNumbers: ...
-
-class DHParameterNumbers:
- def __init__(self, p: int, g: int, q: int | None = None) -> None: ...
- def parameters(self, backend: typing.Any = None) -> dh.DHParameters: ...
- @property
- def p(self) -> int: ...
- @property
- def g(self) -> int: ...
- @property
- def q(self) -> int | None: ...
-
-def generate_parameters(
- generator: int, key_size: int, backend: typing.Any = None
-) -> dh.DHParameters: ...
-def from_pem_parameters(
- data: bytes, backend: typing.Any = None
-) -> dh.DHParameters: ...
-def from_der_parameters(
- data: bytes, backend: typing.Any = None
-) -> dh.DHParameters: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi
deleted file mode 100644
index 0922a4c40..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import dsa
-
-class DSAPrivateKey: ...
-class DSAPublicKey: ...
-class DSAParameters: ...
-
-class DSAPrivateNumbers:
- def __init__(self, x: int, public_numbers: DSAPublicNumbers) -> None: ...
- @property
- def x(self) -> int: ...
- @property
- def public_numbers(self) -> DSAPublicNumbers: ...
- def private_key(self, backend: typing.Any = None) -> dsa.DSAPrivateKey: ...
-
-class DSAPublicNumbers:
- def __init__(
- self, y: int, parameter_numbers: DSAParameterNumbers
- ) -> None: ...
- @property
- def y(self) -> int: ...
- @property
- def parameter_numbers(self) -> DSAParameterNumbers: ...
- def public_key(self, backend: typing.Any = None) -> dsa.DSAPublicKey: ...
-
-class DSAParameterNumbers:
- def __init__(self, p: int, q: int, g: int) -> None: ...
- @property
- def p(self) -> int: ...
- @property
- def q(self) -> int: ...
- @property
- def g(self) -> int: ...
- def parameters(self, backend: typing.Any = None) -> dsa.DSAParameters: ...
-
-def generate_parameters(key_size: int) -> dsa.DSAParameters: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ec.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ec.pyi
deleted file mode 100644
index 5c3b7bf6e..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ec.pyi
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import ec
-
-class ECPrivateKey: ...
-class ECPublicKey: ...
-
-class EllipticCurvePrivateNumbers:
- def __init__(
- self, private_value: int, public_numbers: EllipticCurvePublicNumbers
- ) -> None: ...
- def private_key(
- self, backend: typing.Any = None
- ) -> ec.EllipticCurvePrivateKey: ...
- @property
- def private_value(self) -> int: ...
- @property
- def public_numbers(self) -> EllipticCurvePublicNumbers: ...
-
-class EllipticCurvePublicNumbers:
- def __init__(self, x: int, y: int, curve: ec.EllipticCurve) -> None: ...
- def public_key(
- self, backend: typing.Any = None
- ) -> ec.EllipticCurvePublicKey: ...
- @property
- def x(self) -> int: ...
- @property
- def y(self) -> int: ...
- @property
- def curve(self) -> ec.EllipticCurve: ...
- def __eq__(self, other: object) -> bool: ...
-
-def curve_supported(curve: ec.EllipticCurve) -> bool: ...
-def generate_private_key(
- curve: ec.EllipticCurve, backend: typing.Any = None
-) -> ec.EllipticCurvePrivateKey: ...
-def from_private_numbers(
- numbers: ec.EllipticCurvePrivateNumbers,
-) -> ec.EllipticCurvePrivateKey: ...
-def from_public_numbers(
- numbers: ec.EllipticCurvePublicNumbers,
-) -> ec.EllipticCurvePublicKey: ...
-def from_public_bytes(
- curve: ec.EllipticCurve, data: bytes
-) -> ec.EllipticCurvePublicKey: ...
-def derive_private_key(
- private_value: int, curve: ec.EllipticCurve
-) -> ec.EllipticCurvePrivateKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi
deleted file mode 100644
index 5233f9a1d..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import ed25519
-
-class Ed25519PrivateKey: ...
-class Ed25519PublicKey: ...
-
-def generate_key() -> ed25519.Ed25519PrivateKey: ...
-def from_private_bytes(data: bytes) -> ed25519.Ed25519PrivateKey: ...
-def from_public_bytes(data: bytes) -> ed25519.Ed25519PublicKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi
deleted file mode 100644
index 7a0652038..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import ed448
-
-class Ed448PrivateKey: ...
-class Ed448PublicKey: ...
-
-def generate_key() -> ed448.Ed448PrivateKey: ...
-def from_private_bytes(data: bytes) -> ed448.Ed448PrivateKey: ...
-def from_public_bytes(data: bytes) -> ed448.Ed448PublicKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi
deleted file mode 100644
index 56f317001..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import hashes
-
-class Hash(hashes.HashContext):
- def __init__(
- self, algorithm: hashes.HashAlgorithm, backend: typing.Any = None
- ) -> None: ...
- @property
- def algorithm(self) -> hashes.HashAlgorithm: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def copy(self) -> Hash: ...
-
-def hash_supported(algorithm: hashes.HashAlgorithm) -> bool: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi
deleted file mode 100644
index e38d9b54d..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import hashes
-
-class HMAC(hashes.HashContext):
- def __init__(
- self,
- key: bytes,
- algorithm: hashes.HashAlgorithm,
- backend: typing.Any = None,
- ) -> None: ...
- @property
- def algorithm(self) -> hashes.HashAlgorithm: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, signature: bytes) -> None: ...
- def copy(self) -> HMAC: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi
deleted file mode 100644
index 4b90bb4f7..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.hashes import HashAlgorithm
-
-def derive_pbkdf2_hmac(
- key_material: bytes,
- algorithm: HashAlgorithm,
- salt: bytes,
- iterations: int,
- length: int,
-) -> bytes: ...
-
-class Scrypt:
- def __init__(
- self,
- salt: bytes,
- length: int,
- n: int,
- r: int,
- p: int,
- backend: typing.Any = None,
- ) -> None: ...
- def derive(self, key_material: bytes) -> bytes: ...
- def verify(self, key_material: bytes, expected_key: bytes) -> None: ...
-
-class Argon2id:
- def __init__(
- self,
- *,
- salt: bytes,
- length: int,
- iterations: int,
- lanes: int,
- memory_cost: int,
- ad: bytes | None = None,
- secret: bytes | None = None,
- ) -> None: ...
- def derive(self, key_material: bytes) -> bytes: ...
- def verify(self, key_material: bytes, expected_key: bytes) -> None: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/keys.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/keys.pyi
deleted file mode 100644
index 6815b7d91..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/keys.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric.types import (
- PrivateKeyTypes,
- PublicKeyTypes,
-)
-
-def load_der_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
-) -> PrivateKeyTypes: ...
-def load_pem_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
-) -> PrivateKeyTypes: ...
-def load_der_public_key(
- data: bytes,
- backend: typing.Any = None,
-) -> PublicKeyTypes: ...
-def load_pem_public_key(
- data: bytes,
- backend: typing.Any = None,
-) -> PublicKeyTypes: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi
deleted file mode 100644
index 2e9b0a9e1..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class Poly1305:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_tag(key: bytes, data: bytes) -> bytes: ...
- @staticmethod
- def verify_tag(key: bytes, data: bytes, tag: bytes) -> None: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, tag: bytes) -> None: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi
deleted file mode 100644
index ef7752ddb..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi
+++ /dev/null
@@ -1,55 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import rsa
-
-class RSAPrivateKey: ...
-class RSAPublicKey: ...
-
-class RSAPrivateNumbers:
- def __init__(
- self,
- p: int,
- q: int,
- d: int,
- dmp1: int,
- dmq1: int,
- iqmp: int,
- public_numbers: RSAPublicNumbers,
- ) -> None: ...
- @property
- def p(self) -> int: ...
- @property
- def q(self) -> int: ...
- @property
- def d(self) -> int: ...
- @property
- def dmp1(self) -> int: ...
- @property
- def dmq1(self) -> int: ...
- @property
- def iqmp(self) -> int: ...
- @property
- def public_numbers(self) -> RSAPublicNumbers: ...
- def private_key(
- self,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
- ) -> rsa.RSAPrivateKey: ...
-
-class RSAPublicNumbers:
- def __init__(self, e: int, n: int) -> None: ...
- @property
- def n(self) -> int: ...
- @property
- def e(self) -> int: ...
- def public_key(self, backend: typing.Any = None) -> rsa.RSAPublicKey: ...
-
-def generate_private_key(
- public_exponent: int,
- key_size: int,
-) -> rsa.RSAPrivateKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi
deleted file mode 100644
index da0f3ec58..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import x25519
-
-class X25519PrivateKey: ...
-class X25519PublicKey: ...
-
-def generate_key() -> x25519.X25519PrivateKey: ...
-def from_private_bytes(data: bytes) -> x25519.X25519PrivateKey: ...
-def from_public_bytes(data: bytes) -> x25519.X25519PublicKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x448.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x448.pyi
deleted file mode 100644
index e51cfebe1..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/openssl/x448.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import x448
-
-class X448PrivateKey: ...
-class X448PublicKey: ...
-
-def generate_key() -> x448.X448PrivateKey: ...
-def from_private_bytes(data: bytes) -> x448.X448PrivateKey: ...
-def from_public_bytes(data: bytes) -> x448.X448PublicKey: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs12.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs12.pyi
deleted file mode 100644
index 40514c462..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs12.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-from cryptography.hazmat.primitives.serialization import (
- KeySerializationEncryption,
-)
-from cryptography.hazmat.primitives.serialization.pkcs12 import (
- PKCS12KeyAndCertificates,
- PKCS12PrivateKeyTypes,
-)
-
-class PKCS12Certificate:
- def __init__(
- self, cert: x509.Certificate, friendly_name: bytes | None
- ) -> None: ...
- @property
- def friendly_name(self) -> bytes | None: ...
- @property
- def certificate(self) -> x509.Certificate: ...
-
-def load_key_and_certificates(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> tuple[
- PrivateKeyTypes | None,
- x509.Certificate | None,
- list[x509.Certificate],
-]: ...
-def load_pkcs12(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> PKCS12KeyAndCertificates: ...
-def serialize_key_and_certificates(
- name: bytes | None,
- key: PKCS12PrivateKeyTypes | None,
- cert: x509.Certificate | None,
- cas: typing.Iterable[x509.Certificate | PKCS12Certificate] | None,
- encryption_algorithm: KeySerializationEncryption,
-) -> bytes: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs7.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs7.pyi
deleted file mode 100644
index f9aa81ea0..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/pkcs7.pyi
+++ /dev/null
@@ -1,49 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives.asymmetric import rsa
-from cryptography.hazmat.primitives.serialization import pkcs7
-
-def serialize_certificates(
- certs: list[x509.Certificate],
- encoding: serialization.Encoding,
-) -> bytes: ...
-def encrypt_and_serialize(
- builder: pkcs7.PKCS7EnvelopeBuilder,
- encoding: serialization.Encoding,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def sign_and_serialize(
- builder: pkcs7.PKCS7SignatureBuilder,
- encoding: serialization.Encoding,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_der(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_pem(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_smime(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def load_pem_pkcs7_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
-def load_der_pkcs7_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/test_support.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/test_support.pyi
deleted file mode 100644
index ef9f779f2..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/test_support.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography import x509
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives.serialization import pkcs7
-
-class TestCertificate:
- not_after_tag: int
- not_before_tag: int
- issuer_value_tags: list[int]
- subject_value_tags: list[int]
-
-def test_parse_certificate(data: bytes) -> TestCertificate: ...
-def pkcs7_verify(
- encoding: serialization.Encoding,
- sig: bytes,
- msg: bytes | None,
- certs: list[x509.Certificate],
- options: list[pkcs7.PKCS7Options],
-) -> None: ...
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/x509.pyi b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/x509.pyi
deleted file mode 100644
index b494fb61d..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/_rust/x509.pyi
+++ /dev/null
@@ -1,246 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import datetime
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric.ec import ECDSA
-from cryptography.hazmat.primitives.asymmetric.padding import PSS, PKCS1v15
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPublicKeyTypes,
- CertificatePublicKeyTypes,
- PrivateKeyTypes,
-)
-from cryptography.x509 import certificate_transparency
-
-def load_pem_x509_certificate(
- data: bytes, backend: typing.Any = None
-) -> x509.Certificate: ...
-def load_der_x509_certificate(
- data: bytes, backend: typing.Any = None
-) -> x509.Certificate: ...
-def load_pem_x509_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
-def load_pem_x509_crl(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateRevocationList: ...
-def load_der_x509_crl(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateRevocationList: ...
-def load_pem_x509_csr(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateSigningRequest: ...
-def load_der_x509_csr(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateSigningRequest: ...
-def encode_name_bytes(name: x509.Name) -> bytes: ...
-def encode_extension_value(extension: x509.ExtensionType) -> bytes: ...
-def create_x509_certificate(
- builder: x509.CertificateBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.Certificate: ...
-def create_x509_csr(
- builder: x509.CertificateSigningRequestBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.CertificateSigningRequest: ...
-def create_x509_crl(
- builder: x509.CertificateRevocationListBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.CertificateRevocationList: ...
-
-class Sct:
- @property
- def version(self) -> certificate_transparency.Version: ...
- @property
- def log_id(self) -> bytes: ...
- @property
- def timestamp(self) -> datetime.datetime: ...
- @property
- def entry_type(self) -> certificate_transparency.LogEntryType: ...
- @property
- def signature_hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def signature_algorithm(
- self,
- ) -> certificate_transparency.SignatureAlgorithm: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def extension_bytes(self) -> bytes: ...
-
-class Certificate:
- def fingerprint(self, algorithm: hashes.HashAlgorithm) -> bytes: ...
- @property
- def serial_number(self) -> int: ...
- @property
- def version(self) -> x509.Version: ...
- def public_key(self) -> CertificatePublicKeyTypes: ...
- @property
- def public_key_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def not_valid_before(self) -> datetime.datetime: ...
- @property
- def not_valid_before_utc(self) -> datetime.datetime: ...
- @property
- def not_valid_after(self) -> datetime.datetime: ...
- @property
- def not_valid_after_utc(self) -> datetime.datetime: ...
- @property
- def issuer(self) -> x509.Name: ...
- @property
- def subject(self) -> x509.Name: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certificate_bytes(self) -> bytes: ...
- @property
- def tbs_precertificate_bytes(self) -> bytes: ...
- def __eq__(self, other: object) -> bool: ...
- def __hash__(self) -> int: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- def verify_directly_issued_by(self, issuer: Certificate) -> None: ...
-
-class RevokedCertificate: ...
-
-class CertificateRevocationList:
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- def fingerprint(self, algorithm: hashes.HashAlgorithm) -> bytes: ...
- def get_revoked_certificate_by_serial_number(
- self, serial_number: int
- ) -> RevokedCertificate | None: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def issuer(self) -> x509.Name: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def last_update(self) -> datetime.datetime: ...
- @property
- def last_update_utc(self) -> datetime.datetime: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certlist_bytes(self) -> bytes: ...
- def __eq__(self, other: object) -> bool: ...
- def __len__(self) -> int: ...
- @typing.overload
- def __getitem__(self, idx: int) -> x509.RevokedCertificate: ...
- @typing.overload
- def __getitem__(self, idx: slice) -> list[x509.RevokedCertificate]: ...
- def __iter__(self) -> typing.Iterator[x509.RevokedCertificate]: ...
- def is_signature_valid(
- self, public_key: CertificateIssuerPublicKeyTypes
- ) -> bool: ...
-
-class CertificateSigningRequest:
- def __eq__(self, other: object) -> bool: ...
- def __hash__(self) -> int: ...
- def public_key(self) -> CertificatePublicKeyTypes: ...
- @property
- def subject(self) -> x509.Name: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def attributes(self) -> x509.Attributes: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certrequest_bytes(self) -> bytes: ...
- @property
- def is_signature_valid(self) -> bool: ...
- def get_attribute_for_oid(self, oid: x509.ObjectIdentifier) -> bytes: ...
-
-class PolicyBuilder:
- def time(self, new_time: datetime.datetime) -> PolicyBuilder: ...
- def store(self, new_store: Store) -> PolicyBuilder: ...
- def max_chain_depth(self, new_max_chain_depth: int) -> PolicyBuilder: ...
- def build_client_verifier(self) -> ClientVerifier: ...
- def build_server_verifier(
- self, subject: x509.verification.Subject
- ) -> ServerVerifier: ...
-
-class VerifiedClient:
- @property
- def subjects(self) -> list[x509.GeneralName] | None: ...
- @property
- def chain(self) -> list[x509.Certificate]: ...
-
-class ClientVerifier:
- @property
- def validation_time(self) -> datetime.datetime: ...
- @property
- def store(self) -> Store: ...
- @property
- def max_chain_depth(self) -> int: ...
- def verify(
- self,
- leaf: x509.Certificate,
- intermediates: list[x509.Certificate],
- ) -> VerifiedClient: ...
-
-class ServerVerifier:
- @property
- def subject(self) -> x509.verification.Subject: ...
- @property
- def validation_time(self) -> datetime.datetime: ...
- @property
- def store(self) -> Store: ...
- @property
- def max_chain_depth(self) -> int: ...
- def verify(
- self,
- leaf: x509.Certificate,
- intermediates: list[x509.Certificate],
- ) -> list[x509.Certificate]: ...
-
-class Store:
- def __init__(self, certs: list[x509.Certificate]) -> None: ...
-
-class VerificationError(Exception):
- pass
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/_conditional.py b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/_conditional.py
deleted file mode 100644
index 73c06f7d0..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/_conditional.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-
-def cryptography_has_set_cert_cb() -> list[str]:
- return [
- "SSL_CTX_set_cert_cb",
- "SSL_set_cert_cb",
- ]
-
-
-def cryptography_has_ssl_st() -> list[str]:
- return [
- "SSL_ST_BEFORE",
- "SSL_ST_OK",
- "SSL_ST_INIT",
- "SSL_ST_RENEGOTIATE",
- ]
-
-
-def cryptography_has_tls_st() -> list[str]:
- return [
- "TLS_ST_BEFORE",
- "TLS_ST_OK",
- ]
-
-
-def cryptography_has_ssl_sigalgs() -> list[str]:
- return [
- "SSL_CTX_set1_sigalgs_list",
- ]
-
-
-def cryptography_has_psk() -> list[str]:
- return [
- "SSL_CTX_use_psk_identity_hint",
- "SSL_CTX_set_psk_server_callback",
- "SSL_CTX_set_psk_client_callback",
- ]
-
-
-def cryptography_has_psk_tlsv13() -> list[str]:
- return [
- "SSL_CTX_set_psk_find_session_callback",
- "SSL_CTX_set_psk_use_session_callback",
- "Cryptography_SSL_SESSION_new",
- "SSL_CIPHER_find",
- "SSL_SESSION_set1_master_key",
- "SSL_SESSION_set_cipher",
- "SSL_SESSION_set_protocol_version",
- ]
-
-
-def cryptography_has_custom_ext() -> list[str]:
- return [
- "SSL_CTX_add_client_custom_ext",
- "SSL_CTX_add_server_custom_ext",
- "SSL_extension_supported",
- ]
-
-
-def cryptography_has_tlsv13_functions() -> list[str]:
- return [
- "SSL_VERIFY_POST_HANDSHAKE",
- "SSL_CTX_set_ciphersuites",
- "SSL_verify_client_post_handshake",
- "SSL_CTX_set_post_handshake_auth",
- "SSL_set_post_handshake_auth",
- "SSL_SESSION_get_max_early_data",
- "SSL_write_early_data",
- "SSL_read_early_data",
- "SSL_CTX_set_max_early_data",
- ]
-
-
-def cryptography_has_engine() -> list[str]:
- return [
- "ENGINE_by_id",
- "ENGINE_init",
- "ENGINE_finish",
- "ENGINE_get_default_RAND",
- "ENGINE_set_default_RAND",
- "ENGINE_unregister_RAND",
- "ENGINE_ctrl_cmd",
- "ENGINE_free",
- "ENGINE_get_name",
- "ENGINE_ctrl_cmd_string",
- "ENGINE_load_builtin_engines",
- "ENGINE_load_private_key",
- "ENGINE_load_public_key",
- "SSL_CTX_set_client_cert_engine",
- ]
-
-
-def cryptography_has_verified_chain() -> list[str]:
- return [
- "SSL_get0_verified_chain",
- ]
-
-
-def cryptography_has_srtp() -> list[str]:
- return [
- "SSL_CTX_set_tlsext_use_srtp",
- "SSL_set_tlsext_use_srtp",
- "SSL_get_selected_srtp_profile",
- ]
-
-
-def cryptography_has_op_no_renegotiation() -> list[str]:
- return [
- "SSL_OP_NO_RENEGOTIATION",
- ]
-
-
-def cryptography_has_dtls_get_data_mtu() -> list[str]:
- return [
- "DTLS_get_data_mtu",
- ]
-
-
-def cryptography_has_ssl_cookie() -> list[str]:
- return [
- "SSL_OP_COOKIE_EXCHANGE",
- "DTLSv1_listen",
- "SSL_CTX_set_cookie_generate_cb",
- "SSL_CTX_set_cookie_verify_cb",
- ]
-
-
-def cryptography_has_prime_checks() -> list[str]:
- return [
- "BN_prime_checks_for_size",
- ]
-
-
-def cryptography_has_unexpected_eof_while_reading() -> list[str]:
- return ["SSL_R_UNEXPECTED_EOF_WHILE_READING"]
-
-
-def cryptography_has_ssl_op_ignore_unexpected_eof() -> list[str]:
- return [
- "SSL_OP_IGNORE_UNEXPECTED_EOF",
- ]
-
-
-def cryptography_has_get_extms_support() -> list[str]:
- return ["SSL_get_extms_support"]
-
-
-# This is a mapping of
-# {condition: function-returning-names-dependent-on-that-condition} so we can
-# loop over them and delete unsupported names at runtime. It will be removed
-# when cffi supports #if in cdef. We use functions instead of just a dict of
-# lists so we can use coverage to measure which are used.
-CONDITIONAL_NAMES = {
- "Cryptography_HAS_SET_CERT_CB": cryptography_has_set_cert_cb,
- "Cryptography_HAS_SSL_ST": cryptography_has_ssl_st,
- "Cryptography_HAS_TLS_ST": cryptography_has_tls_st,
- "Cryptography_HAS_SIGALGS": cryptography_has_ssl_sigalgs,
- "Cryptography_HAS_PSK": cryptography_has_psk,
- "Cryptography_HAS_PSK_TLSv1_3": cryptography_has_psk_tlsv13,
- "Cryptography_HAS_CUSTOM_EXT": cryptography_has_custom_ext,
- "Cryptography_HAS_TLSv1_3_FUNCTIONS": cryptography_has_tlsv13_functions,
- "Cryptography_HAS_ENGINE": cryptography_has_engine,
- "Cryptography_HAS_VERIFIED_CHAIN": cryptography_has_verified_chain,
- "Cryptography_HAS_SRTP": cryptography_has_srtp,
- "Cryptography_HAS_OP_NO_RENEGOTIATION": (
- cryptography_has_op_no_renegotiation
- ),
- "Cryptography_HAS_DTLS_GET_DATA_MTU": cryptography_has_dtls_get_data_mtu,
- "Cryptography_HAS_SSL_COOKIE": cryptography_has_ssl_cookie,
- "Cryptography_HAS_PRIME_CHECKS": cryptography_has_prime_checks,
- "Cryptography_HAS_UNEXPECTED_EOF_WHILE_READING": (
- cryptography_has_unexpected_eof_while_reading
- ),
- "Cryptography_HAS_SSL_OP_IGNORE_UNEXPECTED_EOF": (
- cryptography_has_ssl_op_ignore_unexpected_eof
- ),
- "Cryptography_HAS_GET_EXTMS_SUPPORT": cryptography_has_get_extms_support,
-}
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/binding.py b/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/binding.py
deleted file mode 100644
index d4dfeef48..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/bindings/openssl/binding.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import os
-import sys
-import threading
-import types
-import typing
-import warnings
-
-import cryptography
-from cryptography.exceptions import InternalError
-from cryptography.hazmat.bindings._rust import _openssl, openssl
-from cryptography.hazmat.bindings.openssl._conditional import CONDITIONAL_NAMES
-
-
-def _openssl_assert(ok: bool) -> None:
- if not ok:
- errors = openssl.capture_error_stack()
-
- raise InternalError(
- "Unknown OpenSSL error. This error is commonly encountered when "
- "another library is not cleaning up the OpenSSL error stack. If "
- "you are using cryptography with another library that uses "
- "OpenSSL try disabling it before reporting a bug. Otherwise "
- "please file an issue at https://github.com/pyca/cryptography/"
- "issues with information on how to reproduce "
- f"this. ({errors!r})",
- errors,
- )
-
-
-def build_conditional_library(
- lib: typing.Any,
- conditional_names: dict[str, typing.Callable[[], list[str]]],
-) -> typing.Any:
- conditional_lib = types.ModuleType("lib")
- conditional_lib._original_lib = lib # type: ignore[attr-defined]
- excluded_names = set()
- for condition, names_cb in conditional_names.items():
- if not getattr(lib, condition):
- excluded_names.update(names_cb())
-
- for attr in dir(lib):
- if attr not in excluded_names:
- setattr(conditional_lib, attr, getattr(lib, attr))
-
- return conditional_lib
-
-
-class Binding:
- """
- OpenSSL API wrapper.
- """
-
- lib: typing.ClassVar = None
- ffi = _openssl.ffi
- _lib_loaded = False
- _init_lock = threading.Lock()
-
- def __init__(self) -> None:
- self._ensure_ffi_initialized()
-
- @classmethod
- def _ensure_ffi_initialized(cls) -> None:
- with cls._init_lock:
- if not cls._lib_loaded:
- cls.lib = build_conditional_library(
- _openssl.lib, CONDITIONAL_NAMES
- )
- cls._lib_loaded = True
-
- @classmethod
- def init_static_locks(cls) -> None:
- cls._ensure_ffi_initialized()
-
-
-def _verify_package_version(version: str) -> None:
- # Occasionally we run into situations where the version of the Python
- # package does not match the version of the shared object that is loaded.
- # This may occur in environments where multiple versions of cryptography
- # are installed and available in the python path. To avoid errors cropping
- # up later this code checks that the currently imported package and the
- # shared object that were loaded have the same version and raise an
- # ImportError if they do not
- so_package_version = _openssl.ffi.string(
- _openssl.lib.CRYPTOGRAPHY_PACKAGE_VERSION
- )
- if version.encode("ascii") != so_package_version:
- raise ImportError(
- "The version of cryptography does not match the loaded "
- "shared object. This can happen if you have multiple copies of "
- "cryptography installed in your Python path. Please try creating "
- "a new virtual environment to resolve this issue. "
- f"Loaded python version: {version}, "
- f"shared object version: {so_package_version}"
- )
-
- _openssl_assert(
- _openssl.lib.OpenSSL_version_num() == openssl.openssl_version(),
- )
-
-
-_verify_package_version(cryptography.__version__)
-
-Binding.init_static_locks()
-
-if (
- sys.platform == "win32"
- and os.environ.get("PROCESSOR_ARCHITEW6432") is not None
-):
- warnings.warn(
- "You are using cryptography on a 32-bit Python on a 64-bit Windows "
- "Operating System. Cryptography will be significantly faster if you "
- "switch to using a 64-bit Python.",
- UserWarning,
- stacklevel=2,
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/__init__.py
deleted file mode 100644
index 41d731863..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/__init__.py
deleted file mode 100644
index 41d731863..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/algorithms.py b/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/algorithms.py
deleted file mode 100644
index a7d4aa3c5..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/decrepit/ciphers/algorithms.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
- _verify_key_size,
-)
-
-
-class ARC4(CipherAlgorithm):
- name = "RC4"
- key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class TripleDES(BlockCipherAlgorithm):
- name = "3DES"
- block_size = 64
- key_sizes = frozenset([64, 128, 192])
-
- def __init__(self, key: bytes):
- if len(key) == 8:
- key += key + key
- elif len(key) == 16:
- key += key[:8]
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class Blowfish(BlockCipherAlgorithm):
- name = "Blowfish"
- block_size = 64
- key_sizes = frozenset(range(32, 449, 8))
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class CAST5(BlockCipherAlgorithm):
- name = "CAST5"
- block_size = 64
- key_sizes = frozenset(range(40, 129, 8))
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class SEED(BlockCipherAlgorithm):
- name = "SEED"
- block_size = 128
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class IDEA(BlockCipherAlgorithm):
- name = "IDEA"
- block_size = 64
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-# This class only allows RC2 with a 128-bit key. No support for
-# effective key bits or other key sizes is provided.
-class RC2(BlockCipherAlgorithm):
- name = "RC2"
- block_size = 64
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_asymmetric.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_asymmetric.py
deleted file mode 100644
index ea55ffdf1..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_asymmetric.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-# This exists to break an import cycle. It is normally accessible from the
-# asymmetric padding module.
-
-
-class AsymmetricPadding(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this padding (e.g. "PSS", "PKCS1").
- """
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_cipheralgorithm.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_cipheralgorithm.py
deleted file mode 100644
index 588a61698..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_cipheralgorithm.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-
-# This exists to break an import cycle. It is normally accessible from the
-# ciphers module.
-
-
-class CipherAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this mode (e.g. "AES", "Camellia").
- """
-
- @property
- @abc.abstractmethod
- def key_sizes(self) -> frozenset[int]:
- """
- Valid key sizes for this algorithm in bits
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The size of the key being used as an integer in bits (e.g. 128, 256).
- """
-
-
-class BlockCipherAlgorithm(CipherAlgorithm):
- key: bytes
-
- @property
- @abc.abstractmethod
- def block_size(self) -> int:
- """
- The size of a block as an integer in bits (e.g. 64, 128).
- """
-
-
-def _verify_key_size(algorithm: CipherAlgorithm, key: bytes) -> bytes:
- # Verify that the key is instance of bytes
- utils._check_byteslike("key", key)
-
- # Verify that the key size matches the expected key size
- if len(key) * 8 not in algorithm.key_sizes:
- raise ValueError(
- f"Invalid key size ({len(key) * 8}) for {algorithm.name}."
- )
- return key
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_serialization.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_serialization.py
deleted file mode 100644
index 461577219..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/_serialization.py
+++ /dev/null
@@ -1,169 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-from cryptography.hazmat.primitives.hashes import HashAlgorithm
-
-# This exists to break an import cycle. These classes are normally accessible
-# from the serialization module.
-
-
-class PBES(utils.Enum):
- PBESv1SHA1And3KeyTripleDESCBC = "PBESv1 using SHA1 and 3-Key TripleDES"
- PBESv2SHA256AndAES256CBC = "PBESv2 using SHA256 PBKDF2 and AES256 CBC"
-
-
-class Encoding(utils.Enum):
- PEM = "PEM"
- DER = "DER"
- OpenSSH = "OpenSSH"
- Raw = "Raw"
- X962 = "ANSI X9.62"
- SMIME = "S/MIME"
-
-
-class PrivateFormat(utils.Enum):
- PKCS8 = "PKCS8"
- TraditionalOpenSSL = "TraditionalOpenSSL"
- Raw = "Raw"
- OpenSSH = "OpenSSH"
- PKCS12 = "PKCS12"
-
- def encryption_builder(self) -> KeySerializationEncryptionBuilder:
- if self not in (PrivateFormat.OpenSSH, PrivateFormat.PKCS12):
- raise ValueError(
- "encryption_builder only supported with PrivateFormat.OpenSSH"
- " and PrivateFormat.PKCS12"
- )
- return KeySerializationEncryptionBuilder(self)
-
-
-class PublicFormat(utils.Enum):
- SubjectPublicKeyInfo = "X.509 subjectPublicKeyInfo with PKCS#1"
- PKCS1 = "Raw PKCS#1"
- OpenSSH = "OpenSSH"
- Raw = "Raw"
- CompressedPoint = "X9.62 Compressed Point"
- UncompressedPoint = "X9.62 Uncompressed Point"
-
-
-class ParameterFormat(utils.Enum):
- PKCS3 = "PKCS3"
-
-
-class KeySerializationEncryption(metaclass=abc.ABCMeta):
- pass
-
-
-class BestAvailableEncryption(KeySerializationEncryption):
- def __init__(self, password: bytes):
- if not isinstance(password, bytes) or len(password) == 0:
- raise ValueError("Password must be 1 or more bytes.")
-
- self.password = password
-
-
-class NoEncryption(KeySerializationEncryption):
- pass
-
-
-class KeySerializationEncryptionBuilder:
- def __init__(
- self,
- format: PrivateFormat,
- *,
- _kdf_rounds: int | None = None,
- _hmac_hash: HashAlgorithm | None = None,
- _key_cert_algorithm: PBES | None = None,
- ) -> None:
- self._format = format
-
- self._kdf_rounds = _kdf_rounds
- self._hmac_hash = _hmac_hash
- self._key_cert_algorithm = _key_cert_algorithm
-
- def kdf_rounds(self, rounds: int) -> KeySerializationEncryptionBuilder:
- if self._kdf_rounds is not None:
- raise ValueError("kdf_rounds already set")
-
- if not isinstance(rounds, int):
- raise TypeError("kdf_rounds must be an integer")
-
- if rounds < 1:
- raise ValueError("kdf_rounds must be a positive integer")
-
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=rounds,
- _hmac_hash=self._hmac_hash,
- _key_cert_algorithm=self._key_cert_algorithm,
- )
-
- def hmac_hash(
- self, algorithm: HashAlgorithm
- ) -> KeySerializationEncryptionBuilder:
- if self._format is not PrivateFormat.PKCS12:
- raise TypeError(
- "hmac_hash only supported with PrivateFormat.PKCS12"
- )
-
- if self._hmac_hash is not None:
- raise ValueError("hmac_hash already set")
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=self._kdf_rounds,
- _hmac_hash=algorithm,
- _key_cert_algorithm=self._key_cert_algorithm,
- )
-
- def key_cert_algorithm(
- self, algorithm: PBES
- ) -> KeySerializationEncryptionBuilder:
- if self._format is not PrivateFormat.PKCS12:
- raise TypeError(
- "key_cert_algorithm only supported with "
- "PrivateFormat.PKCS12"
- )
- if self._key_cert_algorithm is not None:
- raise ValueError("key_cert_algorithm already set")
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=self._kdf_rounds,
- _hmac_hash=self._hmac_hash,
- _key_cert_algorithm=algorithm,
- )
-
- def build(self, password: bytes) -> KeySerializationEncryption:
- if not isinstance(password, bytes) or len(password) == 0:
- raise ValueError("Password must be 1 or more bytes.")
-
- return _KeySerializationEncryption(
- self._format,
- password,
- kdf_rounds=self._kdf_rounds,
- hmac_hash=self._hmac_hash,
- key_cert_algorithm=self._key_cert_algorithm,
- )
-
-
-class _KeySerializationEncryption(KeySerializationEncryption):
- def __init__(
- self,
- format: PrivateFormat,
- password: bytes,
- *,
- kdf_rounds: int | None,
- hmac_hash: HashAlgorithm | None,
- key_cert_algorithm: PBES | None,
- ):
- self._format = format
- self.password = password
-
- self._kdf_rounds = kdf_rounds
- self._hmac_hash = hmac_hash
- self._key_cert_algorithm = key_cert_algorithm
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dh.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dh.py
deleted file mode 100644
index 31c9748a9..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dh.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-generate_parameters = rust_openssl.dh.generate_parameters
-
-
-DHPrivateNumbers = rust_openssl.dh.DHPrivateNumbers
-DHPublicNumbers = rust_openssl.dh.DHPublicNumbers
-DHParameterNumbers = rust_openssl.dh.DHParameterNumbers
-
-
-class DHParameters(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def generate_private_key(self) -> DHPrivateKey:
- """
- Generates and returns a DHPrivateKey.
- """
-
- @abc.abstractmethod
- def parameter_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.ParameterFormat,
- ) -> bytes:
- """
- Returns the parameters serialized as bytes.
- """
-
- @abc.abstractmethod
- def parameter_numbers(self) -> DHParameterNumbers:
- """
- Returns a DHParameterNumbers.
- """
-
-
-DHParametersWithSerialization = DHParameters
-DHParameters.register(rust_openssl.dh.DHParameters)
-
-
-class DHPublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DHParameters:
- """
- The DHParameters object associated with this public key.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> DHPublicNumbers:
- """
- Returns a DHPublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-DHPublicKeyWithSerialization = DHPublicKey
-DHPublicKey.register(rust_openssl.dh.DHPublicKey)
-
-
-class DHPrivateKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> DHPublicKey:
- """
- The DHPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DHParameters:
- """
- The DHParameters object associated with this private key.
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: DHPublicKey) -> bytes:
- """
- Given peer's DHPublicKey, carry out the key exchange and
- return shared key as bytes.
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> DHPrivateNumbers:
- """
- Returns a DHPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-DHPrivateKeyWithSerialization = DHPrivateKey
-DHPrivateKey.register(rust_openssl.dh.DHPrivateKey)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dsa.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dsa.py
deleted file mode 100644
index 6dd34c0e0..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/dsa.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class DSAParameters(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def generate_private_key(self) -> DSAPrivateKey:
- """
- Generates and returns a DSAPrivateKey.
- """
-
- @abc.abstractmethod
- def parameter_numbers(self) -> DSAParameterNumbers:
- """
- Returns a DSAParameterNumbers.
- """
-
-
-DSAParametersWithNumbers = DSAParameters
-DSAParameters.register(rust_openssl.dsa.DSAParameters)
-
-
-class DSAPrivateKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> DSAPublicKey:
- """
- The DSAPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DSAParameters:
- """
- The DSAParameters object associated with this private key.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> bytes:
- """
- Signs the data
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> DSAPrivateNumbers:
- """
- Returns a DSAPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-DSAPrivateKeyWithSerialization = DSAPrivateKey
-DSAPrivateKey.register(rust_openssl.dsa.DSAPrivateKey)
-
-
-class DSAPublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DSAParameters:
- """
- The DSAParameters object associated with this public key.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> DSAPublicNumbers:
- """
- Returns a DSAPublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-DSAPublicKeyWithSerialization = DSAPublicKey
-DSAPublicKey.register(rust_openssl.dsa.DSAPublicKey)
-
-DSAPrivateNumbers = rust_openssl.dsa.DSAPrivateNumbers
-DSAPublicNumbers = rust_openssl.dsa.DSAPublicNumbers
-DSAParameterNumbers = rust_openssl.dsa.DSAParameterNumbers
-
-
-def generate_parameters(
- key_size: int, backend: typing.Any = None
-) -> DSAParameters:
- if key_size not in (1024, 2048, 3072, 4096):
- raise ValueError("Key size must be 1024, 2048, 3072, or 4096 bits.")
-
- return rust_openssl.dsa.generate_parameters(key_size)
-
-
-def generate_private_key(
- key_size: int, backend: typing.Any = None
-) -> DSAPrivateKey:
- parameters = generate_parameters(key_size)
- return parameters.generate_private_key()
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ec.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ec.py
deleted file mode 100644
index da1fbea13..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ec.py
+++ /dev/null
@@ -1,403 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat._oid import ObjectIdentifier
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class EllipticCurveOID:
- SECP192R1 = ObjectIdentifier("1.2.840.10045.3.1.1")
- SECP224R1 = ObjectIdentifier("1.3.132.0.33")
- SECP256K1 = ObjectIdentifier("1.3.132.0.10")
- SECP256R1 = ObjectIdentifier("1.2.840.10045.3.1.7")
- SECP384R1 = ObjectIdentifier("1.3.132.0.34")
- SECP521R1 = ObjectIdentifier("1.3.132.0.35")
- BRAINPOOLP256R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.7")
- BRAINPOOLP384R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.11")
- BRAINPOOLP512R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.13")
- SECT163K1 = ObjectIdentifier("1.3.132.0.1")
- SECT163R2 = ObjectIdentifier("1.3.132.0.15")
- SECT233K1 = ObjectIdentifier("1.3.132.0.26")
- SECT233R1 = ObjectIdentifier("1.3.132.0.27")
- SECT283K1 = ObjectIdentifier("1.3.132.0.16")
- SECT283R1 = ObjectIdentifier("1.3.132.0.17")
- SECT409K1 = ObjectIdentifier("1.3.132.0.36")
- SECT409R1 = ObjectIdentifier("1.3.132.0.37")
- SECT571K1 = ObjectIdentifier("1.3.132.0.38")
- SECT571R1 = ObjectIdentifier("1.3.132.0.39")
-
-
-class EllipticCurve(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- The name of the curve. e.g. secp256r1.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
-
-class EllipticCurveSignatureAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def algorithm(
- self,
- ) -> asym_utils.Prehashed | hashes.HashAlgorithm:
- """
- The digest algorithm used with this signature.
- """
-
-
-class EllipticCurvePrivateKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def exchange(
- self, algorithm: ECDH, peer_public_key: EllipticCurvePublicKey
- ) -> bytes:
- """
- Performs a key exchange operation using the provided algorithm with the
- provided peer's public key.
- """
-
- @abc.abstractmethod
- def public_key(self) -> EllipticCurvePublicKey:
- """
- The EllipticCurvePublicKey for this private key.
- """
-
- @property
- @abc.abstractmethod
- def curve(self) -> EllipticCurve:
- """
- The EllipticCurve that this key is on.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- signature_algorithm: EllipticCurveSignatureAlgorithm,
- ) -> bytes:
- """
- Signs the data
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> EllipticCurvePrivateNumbers:
- """
- Returns an EllipticCurvePrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-EllipticCurvePrivateKeyWithSerialization = EllipticCurvePrivateKey
-EllipticCurvePrivateKey.register(rust_openssl.ec.ECPrivateKey)
-
-
-class EllipticCurvePublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def curve(self) -> EllipticCurve:
- """
- The EllipticCurve that this key is on.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> EllipticCurvePublicNumbers:
- """
- Returns an EllipticCurvePublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- signature_algorithm: EllipticCurveSignatureAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @classmethod
- def from_encoded_point(
- cls, curve: EllipticCurve, data: bytes
- ) -> EllipticCurvePublicKey:
- utils._check_bytes("data", data)
-
- if len(data) == 0:
- raise ValueError("data must not be an empty byte string")
-
- if data[0] not in [0x02, 0x03, 0x04]:
- raise ValueError("Unsupported elliptic curve point type")
-
- return rust_openssl.ec.from_public_bytes(curve, data)
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-EllipticCurvePublicKeyWithSerialization = EllipticCurvePublicKey
-EllipticCurvePublicKey.register(rust_openssl.ec.ECPublicKey)
-
-EllipticCurvePrivateNumbers = rust_openssl.ec.EllipticCurvePrivateNumbers
-EllipticCurvePublicNumbers = rust_openssl.ec.EllipticCurvePublicNumbers
-
-
-class SECT571R1(EllipticCurve):
- name = "sect571r1"
- key_size = 570
-
-
-class SECT409R1(EllipticCurve):
- name = "sect409r1"
- key_size = 409
-
-
-class SECT283R1(EllipticCurve):
- name = "sect283r1"
- key_size = 283
-
-
-class SECT233R1(EllipticCurve):
- name = "sect233r1"
- key_size = 233
-
-
-class SECT163R2(EllipticCurve):
- name = "sect163r2"
- key_size = 163
-
-
-class SECT571K1(EllipticCurve):
- name = "sect571k1"
- key_size = 571
-
-
-class SECT409K1(EllipticCurve):
- name = "sect409k1"
- key_size = 409
-
-
-class SECT283K1(EllipticCurve):
- name = "sect283k1"
- key_size = 283
-
-
-class SECT233K1(EllipticCurve):
- name = "sect233k1"
- key_size = 233
-
-
-class SECT163K1(EllipticCurve):
- name = "sect163k1"
- key_size = 163
-
-
-class SECP521R1(EllipticCurve):
- name = "secp521r1"
- key_size = 521
-
-
-class SECP384R1(EllipticCurve):
- name = "secp384r1"
- key_size = 384
-
-
-class SECP256R1(EllipticCurve):
- name = "secp256r1"
- key_size = 256
-
-
-class SECP256K1(EllipticCurve):
- name = "secp256k1"
- key_size = 256
-
-
-class SECP224R1(EllipticCurve):
- name = "secp224r1"
- key_size = 224
-
-
-class SECP192R1(EllipticCurve):
- name = "secp192r1"
- key_size = 192
-
-
-class BrainpoolP256R1(EllipticCurve):
- name = "brainpoolP256r1"
- key_size = 256
-
-
-class BrainpoolP384R1(EllipticCurve):
- name = "brainpoolP384r1"
- key_size = 384
-
-
-class BrainpoolP512R1(EllipticCurve):
- name = "brainpoolP512r1"
- key_size = 512
-
-
-_CURVE_TYPES: dict[str, EllipticCurve] = {
- "prime192v1": SECP192R1(),
- "prime256v1": SECP256R1(),
- "secp192r1": SECP192R1(),
- "secp224r1": SECP224R1(),
- "secp256r1": SECP256R1(),
- "secp384r1": SECP384R1(),
- "secp521r1": SECP521R1(),
- "secp256k1": SECP256K1(),
- "sect163k1": SECT163K1(),
- "sect233k1": SECT233K1(),
- "sect283k1": SECT283K1(),
- "sect409k1": SECT409K1(),
- "sect571k1": SECT571K1(),
- "sect163r2": SECT163R2(),
- "sect233r1": SECT233R1(),
- "sect283r1": SECT283R1(),
- "sect409r1": SECT409R1(),
- "sect571r1": SECT571R1(),
- "brainpoolP256r1": BrainpoolP256R1(),
- "brainpoolP384r1": BrainpoolP384R1(),
- "brainpoolP512r1": BrainpoolP512R1(),
-}
-
-
-class ECDSA(EllipticCurveSignatureAlgorithm):
- def __init__(
- self,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- deterministic_signing: bool = False,
- ):
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if (
- deterministic_signing
- and not backend.ecdsa_deterministic_supported()
- ):
- raise UnsupportedAlgorithm(
- "ECDSA with deterministic signature (RFC 6979) is not "
- "supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
- self._algorithm = algorithm
- self._deterministic_signing = deterministic_signing
-
- @property
- def algorithm(
- self,
- ) -> asym_utils.Prehashed | hashes.HashAlgorithm:
- return self._algorithm
-
- @property
- def deterministic_signing(
- self,
- ) -> bool:
- return self._deterministic_signing
-
-
-generate_private_key = rust_openssl.ec.generate_private_key
-
-
-def derive_private_key(
- private_value: int,
- curve: EllipticCurve,
- backend: typing.Any = None,
-) -> EllipticCurvePrivateKey:
- if not isinstance(private_value, int):
- raise TypeError("private_value must be an integer type.")
-
- if private_value <= 0:
- raise ValueError("private_value must be a positive integer.")
-
- return rust_openssl.ec.derive_private_key(private_value, curve)
-
-
-class ECDH:
- pass
-
-
-_OID_TO_CURVE = {
- EllipticCurveOID.SECP192R1: SECP192R1,
- EllipticCurveOID.SECP224R1: SECP224R1,
- EllipticCurveOID.SECP256K1: SECP256K1,
- EllipticCurveOID.SECP256R1: SECP256R1,
- EllipticCurveOID.SECP384R1: SECP384R1,
- EllipticCurveOID.SECP521R1: SECP521R1,
- EllipticCurveOID.BRAINPOOLP256R1: BrainpoolP256R1,
- EllipticCurveOID.BRAINPOOLP384R1: BrainpoolP384R1,
- EllipticCurveOID.BRAINPOOLP512R1: BrainpoolP512R1,
- EllipticCurveOID.SECT163K1: SECT163K1,
- EllipticCurveOID.SECT163R2: SECT163R2,
- EllipticCurveOID.SECT233K1: SECT233K1,
- EllipticCurveOID.SECT233R1: SECT233R1,
- EllipticCurveOID.SECT283K1: SECT283K1,
- EllipticCurveOID.SECT283R1: SECT283R1,
- EllipticCurveOID.SECT409K1: SECT409K1,
- EllipticCurveOID.SECT409R1: SECT409R1,
- EllipticCurveOID.SECT571K1: SECT571K1,
- EllipticCurveOID.SECT571R1: SECT571R1,
-}
-
-
-def get_curve_for_oid(oid: ObjectIdentifier) -> type[EllipticCurve]:
- try:
- return _OID_TO_CURVE[oid]
- except KeyError:
- raise LookupError(
- "The provided object identifier has no matching elliptic "
- "curve class"
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed25519.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed25519.py
deleted file mode 100644
index 3a26185d7..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed25519.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class Ed25519PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> Ed25519PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def verify(self, signature: bytes, data: bytes) -> None:
- """
- Verify the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-Ed25519PublicKey.register(rust_openssl.ed25519.Ed25519PublicKey)
-
-
-class Ed25519PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> Ed25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> Ed25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> Ed25519PublicKey:
- """
- The Ed25519PublicKey derived from the private key.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def sign(self, data: bytes) -> bytes:
- """
- Signs the data.
- """
-
-
-Ed25519PrivateKey.register(rust_openssl.ed25519.Ed25519PrivateKey)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed448.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed448.py
deleted file mode 100644
index 78c82c4a3..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/ed448.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class Ed448PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> Ed448PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def verify(self, signature: bytes, data: bytes) -> None:
- """
- Verify the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-if hasattr(rust_openssl, "ed448"):
- Ed448PublicKey.register(rust_openssl.ed448.Ed448PublicKey)
-
-
-class Ed448PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> Ed448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> Ed448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> Ed448PublicKey:
- """
- The Ed448PublicKey derived from the private key.
- """
-
- @abc.abstractmethod
- def sign(self, data: bytes) -> bytes:
- """
- Signs the data.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
-
-if hasattr(rust_openssl, "x448"):
- Ed448PrivateKey.register(rust_openssl.ed448.Ed448PrivateKey)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/padding.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/padding.py
deleted file mode 100644
index b4babf44f..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/padding.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives._asymmetric import (
- AsymmetricPadding as AsymmetricPadding,
-)
-from cryptography.hazmat.primitives.asymmetric import rsa
-
-
-class PKCS1v15(AsymmetricPadding):
- name = "EMSA-PKCS1-v1_5"
-
-
-class _MaxLength:
- "Sentinel value for `MAX_LENGTH`."
-
-
-class _Auto:
- "Sentinel value for `AUTO`."
-
-
-class _DigestLength:
- "Sentinel value for `DIGEST_LENGTH`."
-
-
-class PSS(AsymmetricPadding):
- MAX_LENGTH = _MaxLength()
- AUTO = _Auto()
- DIGEST_LENGTH = _DigestLength()
- name = "EMSA-PSS"
- _salt_length: int | _MaxLength | _Auto | _DigestLength
-
- def __init__(
- self,
- mgf: MGF,
- salt_length: int | _MaxLength | _Auto | _DigestLength,
- ) -> None:
- self._mgf = mgf
-
- if not isinstance(
- salt_length, (int, _MaxLength, _Auto, _DigestLength)
- ):
- raise TypeError(
- "salt_length must be an integer, MAX_LENGTH, "
- "DIGEST_LENGTH, or AUTO"
- )
-
- if isinstance(salt_length, int) and salt_length < 0:
- raise ValueError("salt_length must be zero or greater.")
-
- self._salt_length = salt_length
-
- @property
- def mgf(self) -> MGF:
- return self._mgf
-
-
-class OAEP(AsymmetricPadding):
- name = "EME-OAEP"
-
- def __init__(
- self,
- mgf: MGF,
- algorithm: hashes.HashAlgorithm,
- label: bytes | None,
- ):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of hashes.HashAlgorithm.")
-
- self._mgf = mgf
- self._algorithm = algorithm
- self._label = label
-
- @property
- def algorithm(self) -> hashes.HashAlgorithm:
- return self._algorithm
-
- @property
- def mgf(self) -> MGF:
- return self._mgf
-
-
-class MGF(metaclass=abc.ABCMeta):
- _algorithm: hashes.HashAlgorithm
-
-
-class MGF1(MGF):
- MAX_LENGTH = _MaxLength()
-
- def __init__(self, algorithm: hashes.HashAlgorithm):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of hashes.HashAlgorithm.")
-
- self._algorithm = algorithm
-
-
-def calculate_max_pss_salt_length(
- key: rsa.RSAPrivateKey | rsa.RSAPublicKey,
- hash_algorithm: hashes.HashAlgorithm,
-) -> int:
- if not isinstance(key, (rsa.RSAPrivateKey, rsa.RSAPublicKey)):
- raise TypeError("key must be an RSA public or private key")
- # bit length - 1 per RFC 3447
- emlen = (key.key_size + 6) // 8
- salt_length = emlen - hash_algorithm.digest_size - 2
- assert salt_length >= 0
- return salt_length
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/rsa.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/rsa.py
deleted file mode 100644
index 905068e3b..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/rsa.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import random
-import typing
-from math import gcd
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class RSAPrivateKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def decrypt(self, ciphertext: bytes, padding: AsymmetricPadding) -> bytes:
- """
- Decrypts the provided ciphertext.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the public modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> RSAPublicKey:
- """
- The RSAPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- padding: AsymmetricPadding,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> bytes:
- """
- Signs the data.
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> RSAPrivateNumbers:
- """
- Returns an RSAPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-RSAPrivateKeyWithSerialization = RSAPrivateKey
-RSAPrivateKey.register(rust_openssl.rsa.RSAPrivateKey)
-
-
-class RSAPublicKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def encrypt(self, plaintext: bytes, padding: AsymmetricPadding) -> bytes:
- """
- Encrypts the given plaintext.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the public modulus.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> RSAPublicNumbers:
- """
- Returns an RSAPublicNumbers
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- padding: AsymmetricPadding,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @abc.abstractmethod
- def recover_data_from_signature(
- self,
- signature: bytes,
- padding: AsymmetricPadding,
- algorithm: hashes.HashAlgorithm | None,
- ) -> bytes:
- """
- Recovers the original data from the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-RSAPublicKeyWithSerialization = RSAPublicKey
-RSAPublicKey.register(rust_openssl.rsa.RSAPublicKey)
-
-RSAPrivateNumbers = rust_openssl.rsa.RSAPrivateNumbers
-RSAPublicNumbers = rust_openssl.rsa.RSAPublicNumbers
-
-
-def generate_private_key(
- public_exponent: int,
- key_size: int,
- backend: typing.Any = None,
-) -> RSAPrivateKey:
- _verify_rsa_parameters(public_exponent, key_size)
- return rust_openssl.rsa.generate_private_key(public_exponent, key_size)
-
-
-def _verify_rsa_parameters(public_exponent: int, key_size: int) -> None:
- if public_exponent not in (3, 65537):
- raise ValueError(
- "public_exponent must be either 3 (for legacy compatibility) or "
- "65537. Almost everyone should choose 65537 here!"
- )
-
- if key_size < 1024:
- raise ValueError("key_size must be at least 1024-bits.")
-
-
-def _modinv(e: int, m: int) -> int:
- """
- Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
- """
- x1, x2 = 1, 0
- a, b = e, m
- while b > 0:
- q, r = divmod(a, b)
- xn = x1 - q * x2
- a, b, x1, x2 = b, r, x2, xn
- return x1 % m
-
-
-def rsa_crt_iqmp(p: int, q: int) -> int:
- """
- Compute the CRT (q ** -1) % p value from RSA primes p and q.
- """
- return _modinv(q, p)
-
-
-def rsa_crt_dmp1(private_exponent: int, p: int) -> int:
- """
- Compute the CRT private_exponent % (p - 1) value from the RSA
- private_exponent (d) and p.
- """
- return private_exponent % (p - 1)
-
-
-def rsa_crt_dmq1(private_exponent: int, q: int) -> int:
- """
- Compute the CRT private_exponent % (q - 1) value from the RSA
- private_exponent (d) and q.
- """
- return private_exponent % (q - 1)
-
-
-def rsa_recover_private_exponent(e: int, p: int, q: int) -> int:
- """
- Compute the RSA private_exponent (d) given the public exponent (e)
- and the RSA primes p and q.
-
- This uses the Carmichael totient function to generate the
- smallest possible working value of the private exponent.
- """
- # This lambda_n is the Carmichael totient function.
- # The original RSA paper uses the Euler totient function
- # here: phi_n = (p - 1) * (q - 1)
- # Either version of the private exponent will work, but the
- # one generated by the older formulation may be larger
- # than necessary. (lambda_n always divides phi_n)
- #
- # TODO: Replace with lcm(p - 1, q - 1) once the minimum
- # supported Python version is >= 3.9.
- lambda_n = (p - 1) * (q - 1) // gcd(p - 1, q - 1)
- return _modinv(e, lambda_n)
-
-
-# Controls the number of iterations rsa_recover_prime_factors will perform
-# to obtain the prime factors.
-_MAX_RECOVERY_ATTEMPTS = 500
-
-
-def rsa_recover_prime_factors(n: int, e: int, d: int) -> tuple[int, int]:
- """
- Compute factors p and q from the private exponent d. We assume that n has
- no more than two factors. This function is adapted from code in PyCrypto.
- """
- # reject invalid values early
- if 17 != pow(17, e * d, n):
- raise ValueError("n, d, e don't match")
- # See 8.2.2(i) in Handbook of Applied Cryptography.
- ktot = d * e - 1
- # The quantity d*e-1 is a multiple of phi(n), even,
- # and can be represented as t*2^s.
- t = ktot
- while t % 2 == 0:
- t = t // 2
- # Cycle through all multiplicative inverses in Zn.
- # The algorithm is non-deterministic, but there is a 50% chance
- # any candidate a leads to successful factoring.
- # See "Digitalized Signatures and Public Key Functions as Intractable
- # as Factorization", M. Rabin, 1979
- spotted = False
- tries = 0
- while not spotted and tries < _MAX_RECOVERY_ATTEMPTS:
- a = random.randint(2, n - 1)
- tries += 1
- k = t
- # Cycle through all values a^{t*2^i}=a^k
- while k < ktot:
- cand = pow(a, k, n)
- # Check if a^k is a non-trivial root of unity (mod n)
- if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1:
- # We have found a number such that (cand-1)(cand+1)=0 (mod n).
- # Either of the terms divides n.
- p = gcd(cand + 1, n)
- spotted = True
- break
- k *= 2
- if not spotted:
- raise ValueError("Unable to compute factors p and q from exponent d.")
- # Found !
- q, r = divmod(n, p)
- assert r == 0
- p, q = sorted((p, q), reverse=True)
- return (p, q)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/types.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/types.py
deleted file mode 100644
index 1fe4eaf51..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/types.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.hazmat.primitives.asymmetric import (
- dh,
- dsa,
- ec,
- ed448,
- ed25519,
- rsa,
- x448,
- x25519,
-)
-
-# Every asymmetric key type
-PublicKeyTypes = typing.Union[
- dh.DHPublicKey,
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
-]
-PUBLIC_KEY_TYPES = PublicKeyTypes
-utils.deprecated(
- PUBLIC_KEY_TYPES,
- __name__,
- "Use PublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="PUBLIC_KEY_TYPES",
-)
-# Every asymmetric key type
-PrivateKeyTypes = typing.Union[
- dh.DHPrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- x25519.X25519PrivateKey,
- x448.X448PrivateKey,
-]
-PRIVATE_KEY_TYPES = PrivateKeyTypes
-utils.deprecated(
- PRIVATE_KEY_TYPES,
- __name__,
- "Use PrivateKeyTypes instead",
- utils.DeprecatedIn40,
- name="PRIVATE_KEY_TYPES",
-)
-# Just the key types we allow to be used for x509 signing. This mirrors
-# the certificate public key types
-CertificateIssuerPrivateKeyTypes = typing.Union[
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
-]
-CERTIFICATE_PRIVATE_KEY_TYPES = CertificateIssuerPrivateKeyTypes
-utils.deprecated(
- CERTIFICATE_PRIVATE_KEY_TYPES,
- __name__,
- "Use CertificateIssuerPrivateKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_PRIVATE_KEY_TYPES",
-)
-# Just the key types we allow to be used for x509 signing. This mirrors
-# the certificate private key types
-CertificateIssuerPublicKeyTypes = typing.Union[
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
-]
-CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES = CertificateIssuerPublicKeyTypes
-utils.deprecated(
- CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES,
- __name__,
- "Use CertificateIssuerPublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES",
-)
-# This type removes DHPublicKey. x448/x25519 can be a public key
-# but cannot be used in signing so they are allowed here.
-CertificatePublicKeyTypes = typing.Union[
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
-]
-CERTIFICATE_PUBLIC_KEY_TYPES = CertificatePublicKeyTypes
-utils.deprecated(
- CERTIFICATE_PUBLIC_KEY_TYPES,
- __name__,
- "Use CertificatePublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_PUBLIC_KEY_TYPES",
-)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/utils.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/utils.py
deleted file mode 100644
index 826b9567b..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/utils.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import asn1
-from cryptography.hazmat.primitives import hashes
-
-decode_dss_signature = asn1.decode_dss_signature
-encode_dss_signature = asn1.encode_dss_signature
-
-
-class Prehashed:
- def __init__(self, algorithm: hashes.HashAlgorithm):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of HashAlgorithm.")
-
- self._algorithm = algorithm
- self._digest_size = algorithm.digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x25519.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x25519.py
deleted file mode 100644
index 0cfa36e34..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x25519.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class X25519PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> X25519PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x25519.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-X25519PublicKey.register(rust_openssl.x25519.X25519PublicKey)
-
-
-class X25519PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> X25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
- return rust_openssl.x25519.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> X25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x25519.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> X25519PublicKey:
- """
- Returns the public key associated with this private key
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: X25519PublicKey) -> bytes:
- """
- Performs a key exchange operation using the provided peer's public key.
- """
-
-
-X25519PrivateKey.register(rust_openssl.x25519.X25519PrivateKey)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x448.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x448.py
deleted file mode 100644
index 86086ab44..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/asymmetric/x448.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class X448PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> X448PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-if hasattr(rust_openssl, "x448"):
- X448PublicKey.register(rust_openssl.x448.X448PublicKey)
-
-
-class X448PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> X448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> X448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> X448PublicKey:
- """
- Returns the public key associated with this private key
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: X448PublicKey) -> bytes:
- """
- Performs a key exchange operation using the provided peer's public key.
- """
-
-
-if hasattr(rust_openssl, "x448"):
- X448PrivateKey.register(rust_openssl.x448.X448PrivateKey)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/__init__.py
deleted file mode 100644
index 10c15d0f5..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers.base import (
- AEADCipherContext,
- AEADDecryptionContext,
- AEADEncryptionContext,
- Cipher,
- CipherContext,
-)
-
-__all__ = [
- "AEADCipherContext",
- "AEADDecryptionContext",
- "AEADEncryptionContext",
- "BlockCipherAlgorithm",
- "Cipher",
- "CipherAlgorithm",
- "CipherContext",
-]
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/aead.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/aead.py
deleted file mode 100644
index c8a582d78..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/aead.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = [
- "AESCCM",
- "AESGCM",
- "AESGCMSIV",
- "AESOCB3",
- "AESSIV",
- "ChaCha20Poly1305",
-]
-
-AESGCM = rust_openssl.aead.AESGCM
-ChaCha20Poly1305 = rust_openssl.aead.ChaCha20Poly1305
-AESCCM = rust_openssl.aead.AESCCM
-AESSIV = rust_openssl.aead.AESSIV
-AESOCB3 = rust_openssl.aead.AESOCB3
-AESGCMSIV = rust_openssl.aead.AESGCMSIV
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/algorithms.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/algorithms.py
deleted file mode 100644
index f9fa8a587..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/algorithms.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography import utils
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- ARC4 as ARC4,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- CAST5 as CAST5,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- IDEA as IDEA,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- SEED as SEED,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- Blowfish as Blowfish,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- TripleDES as TripleDES,
-)
-from cryptography.hazmat.primitives._cipheralgorithm import _verify_key_size
-from cryptography.hazmat.primitives.ciphers import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-
-
-class AES(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- # 512 added to support AES-256-XTS, which uses 512-bit keys
- key_sizes = frozenset([128, 192, 256, 512])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class AES128(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- key_sizes = frozenset([128])
- key_size = 128
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
-
-class AES256(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- key_sizes = frozenset([256])
- key_size = 256
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
-
-class Camellia(BlockCipherAlgorithm):
- name = "camellia"
- block_size = 128
- key_sizes = frozenset([128, 192, 256])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-utils.deprecated(
- ARC4,
- __name__,
- "ARC4 has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.ARC4 and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.",
- utils.DeprecatedIn43,
- name="ARC4",
-)
-
-
-utils.deprecated(
- TripleDES,
- __name__,
- "TripleDES has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.",
- utils.DeprecatedIn43,
- name="TripleDES",
-)
-
-utils.deprecated(
- Blowfish,
- __name__,
- "Blowfish has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.Blowfish and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="Blowfish",
-)
-
-
-utils.deprecated(
- CAST5,
- __name__,
- "CAST5 has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.CAST5 and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="CAST5",
-)
-
-
-utils.deprecated(
- IDEA,
- __name__,
- "IDEA has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.IDEA and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="IDEA",
-)
-
-
-utils.deprecated(
- SEED,
- __name__,
- "SEED has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.SEED and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="SEED",
-)
-
-
-class ChaCha20(CipherAlgorithm):
- name = "ChaCha20"
- key_sizes = frozenset([256])
-
- def __init__(self, key: bytes, nonce: bytes):
- self.key = _verify_key_size(self, key)
- utils._check_byteslike("nonce", nonce)
-
- if len(nonce) != 16:
- raise ValueError("nonce must be 128-bits (16 bytes)")
-
- self._nonce = nonce
-
- @property
- def nonce(self) -> bytes:
- return self._nonce
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class SM4(BlockCipherAlgorithm):
- name = "SM4"
- block_size = 128
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/base.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/base.py
deleted file mode 100644
index ebfa8052c..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/base.py
+++ /dev/null
@@ -1,145 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives._cipheralgorithm import CipherAlgorithm
-from cryptography.hazmat.primitives.ciphers import modes
-
-
-class CipherContext(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def update(self, data: bytes) -> bytes:
- """
- Processes the provided bytes through the cipher and returns the results
- as bytes.
- """
-
- @abc.abstractmethod
- def update_into(self, data: bytes, buf: bytes) -> int:
- """
- Processes the provided bytes and writes the resulting data into the
- provided buffer. Returns the number of bytes written.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Returns the results of processing the final block as bytes.
- """
-
- @abc.abstractmethod
- def reset_nonce(self, nonce: bytes) -> None:
- """
- Resets the nonce for the cipher context to the provided value.
- Raises an exception if it does not support reset or if the
- provided nonce does not have a valid length.
- """
-
-
-class AEADCipherContext(CipherContext, metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def authenticate_additional_data(self, data: bytes) -> None:
- """
- Authenticates the provided bytes.
- """
-
-
-class AEADDecryptionContext(AEADCipherContext, metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def finalize_with_tag(self, tag: bytes) -> bytes:
- """
- Returns the results of processing the final block as bytes and allows
- delayed passing of the authentication tag.
- """
-
-
-class AEADEncryptionContext(AEADCipherContext, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tag(self) -> bytes:
- """
- Returns tag bytes. This is only available after encryption is
- finalized.
- """
-
-
-Mode = typing.TypeVar(
- "Mode", bound=typing.Optional[modes.Mode], covariant=True
-)
-
-
-class Cipher(typing.Generic[Mode]):
- def __init__(
- self,
- algorithm: CipherAlgorithm,
- mode: Mode,
- backend: typing.Any = None,
- ) -> None:
- if not isinstance(algorithm, CipherAlgorithm):
- raise TypeError("Expected interface of CipherAlgorithm.")
-
- if mode is not None:
- # mypy needs this assert to narrow the type from our generic
- # type. Maybe it won't some time in the future.
- assert isinstance(mode, modes.Mode)
- mode.validate_for_algorithm(algorithm)
-
- self.algorithm = algorithm
- self.mode = mode
-
- @typing.overload
- def encryptor(
- self: Cipher[modes.ModeWithAuthenticationTag],
- ) -> AEADEncryptionContext: ...
-
- @typing.overload
- def encryptor(
- self: _CIPHER_TYPE,
- ) -> CipherContext: ...
-
- def encryptor(self):
- if isinstance(self.mode, modes.ModeWithAuthenticationTag):
- if self.mode.tag is not None:
- raise ValueError(
- "Authentication tag must be None when encrypting."
- )
-
- return rust_openssl.ciphers.create_encryption_ctx(
- self.algorithm, self.mode
- )
-
- @typing.overload
- def decryptor(
- self: Cipher[modes.ModeWithAuthenticationTag],
- ) -> AEADDecryptionContext: ...
-
- @typing.overload
- def decryptor(
- self: _CIPHER_TYPE,
- ) -> CipherContext: ...
-
- def decryptor(self):
- return rust_openssl.ciphers.create_decryption_ctx(
- self.algorithm, self.mode
- )
-
-
-_CIPHER_TYPE = Cipher[
- typing.Union[
- modes.ModeWithNonce,
- modes.ModeWithTweak,
- None,
- modes.ECB,
- modes.ModeWithInitializationVector,
- ]
-]
-
-CipherContext.register(rust_openssl.ciphers.CipherContext)
-AEADEncryptionContext.register(rust_openssl.ciphers.AEADEncryptionContext)
-AEADDecryptionContext.register(rust_openssl.ciphers.AEADDecryptionContext)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/modes.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/modes.py
deleted file mode 100644
index 1dd2cc1e8..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/ciphers/modes.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers import algorithms
-
-
-class Mode(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this mode (e.g. "ECB", "CBC").
- """
-
- @abc.abstractmethod
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- """
- Checks that all the necessary invariants of this (mode, algorithm)
- combination are met.
- """
-
-
-class ModeWithInitializationVector(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def initialization_vector(self) -> bytes:
- """
- The value of the initialization vector for this mode as bytes.
- """
-
-
-class ModeWithTweak(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tweak(self) -> bytes:
- """
- The value of the tweak for this mode as bytes.
- """
-
-
-class ModeWithNonce(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def nonce(self) -> bytes:
- """
- The value of the nonce for this mode as bytes.
- """
-
-
-class ModeWithAuthenticationTag(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tag(self) -> bytes | None:
- """
- The value of the tag supplied to the constructor of this mode.
- """
-
-
-def _check_aes_key_length(self: Mode, algorithm: CipherAlgorithm) -> None:
- if algorithm.key_size > 256 and algorithm.name == "AES":
- raise ValueError(
- "Only 128, 192, and 256 bit keys are allowed for this AES mode"
- )
-
-
-def _check_iv_length(
- self: ModeWithInitializationVector, algorithm: BlockCipherAlgorithm
-) -> None:
- iv_len = len(self.initialization_vector)
- if iv_len * 8 != algorithm.block_size:
- raise ValueError(f"Invalid IV size ({iv_len}) for {self.name}.")
-
-
-def _check_nonce_length(
- nonce: bytes, name: str, algorithm: CipherAlgorithm
-) -> None:
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- f"{name} requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- if len(nonce) * 8 != algorithm.block_size:
- raise ValueError(f"Invalid nonce size ({len(nonce)}) for {name}.")
-
-
-def _check_iv_and_key_length(
- self: ModeWithInitializationVector, algorithm: CipherAlgorithm
-) -> None:
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- f"{self} requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- _check_aes_key_length(self, algorithm)
- _check_iv_length(self, algorithm)
-
-
-class CBC(ModeWithInitializationVector):
- name = "CBC"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class XTS(ModeWithTweak):
- name = "XTS"
-
- def __init__(self, tweak: bytes):
- utils._check_byteslike("tweak", tweak)
-
- if len(tweak) != 16:
- raise ValueError("tweak must be 128-bits (16 bytes)")
-
- self._tweak = tweak
-
- @property
- def tweak(self) -> bytes:
- return self._tweak
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- if isinstance(algorithm, (algorithms.AES128, algorithms.AES256)):
- raise TypeError(
- "The AES128 and AES256 classes do not support XTS, please use "
- "the standard AES class instead."
- )
-
- if algorithm.key_size not in (256, 512):
- raise ValueError(
- "The XTS specification requires a 256-bit key for AES-128-XTS"
- " and 512-bit key for AES-256-XTS"
- )
-
-
-class ECB(Mode):
- name = "ECB"
-
- validate_for_algorithm = _check_aes_key_length
-
-
-class OFB(ModeWithInitializationVector):
- name = "OFB"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CFB(ModeWithInitializationVector):
- name = "CFB"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CFB8(ModeWithInitializationVector):
- name = "CFB8"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CTR(ModeWithNonce):
- name = "CTR"
-
- def __init__(self, nonce: bytes):
- utils._check_byteslike("nonce", nonce)
- self._nonce = nonce
-
- @property
- def nonce(self) -> bytes:
- return self._nonce
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- _check_aes_key_length(self, algorithm)
- _check_nonce_length(self.nonce, self.name, algorithm)
-
-
-class GCM(ModeWithInitializationVector, ModeWithAuthenticationTag):
- name = "GCM"
- _MAX_ENCRYPTED_BYTES = (2**39 - 256) // 8
- _MAX_AAD_BYTES = (2**64) // 8
-
- def __init__(
- self,
- initialization_vector: bytes,
- tag: bytes | None = None,
- min_tag_length: int = 16,
- ):
- # OpenSSL 3.0.0 constrains GCM IVs to [64, 1024] bits inclusive
- # This is a sane limit anyway so we'll enforce it here.
- utils._check_byteslike("initialization_vector", initialization_vector)
- if len(initialization_vector) < 8 or len(initialization_vector) > 128:
- raise ValueError(
- "initialization_vector must be between 8 and 128 bytes (64 "
- "and 1024 bits)."
- )
- self._initialization_vector = initialization_vector
- if tag is not None:
- utils._check_bytes("tag", tag)
- if min_tag_length < 4:
- raise ValueError("min_tag_length must be >= 4")
- if len(tag) < min_tag_length:
- raise ValueError(
- f"Authentication tag must be {min_tag_length} bytes or "
- "longer."
- )
- self._tag = tag
- self._min_tag_length = min_tag_length
-
- @property
- def tag(self) -> bytes | None:
- return self._tag
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- _check_aes_key_length(self, algorithm)
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- "GCM requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- block_size_bytes = algorithm.block_size // 8
- if self._tag is not None and len(self._tag) > block_size_bytes:
- raise ValueError(
- f"Authentication tag cannot be more than {block_size_bytes} "
- "bytes."
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/cmac.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/cmac.py
deleted file mode 100644
index 2c67ce220..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/cmac.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = ["CMAC"]
-CMAC = rust_openssl.cmac.CMAC
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/constant_time.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/constant_time.py
deleted file mode 100644
index 3975c7147..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/constant_time.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import hmac
-
-
-def bytes_eq(a: bytes, b: bytes) -> bool:
- if not isinstance(a, bytes) or not isinstance(b, bytes):
- raise TypeError("a and b must be bytes.")
-
- return hmac.compare_digest(a, b)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hashes.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hashes.py
deleted file mode 100644
index b819e3992..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hashes.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = [
- "MD5",
- "SHA1",
- "SHA3_224",
- "SHA3_256",
- "SHA3_384",
- "SHA3_512",
- "SHA224",
- "SHA256",
- "SHA384",
- "SHA512",
- "SHA512_224",
- "SHA512_256",
- "SHAKE128",
- "SHAKE256",
- "SM3",
- "BLAKE2b",
- "BLAKE2s",
- "ExtendableOutputFunction",
- "Hash",
- "HashAlgorithm",
- "HashContext",
-]
-
-
-class HashAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this algorithm (e.g. "sha256", "md5").
- """
-
- @property
- @abc.abstractmethod
- def digest_size(self) -> int:
- """
- The size of the resulting digest in bytes.
- """
-
- @property
- @abc.abstractmethod
- def block_size(self) -> int | None:
- """
- The internal block size of the hash function, or None if the hash
- function does not use blocks internally (e.g. SHA3).
- """
-
-
-class HashContext(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def algorithm(self) -> HashAlgorithm:
- """
- A HashAlgorithm that will be used by this context.
- """
-
- @abc.abstractmethod
- def update(self, data: bytes) -> None:
- """
- Processes the provided bytes through the hash.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Finalizes the hash context and returns the hash digest as bytes.
- """
-
- @abc.abstractmethod
- def copy(self) -> HashContext:
- """
- Return a HashContext that is a copy of the current context.
- """
-
-
-Hash = rust_openssl.hashes.Hash
-HashContext.register(Hash)
-
-
-class ExtendableOutputFunction(metaclass=abc.ABCMeta):
- """
- An interface for extendable output functions.
- """
-
-
-class SHA1(HashAlgorithm):
- name = "sha1"
- digest_size = 20
- block_size = 64
-
-
-class SHA512_224(HashAlgorithm): # noqa: N801
- name = "sha512-224"
- digest_size = 28
- block_size = 128
-
-
-class SHA512_256(HashAlgorithm): # noqa: N801
- name = "sha512-256"
- digest_size = 32
- block_size = 128
-
-
-class SHA224(HashAlgorithm):
- name = "sha224"
- digest_size = 28
- block_size = 64
-
-
-class SHA256(HashAlgorithm):
- name = "sha256"
- digest_size = 32
- block_size = 64
-
-
-class SHA384(HashAlgorithm):
- name = "sha384"
- digest_size = 48
- block_size = 128
-
-
-class SHA512(HashAlgorithm):
- name = "sha512"
- digest_size = 64
- block_size = 128
-
-
-class SHA3_224(HashAlgorithm): # noqa: N801
- name = "sha3-224"
- digest_size = 28
- block_size = None
-
-
-class SHA3_256(HashAlgorithm): # noqa: N801
- name = "sha3-256"
- digest_size = 32
- block_size = None
-
-
-class SHA3_384(HashAlgorithm): # noqa: N801
- name = "sha3-384"
- digest_size = 48
- block_size = None
-
-
-class SHA3_512(HashAlgorithm): # noqa: N801
- name = "sha3-512"
- digest_size = 64
- block_size = None
-
-
-class SHAKE128(HashAlgorithm, ExtendableOutputFunction):
- name = "shake128"
- block_size = None
-
- def __init__(self, digest_size: int):
- if not isinstance(digest_size, int):
- raise TypeError("digest_size must be an integer")
-
- if digest_size < 1:
- raise ValueError("digest_size must be a positive integer")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class SHAKE256(HashAlgorithm, ExtendableOutputFunction):
- name = "shake256"
- block_size = None
-
- def __init__(self, digest_size: int):
- if not isinstance(digest_size, int):
- raise TypeError("digest_size must be an integer")
-
- if digest_size < 1:
- raise ValueError("digest_size must be a positive integer")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class MD5(HashAlgorithm):
- name = "md5"
- digest_size = 16
- block_size = 64
-
-
-class BLAKE2b(HashAlgorithm):
- name = "blake2b"
- _max_digest_size = 64
- _min_digest_size = 1
- block_size = 128
-
- def __init__(self, digest_size: int):
- if digest_size != 64:
- raise ValueError("Digest size must be 64")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class BLAKE2s(HashAlgorithm):
- name = "blake2s"
- block_size = 64
- _max_digest_size = 32
- _min_digest_size = 1
-
- def __init__(self, digest_size: int):
- if digest_size != 32:
- raise ValueError("Digest size must be 32")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class SM3(HashAlgorithm):
- name = "sm3"
- digest_size = 32
- block_size = 64
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hmac.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hmac.py
deleted file mode 100644
index a9442d59a..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/hmac.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import hashes
-
-__all__ = ["HMAC"]
-
-HMAC = rust_openssl.hmac.HMAC
-hashes.HashContext.register(HMAC)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/__init__.py
deleted file mode 100644
index 79bb459f0..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-
-class KeyDerivationFunction(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def derive(self, key_material: bytes) -> bytes:
- """
- Deterministically generates and returns a new key based on the existing
- key material.
- """
-
- @abc.abstractmethod
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- """
- Checks whether the key generated by the key material matches the
- expected derived key. Raises an exception if they do not match.
- """
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/argon2.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/argon2.py
deleted file mode 100644
index 405fc8dff..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/argon2.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-Argon2id = rust_openssl.kdf.Argon2id
-KeyDerivationFunction.register(Argon2id)
-
-__all__ = ["Argon2id"]
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/concatkdf.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/concatkdf.py
deleted file mode 100644
index 96d9d4c0d..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/concatkdf.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes, hmac
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-def _int_to_u32be(n: int) -> bytes:
- return n.to_bytes(length=4, byteorder="big")
-
-
-def _common_args_checks(
- algorithm: hashes.HashAlgorithm,
- length: int,
- otherinfo: bytes | None,
-) -> None:
- max_length = algorithm.digest_size * (2**32 - 1)
- if length > max_length:
- raise ValueError(f"Cannot derive keys larger than {max_length} bits.")
- if otherinfo is not None:
- utils._check_bytes("otherinfo", otherinfo)
-
-
-def _concatkdf_derive(
- key_material: bytes,
- length: int,
- auxfn: typing.Callable[[], hashes.HashContext],
- otherinfo: bytes,
-) -> bytes:
- utils._check_byteslike("key_material", key_material)
- output = [b""]
- outlen = 0
- counter = 1
-
- while length > outlen:
- h = auxfn()
- h.update(_int_to_u32be(counter))
- h.update(key_material)
- h.update(otherinfo)
- output.append(h.finalize())
- outlen += len(output[-1])
- counter += 1
-
- return b"".join(output)[:length]
-
-
-class ConcatKDFHash(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- otherinfo: bytes | None,
- backend: typing.Any = None,
- ):
- _common_args_checks(algorithm, length, otherinfo)
- self._algorithm = algorithm
- self._length = length
- self._otherinfo: bytes = otherinfo if otherinfo is not None else b""
-
- self._used = False
-
- def _hash(self) -> hashes.Hash:
- return hashes.Hash(self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- return _concatkdf_derive(
- key_material, self._length, self._hash, self._otherinfo
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class ConcatKDFHMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes | None,
- otherinfo: bytes | None,
- backend: typing.Any = None,
- ):
- _common_args_checks(algorithm, length, otherinfo)
- self._algorithm = algorithm
- self._length = length
- self._otherinfo: bytes = otherinfo if otherinfo is not None else b""
-
- if algorithm.block_size is None:
- raise TypeError(f"{algorithm.name} is unsupported for ConcatKDF")
-
- if salt is None:
- salt = b"\x00" * algorithm.block_size
- else:
- utils._check_bytes("salt", salt)
-
- self._salt = salt
-
- self._used = False
-
- def _hmac(self) -> hmac.HMAC:
- return hmac.HMAC(self._salt, self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- return _concatkdf_derive(
- key_material, self._length, self._hmac, self._otherinfo
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/hkdf.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/hkdf.py
deleted file mode 100644
index ee562d2f4..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/hkdf.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes, hmac
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class HKDF(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes | None,
- info: bytes | None,
- backend: typing.Any = None,
- ):
- self._algorithm = algorithm
-
- if salt is None:
- salt = b"\x00" * self._algorithm.digest_size
- else:
- utils._check_bytes("salt", salt)
-
- self._salt = salt
-
- self._hkdf_expand = HKDFExpand(self._algorithm, length, info)
-
- def _extract(self, key_material: bytes) -> bytes:
- h = hmac.HMAC(self._salt, self._algorithm)
- h.update(key_material)
- return h.finalize()
-
- def derive(self, key_material: bytes) -> bytes:
- utils._check_byteslike("key_material", key_material)
- return self._hkdf_expand.derive(self._extract(key_material))
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class HKDFExpand(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- info: bytes | None,
- backend: typing.Any = None,
- ):
- self._algorithm = algorithm
-
- max_length = 255 * algorithm.digest_size
-
- if length > max_length:
- raise ValueError(
- f"Cannot derive keys larger than {max_length} octets."
- )
-
- self._length = length
-
- if info is None:
- info = b""
- else:
- utils._check_bytes("info", info)
-
- self._info = info
-
- self._used = False
-
- def _expand(self, key_material: bytes) -> bytes:
- output = [b""]
- counter = 1
-
- while self._algorithm.digest_size * (len(output) - 1) < self._length:
- h = hmac.HMAC(key_material, self._algorithm)
- h.update(output[-1])
- h.update(self._info)
- h.update(bytes([counter]))
- output.append(h.finalize())
- counter += 1
-
- return b"".join(output)[: self._length]
-
- def derive(self, key_material: bytes) -> bytes:
- utils._check_byteslike("key_material", key_material)
- if self._used:
- raise AlreadyFinalized
-
- self._used = True
- return self._expand(key_material)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/kbkdf.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/kbkdf.py
deleted file mode 100644
index 802b484c7..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/kbkdf.py
+++ /dev/null
@@ -1,302 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import (
- AlreadyFinalized,
- InvalidKey,
- UnsupportedAlgorithm,
- _Reasons,
-)
-from cryptography.hazmat.primitives import (
- ciphers,
- cmac,
- constant_time,
- hashes,
- hmac,
-)
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class Mode(utils.Enum):
- CounterMode = "ctr"
-
-
-class CounterLocation(utils.Enum):
- BeforeFixed = "before_fixed"
- AfterFixed = "after_fixed"
- MiddleFixed = "middle_fixed"
-
-
-class _KBKDFDeriver:
- def __init__(
- self,
- prf: typing.Callable,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- break_location: int | None,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- ):
- assert callable(prf)
-
- if not isinstance(mode, Mode):
- raise TypeError("mode must be of type Mode")
-
- if not isinstance(location, CounterLocation):
- raise TypeError("location must be of type CounterLocation")
-
- if break_location is None and location is CounterLocation.MiddleFixed:
- raise ValueError("Please specify a break_location")
-
- if (
- break_location is not None
- and location != CounterLocation.MiddleFixed
- ):
- raise ValueError(
- "break_location is ignored when location is not"
- " CounterLocation.MiddleFixed"
- )
-
- if break_location is not None and not isinstance(break_location, int):
- raise TypeError("break_location must be an integer")
-
- if break_location is not None and break_location < 0:
- raise ValueError("break_location must be a positive integer")
-
- if (label or context) and fixed:
- raise ValueError(
- "When supplying fixed data, label and context are ignored."
- )
-
- if rlen is None or not self._valid_byte_length(rlen):
- raise ValueError("rlen must be between 1 and 4")
-
- if llen is None and fixed is None:
- raise ValueError("Please specify an llen")
-
- if llen is not None and not isinstance(llen, int):
- raise TypeError("llen must be an integer")
-
- if llen == 0:
- raise ValueError("llen must be non-zero")
-
- if label is None:
- label = b""
-
- if context is None:
- context = b""
-
- utils._check_bytes("label", label)
- utils._check_bytes("context", context)
- self._prf = prf
- self._mode = mode
- self._length = length
- self._rlen = rlen
- self._llen = llen
- self._location = location
- self._break_location = break_location
- self._label = label
- self._context = context
- self._used = False
- self._fixed_data = fixed
-
- @staticmethod
- def _valid_byte_length(value: int) -> bool:
- if not isinstance(value, int):
- raise TypeError("value must be of type int")
-
- value_bin = utils.int_to_bytes(1, value)
- if not 1 <= len(value_bin) <= 4:
- return False
- return True
-
- def derive(self, key_material: bytes, prf_output_size: int) -> bytes:
- if self._used:
- raise AlreadyFinalized
-
- utils._check_byteslike("key_material", key_material)
- self._used = True
-
- # inverse floor division (equivalent to ceiling)
- rounds = -(-self._length // prf_output_size)
-
- output = [b""]
-
- # For counter mode, the number of iterations shall not be
- # larger than 2^r-1, where r <= 32 is the binary length of the counter
- # This ensures that the counter values used as an input to the
- # PRF will not repeat during a particular call to the KDF function.
- r_bin = utils.int_to_bytes(1, self._rlen)
- if rounds > pow(2, len(r_bin) * 8) - 1:
- raise ValueError("There are too many iterations.")
-
- fixed = self._generate_fixed_input()
-
- if self._location == CounterLocation.BeforeFixed:
- data_before_ctr = b""
- data_after_ctr = fixed
- elif self._location == CounterLocation.AfterFixed:
- data_before_ctr = fixed
- data_after_ctr = b""
- else:
- if isinstance(
- self._break_location, int
- ) and self._break_location > len(fixed):
- raise ValueError("break_location offset > len(fixed)")
- data_before_ctr = fixed[: self._break_location]
- data_after_ctr = fixed[self._break_location :]
-
- for i in range(1, rounds + 1):
- h = self._prf(key_material)
-
- counter = utils.int_to_bytes(i, self._rlen)
- input_data = data_before_ctr + counter + data_after_ctr
-
- h.update(input_data)
-
- output.append(h.finalize())
-
- return b"".join(output)[: self._length]
-
- def _generate_fixed_input(self) -> bytes:
- if self._fixed_data and isinstance(self._fixed_data, bytes):
- return self._fixed_data
-
- l_val = utils.int_to_bytes(self._length * 8, self._llen)
-
- return b"".join([self._label, b"\x00", self._context, l_val])
-
-
-class KBKDFHMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- backend: typing.Any = None,
- *,
- break_location: int | None = None,
- ):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported hash algorithm.",
- _Reasons.UNSUPPORTED_HASH,
- )
-
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.hmac_supported(algorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported hmac algorithm.",
- _Reasons.UNSUPPORTED_HASH,
- )
-
- self._algorithm = algorithm
-
- self._deriver = _KBKDFDeriver(
- self._prf,
- mode,
- length,
- rlen,
- llen,
- location,
- break_location,
- label,
- context,
- fixed,
- )
-
- def _prf(self, key_material: bytes) -> hmac.HMAC:
- return hmac.HMAC(key_material, self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- return self._deriver.derive(key_material, self._algorithm.digest_size)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class KBKDFCMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- backend: typing.Any = None,
- *,
- break_location: int | None = None,
- ):
- if not issubclass(
- algorithm, ciphers.BlockCipherAlgorithm
- ) or not issubclass(algorithm, ciphers.CipherAlgorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported cipher algorithm.",
- _Reasons.UNSUPPORTED_CIPHER,
- )
-
- self._algorithm = algorithm
- self._cipher: ciphers.BlockCipherAlgorithm | None = None
-
- self._deriver = _KBKDFDeriver(
- self._prf,
- mode,
- length,
- rlen,
- llen,
- location,
- break_location,
- label,
- context,
- fixed,
- )
-
- def _prf(self, _: bytes) -> cmac.CMAC:
- assert self._cipher is not None
-
- return cmac.CMAC(self._cipher)
-
- def derive(self, key_material: bytes) -> bytes:
- self._cipher = self._algorithm(key_material)
-
- assert self._cipher is not None
-
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.cmac_algorithm_supported(self._cipher):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported cipher algorithm.",
- _Reasons.UNSUPPORTED_CIPHER,
- )
-
- return self._deriver.derive(key_material, self._cipher.block_size // 8)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/pbkdf2.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/pbkdf2.py
deleted file mode 100644
index 82689ebca..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/pbkdf2.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import (
- AlreadyFinalized,
- InvalidKey,
- UnsupportedAlgorithm,
- _Reasons,
-)
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import constant_time, hashes
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class PBKDF2HMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes,
- iterations: int,
- backend: typing.Any = None,
- ):
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.pbkdf2_hmac_supported(algorithm):
- raise UnsupportedAlgorithm(
- f"{algorithm.name} is not supported for PBKDF2.",
- _Reasons.UNSUPPORTED_HASH,
- )
- self._used = False
- self._algorithm = algorithm
- self._length = length
- utils._check_bytes("salt", salt)
- self._salt = salt
- self._iterations = iterations
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized("PBKDF2 instances can only be used once.")
- self._used = True
-
- return rust_openssl.kdf.derive_pbkdf2_hmac(
- key_material,
- self._algorithm,
- self._salt,
- self._iterations,
- self._length,
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- derived_key = self.derive(key_material)
- if not constant_time.bytes_eq(derived_key, expected_key):
- raise InvalidKey("Keys do not match.")
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/scrypt.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/scrypt.py
deleted file mode 100644
index f791ceea3..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/scrypt.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import sys
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-# This is used by the scrypt tests to skip tests that require more memory
-# than the MEM_LIMIT
-_MEM_LIMIT = sys.maxsize // 2
-
-Scrypt = rust_openssl.kdf.Scrypt
-KeyDerivationFunction.register(Scrypt)
-
-__all__ = ["Scrypt"]
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/x963kdf.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/x963kdf.py
deleted file mode 100644
index 6e38366a9..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/kdf/x963kdf.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-def _int_to_u32be(n: int) -> bytes:
- return n.to_bytes(length=4, byteorder="big")
-
-
-class X963KDF(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- sharedinfo: bytes | None,
- backend: typing.Any = None,
- ):
- max_len = algorithm.digest_size * (2**32 - 1)
- if length > max_len:
- raise ValueError(f"Cannot derive keys larger than {max_len} bits.")
- if sharedinfo is not None:
- utils._check_bytes("sharedinfo", sharedinfo)
-
- self._algorithm = algorithm
- self._length = length
- self._sharedinfo = sharedinfo
- self._used = False
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- utils._check_byteslike("key_material", key_material)
- output = [b""]
- outlen = 0
- counter = 1
-
- while self._length > outlen:
- h = hashes.Hash(self._algorithm)
- h.update(key_material)
- h.update(_int_to_u32be(counter))
- if self._sharedinfo is not None:
- h.update(self._sharedinfo)
- output.append(h.finalize())
- outlen += len(output[-1])
- counter += 1
-
- return b"".join(output)[: self._length]
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/keywrap.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/keywrap.py
deleted file mode 100644
index b93d87d31..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/keywrap.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.primitives.ciphers import Cipher
-from cryptography.hazmat.primitives.ciphers.algorithms import AES
-from cryptography.hazmat.primitives.ciphers.modes import ECB
-from cryptography.hazmat.primitives.constant_time import bytes_eq
-
-
-def _wrap_core(
- wrapping_key: bytes,
- a: bytes,
- r: list[bytes],
-) -> bytes:
- # RFC 3394 Key Wrap - 2.2.1 (index method)
- encryptor = Cipher(AES(wrapping_key), ECB()).encryptor()
- n = len(r)
- for j in range(6):
- for i in range(n):
- # every encryption operation is a discrete 16 byte chunk (because
- # AES has a 128-bit block size) and since we're using ECB it is
- # safe to reuse the encryptor for the entire operation
- b = encryptor.update(a + r[i])
- a = (
- int.from_bytes(b[:8], byteorder="big") ^ ((n * j) + i + 1)
- ).to_bytes(length=8, byteorder="big")
- r[i] = b[-8:]
-
- assert encryptor.finalize() == b""
-
- return a + b"".join(r)
-
-
-def aes_key_wrap(
- wrapping_key: bytes,
- key_to_wrap: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- if len(key_to_wrap) < 16:
- raise ValueError("The key to wrap must be at least 16 bytes")
-
- if len(key_to_wrap) % 8 != 0:
- raise ValueError("The key to wrap must be a multiple of 8 bytes")
-
- a = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6"
- r = [key_to_wrap[i : i + 8] for i in range(0, len(key_to_wrap), 8)]
- return _wrap_core(wrapping_key, a, r)
-
-
-def _unwrap_core(
- wrapping_key: bytes,
- a: bytes,
- r: list[bytes],
-) -> tuple[bytes, list[bytes]]:
- # Implement RFC 3394 Key Unwrap - 2.2.2 (index method)
- decryptor = Cipher(AES(wrapping_key), ECB()).decryptor()
- n = len(r)
- for j in reversed(range(6)):
- for i in reversed(range(n)):
- atr = (
- int.from_bytes(a, byteorder="big") ^ ((n * j) + i + 1)
- ).to_bytes(length=8, byteorder="big") + r[i]
- # every decryption operation is a discrete 16 byte chunk so
- # it is safe to reuse the decryptor for the entire operation
- b = decryptor.update(atr)
- a = b[:8]
- r[i] = b[-8:]
-
- assert decryptor.finalize() == b""
- return a, r
-
-
-def aes_key_wrap_with_padding(
- wrapping_key: bytes,
- key_to_wrap: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- aiv = b"\xa6\x59\x59\xa6" + len(key_to_wrap).to_bytes(
- length=4, byteorder="big"
- )
- # pad the key to wrap if necessary
- pad = (8 - (len(key_to_wrap) % 8)) % 8
- key_to_wrap = key_to_wrap + b"\x00" * pad
- if len(key_to_wrap) == 8:
- # RFC 5649 - 4.1 - exactly 8 octets after padding
- encryptor = Cipher(AES(wrapping_key), ECB()).encryptor()
- b = encryptor.update(aiv + key_to_wrap)
- assert encryptor.finalize() == b""
- return b
- else:
- r = [key_to_wrap[i : i + 8] for i in range(0, len(key_to_wrap), 8)]
- return _wrap_core(wrapping_key, aiv, r)
-
-
-def aes_key_unwrap_with_padding(
- wrapping_key: bytes,
- wrapped_key: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapped_key) < 16:
- raise InvalidUnwrap("Must be at least 16 bytes")
-
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- if len(wrapped_key) == 16:
- # RFC 5649 - 4.2 - exactly two 64-bit blocks
- decryptor = Cipher(AES(wrapping_key), ECB()).decryptor()
- out = decryptor.update(wrapped_key)
- assert decryptor.finalize() == b""
- a = out[:8]
- data = out[8:]
- n = 1
- else:
- r = [wrapped_key[i : i + 8] for i in range(0, len(wrapped_key), 8)]
- encrypted_aiv = r.pop(0)
- n = len(r)
- a, r = _unwrap_core(wrapping_key, encrypted_aiv, r)
- data = b"".join(r)
-
- # 1) Check that MSB(32,A) = A65959A6.
- # 2) Check that 8*(n-1) < LSB(32,A) <= 8*n. If so, let
- # MLI = LSB(32,A).
- # 3) Let b = (8*n)-MLI, and then check that the rightmost b octets of
- # the output data are zero.
- mli = int.from_bytes(a[4:], byteorder="big")
- b = (8 * n) - mli
- if (
- not bytes_eq(a[:4], b"\xa6\x59\x59\xa6")
- or not 8 * (n - 1) < mli <= 8 * n
- or (b != 0 and not bytes_eq(data[-b:], b"\x00" * b))
- ):
- raise InvalidUnwrap()
-
- if b == 0:
- return data
- else:
- return data[:-b]
-
-
-def aes_key_unwrap(
- wrapping_key: bytes,
- wrapped_key: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapped_key) < 24:
- raise InvalidUnwrap("Must be at least 24 bytes")
-
- if len(wrapped_key) % 8 != 0:
- raise InvalidUnwrap("The wrapped key must be a multiple of 8 bytes")
-
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- aiv = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6"
- r = [wrapped_key[i : i + 8] for i in range(0, len(wrapped_key), 8)]
- a = r.pop(0)
- a, r = _unwrap_core(wrapping_key, a, r)
- if not bytes_eq(a, aiv):
- raise InvalidUnwrap()
-
- return b"".join(r)
-
-
-class InvalidUnwrap(Exception):
- pass
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/padding.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/padding.py
deleted file mode 100644
index b2a3f1cff..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/padding.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized
-from cryptography.hazmat.bindings._rust import (
- PKCS7PaddingContext,
- PKCS7UnpaddingContext,
- check_ansix923_padding,
-)
-
-
-class PaddingContext(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def update(self, data: bytes) -> bytes:
- """
- Pads the provided bytes and returns any available data as bytes.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Finalize the padding, returns bytes.
- """
-
-
-def _byte_padding_check(block_size: int) -> None:
- if not (0 <= block_size <= 2040):
- raise ValueError("block_size must be in range(0, 2041).")
-
- if block_size % 8 != 0:
- raise ValueError("block_size must be a multiple of 8.")
-
-
-def _byte_padding_update(
- buffer_: bytes | None, data: bytes, block_size: int
-) -> tuple[bytes, bytes]:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- utils._check_byteslike("data", data)
-
- buffer_ += bytes(data)
-
- finished_blocks = len(buffer_) // (block_size // 8)
-
- result = buffer_[: finished_blocks * (block_size // 8)]
- buffer_ = buffer_[finished_blocks * (block_size // 8) :]
-
- return buffer_, result
-
-
-def _byte_padding_pad(
- buffer_: bytes | None,
- block_size: int,
- paddingfn: typing.Callable[[int], bytes],
-) -> bytes:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- pad_size = block_size // 8 - len(buffer_)
- return buffer_ + paddingfn(pad_size)
-
-
-def _byte_unpadding_update(
- buffer_: bytes | None, data: bytes, block_size: int
-) -> tuple[bytes, bytes]:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- utils._check_byteslike("data", data)
-
- buffer_ += bytes(data)
-
- finished_blocks = max(len(buffer_) // (block_size // 8) - 1, 0)
-
- result = buffer_[: finished_blocks * (block_size // 8)]
- buffer_ = buffer_[finished_blocks * (block_size // 8) :]
-
- return buffer_, result
-
-
-def _byte_unpadding_check(
- buffer_: bytes | None,
- block_size: int,
- checkfn: typing.Callable[[bytes], int],
-) -> bytes:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- if len(buffer_) != block_size // 8:
- raise ValueError("Invalid padding bytes.")
-
- valid = checkfn(buffer_)
-
- if not valid:
- raise ValueError("Invalid padding bytes.")
-
- pad_size = buffer_[-1]
- return buffer_[:-pad_size]
-
-
-class PKCS7:
- def __init__(self, block_size: int):
- _byte_padding_check(block_size)
- self.block_size = block_size
-
- def padder(self) -> PaddingContext:
- return PKCS7PaddingContext(self.block_size)
-
- def unpadder(self) -> PaddingContext:
- return PKCS7UnpaddingContext(self.block_size)
-
-
-PaddingContext.register(PKCS7PaddingContext)
-PaddingContext.register(PKCS7UnpaddingContext)
-
-
-class ANSIX923:
- def __init__(self, block_size: int):
- _byte_padding_check(block_size)
- self.block_size = block_size
-
- def padder(self) -> PaddingContext:
- return _ANSIX923PaddingContext(self.block_size)
-
- def unpadder(self) -> PaddingContext:
- return _ANSIX923UnpaddingContext(self.block_size)
-
-
-class _ANSIX923PaddingContext(PaddingContext):
- _buffer: bytes | None
-
- def __init__(self, block_size: int):
- self.block_size = block_size
- # TODO: more copies than necessary, we should use zero-buffer (#193)
- self._buffer = b""
-
- def update(self, data: bytes) -> bytes:
- self._buffer, result = _byte_padding_update(
- self._buffer, data, self.block_size
- )
- return result
-
- def _padding(self, size: int) -> bytes:
- return bytes([0]) * (size - 1) + bytes([size])
-
- def finalize(self) -> bytes:
- result = _byte_padding_pad(
- self._buffer, self.block_size, self._padding
- )
- self._buffer = None
- return result
-
-
-class _ANSIX923UnpaddingContext(PaddingContext):
- _buffer: bytes | None
-
- def __init__(self, block_size: int):
- self.block_size = block_size
- # TODO: more copies than necessary, we should use zero-buffer (#193)
- self._buffer = b""
-
- def update(self, data: bytes) -> bytes:
- self._buffer, result = _byte_unpadding_update(
- self._buffer, data, self.block_size
- )
- return result
-
- def finalize(self) -> bytes:
- result = _byte_unpadding_check(
- self._buffer,
- self.block_size,
- check_ansix923_padding,
- )
- self._buffer = None
- return result
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/poly1305.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/poly1305.py
deleted file mode 100644
index 7f5a77a57..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/poly1305.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = ["Poly1305"]
-
-Poly1305 = rust_openssl.poly1305.Poly1305
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/__init__.py
deleted file mode 100644
index 07b2264b9..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/__init__.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._serialization import (
- BestAvailableEncryption,
- Encoding,
- KeySerializationEncryption,
- NoEncryption,
- ParameterFormat,
- PrivateFormat,
- PublicFormat,
- _KeySerializationEncryption,
-)
-from cryptography.hazmat.primitives.serialization.base import (
- load_der_parameters,
- load_der_private_key,
- load_der_public_key,
- load_pem_parameters,
- load_pem_private_key,
- load_pem_public_key,
-)
-from cryptography.hazmat.primitives.serialization.ssh import (
- SSHCertificate,
- SSHCertificateBuilder,
- SSHCertificateType,
- SSHCertPrivateKeyTypes,
- SSHCertPublicKeyTypes,
- SSHPrivateKeyTypes,
- SSHPublicKeyTypes,
- load_ssh_private_key,
- load_ssh_public_identity,
- load_ssh_public_key,
-)
-
-__all__ = [
- "BestAvailableEncryption",
- "Encoding",
- "KeySerializationEncryption",
- "NoEncryption",
- "ParameterFormat",
- "PrivateFormat",
- "PublicFormat",
- "SSHCertPrivateKeyTypes",
- "SSHCertPublicKeyTypes",
- "SSHCertificate",
- "SSHCertificateBuilder",
- "SSHCertificateType",
- "SSHPrivateKeyTypes",
- "SSHPublicKeyTypes",
- "_KeySerializationEncryption",
- "load_der_parameters",
- "load_der_private_key",
- "load_der_public_key",
- "load_pem_parameters",
- "load_pem_private_key",
- "load_pem_public_key",
- "load_ssh_private_key",
- "load_ssh_public_identity",
- "load_ssh_public_key",
-]
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/base.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/base.py
deleted file mode 100644
index e7c998b7f..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/base.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-load_pem_private_key = rust_openssl.keys.load_pem_private_key
-load_der_private_key = rust_openssl.keys.load_der_private_key
-
-load_pem_public_key = rust_openssl.keys.load_pem_public_key
-load_der_public_key = rust_openssl.keys.load_der_public_key
-
-load_pem_parameters = rust_openssl.dh.from_pem_parameters
-load_der_parameters = rust_openssl.dh.from_der_parameters
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs12.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs12.py
deleted file mode 100644
index 549e1f992..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs12.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.bindings._rust import pkcs12 as rust_pkcs12
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives._serialization import PBES as PBES
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed448,
- ed25519,
- rsa,
-)
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-
-__all__ = [
- "PBES",
- "PKCS12Certificate",
- "PKCS12KeyAndCertificates",
- "PKCS12PrivateKeyTypes",
- "load_key_and_certificates",
- "load_pkcs12",
- "serialize_key_and_certificates",
-]
-
-PKCS12PrivateKeyTypes = typing.Union[
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
-]
-
-
-PKCS12Certificate = rust_pkcs12.PKCS12Certificate
-
-
-class PKCS12KeyAndCertificates:
- def __init__(
- self,
- key: PrivateKeyTypes | None,
- cert: PKCS12Certificate | None,
- additional_certs: list[PKCS12Certificate],
- ):
- if key is not None and not isinstance(
- key,
- (
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- ),
- ):
- raise TypeError(
- "Key must be RSA, DSA, EllipticCurve, ED25519, or ED448"
- " private key, or None."
- )
- if cert is not None and not isinstance(cert, PKCS12Certificate):
- raise TypeError("cert must be a PKCS12Certificate object or None")
- if not all(
- isinstance(add_cert, PKCS12Certificate)
- for add_cert in additional_certs
- ):
- raise TypeError(
- "all values in additional_certs must be PKCS12Certificate"
- " objects"
- )
- self._key = key
- self._cert = cert
- self._additional_certs = additional_certs
-
- @property
- def key(self) -> PrivateKeyTypes | None:
- return self._key
-
- @property
- def cert(self) -> PKCS12Certificate | None:
- return self._cert
-
- @property
- def additional_certs(self) -> list[PKCS12Certificate]:
- return self._additional_certs
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PKCS12KeyAndCertificates):
- return NotImplemented
-
- return (
- self.key == other.key
- and self.cert == other.cert
- and self.additional_certs == other.additional_certs
- )
-
- def __hash__(self) -> int:
- return hash((self.key, self.cert, tuple(self.additional_certs)))
-
- def __repr__(self) -> str:
- fmt = (
- ""
- )
- return fmt.format(self.key, self.cert, self.additional_certs)
-
-
-load_key_and_certificates = rust_pkcs12.load_key_and_certificates
-load_pkcs12 = rust_pkcs12.load_pkcs12
-
-
-_PKCS12CATypes = typing.Union[
- x509.Certificate,
- PKCS12Certificate,
-]
-
-
-def serialize_key_and_certificates(
- name: bytes | None,
- key: PKCS12PrivateKeyTypes | None,
- cert: x509.Certificate | None,
- cas: typing.Iterable[_PKCS12CATypes] | None,
- encryption_algorithm: serialization.KeySerializationEncryption,
-) -> bytes:
- if key is not None and not isinstance(
- key,
- (
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- ),
- ):
- raise TypeError(
- "Key must be RSA, DSA, EllipticCurve, ED25519, or ED448"
- " private key, or None."
- )
-
- if not isinstance(
- encryption_algorithm, serialization.KeySerializationEncryption
- ):
- raise TypeError(
- "Key encryption algorithm must be a "
- "KeySerializationEncryption instance"
- )
-
- if key is None and cert is None and not cas:
- raise ValueError("You must supply at least one of key, cert, or cas")
-
- return rust_pkcs12.serialize_key_and_certificates(
- name, key, cert, cas, encryption_algorithm
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs7.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs7.py
deleted file mode 100644
index 882e345f2..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/pkcs7.py
+++ /dev/null
@@ -1,369 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import email.base64mime
-import email.generator
-import email.message
-import email.policy
-import io
-import typing
-
-from cryptography import utils, x509
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import pkcs7 as rust_pkcs7
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric import ec, padding, rsa
-from cryptography.utils import _check_byteslike
-
-load_pem_pkcs7_certificates = rust_pkcs7.load_pem_pkcs7_certificates
-
-load_der_pkcs7_certificates = rust_pkcs7.load_der_pkcs7_certificates
-
-serialize_certificates = rust_pkcs7.serialize_certificates
-
-PKCS7HashTypes = typing.Union[
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
-]
-
-PKCS7PrivateKeyTypes = typing.Union[
- rsa.RSAPrivateKey, ec.EllipticCurvePrivateKey
-]
-
-
-class PKCS7Options(utils.Enum):
- Text = "Add text/plain MIME type"
- Binary = "Don't translate input data into canonical MIME format"
- DetachedSignature = "Don't embed data in the PKCS7 structure"
- NoCapabilities = "Don't embed SMIME capabilities"
- NoAttributes = "Don't embed authenticatedAttributes"
- NoCerts = "Don't embed signer certificate"
-
-
-class PKCS7SignatureBuilder:
- def __init__(
- self,
- data: bytes | None = None,
- signers: list[
- tuple[
- x509.Certificate,
- PKCS7PrivateKeyTypes,
- PKCS7HashTypes,
- padding.PSS | padding.PKCS1v15 | None,
- ]
- ] = [],
- additional_certs: list[x509.Certificate] = [],
- ):
- self._data = data
- self._signers = signers
- self._additional_certs = additional_certs
-
- def set_data(self, data: bytes) -> PKCS7SignatureBuilder:
- _check_byteslike("data", data)
- if self._data is not None:
- raise ValueError("data may only be set once")
-
- return PKCS7SignatureBuilder(data, self._signers)
-
- def add_signer(
- self,
- certificate: x509.Certificate,
- private_key: PKCS7PrivateKeyTypes,
- hash_algorithm: PKCS7HashTypes,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> PKCS7SignatureBuilder:
- if not isinstance(
- hash_algorithm,
- (
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- ),
- ):
- raise TypeError(
- "hash_algorithm must be one of hashes.SHA224, "
- "SHA256, SHA384, or SHA512"
- )
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- if not isinstance(
- private_key, (rsa.RSAPrivateKey, ec.EllipticCurvePrivateKey)
- ):
- raise TypeError("Only RSA & EC keys are supported at this time.")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return PKCS7SignatureBuilder(
- self._data,
- [
- *self._signers,
- (certificate, private_key, hash_algorithm, rsa_padding),
- ],
- )
-
- def add_certificate(
- self, certificate: x509.Certificate
- ) -> PKCS7SignatureBuilder:
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- return PKCS7SignatureBuilder(
- self._data, self._signers, [*self._additional_certs, certificate]
- )
-
- def sign(
- self,
- encoding: serialization.Encoding,
- options: typing.Iterable[PKCS7Options],
- backend: typing.Any = None,
- ) -> bytes:
- if len(self._signers) == 0:
- raise ValueError("Must have at least one signer")
- if self._data is None:
- raise ValueError("You must add data to sign")
- options = list(options)
- if not all(isinstance(x, PKCS7Options) for x in options):
- raise ValueError("options must be from the PKCS7Options enum")
- if encoding not in (
- serialization.Encoding.PEM,
- serialization.Encoding.DER,
- serialization.Encoding.SMIME,
- ):
- raise ValueError(
- "Must be PEM, DER, or SMIME from the Encoding enum"
- )
-
- # Text is a meaningless option unless it is accompanied by
- # DetachedSignature
- if (
- PKCS7Options.Text in options
- and PKCS7Options.DetachedSignature not in options
- ):
- raise ValueError(
- "When passing the Text option you must also pass "
- "DetachedSignature"
- )
-
- if PKCS7Options.Text in options and encoding in (
- serialization.Encoding.DER,
- serialization.Encoding.PEM,
- ):
- raise ValueError(
- "The Text option is only available for SMIME serialization"
- )
-
- # No attributes implies no capabilities so we'll error if you try to
- # pass both.
- if (
- PKCS7Options.NoAttributes in options
- and PKCS7Options.NoCapabilities in options
- ):
- raise ValueError(
- "NoAttributes is a superset of NoCapabilities. Do not pass "
- "both values."
- )
-
- return rust_pkcs7.sign_and_serialize(self, encoding, options)
-
-
-class PKCS7EnvelopeBuilder:
- def __init__(
- self,
- *,
- _data: bytes | None = None,
- _recipients: list[x509.Certificate] | None = None,
- ):
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.rsa_encryption_supported(padding=padding.PKCS1v15()):
- raise UnsupportedAlgorithm(
- "RSA with PKCS1 v1.5 padding is not supported by this version"
- " of OpenSSL.",
- _Reasons.UNSUPPORTED_PADDING,
- )
- self._data = _data
- self._recipients = _recipients if _recipients is not None else []
-
- def set_data(self, data: bytes) -> PKCS7EnvelopeBuilder:
- _check_byteslike("data", data)
- if self._data is not None:
- raise ValueError("data may only be set once")
-
- return PKCS7EnvelopeBuilder(_data=data, _recipients=self._recipients)
-
- def add_recipient(
- self,
- certificate: x509.Certificate,
- ) -> PKCS7EnvelopeBuilder:
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- if not isinstance(certificate.public_key(), rsa.RSAPublicKey):
- raise TypeError("Only RSA keys are supported at this time.")
-
- return PKCS7EnvelopeBuilder(
- _data=self._data,
- _recipients=[
- *self._recipients,
- certificate,
- ],
- )
-
- def encrypt(
- self,
- encoding: serialization.Encoding,
- options: typing.Iterable[PKCS7Options],
- ) -> bytes:
- if len(self._recipients) == 0:
- raise ValueError("Must have at least one recipient")
- if self._data is None:
- raise ValueError("You must add data to encrypt")
- options = list(options)
- if not all(isinstance(x, PKCS7Options) for x in options):
- raise ValueError("options must be from the PKCS7Options enum")
- if encoding not in (
- serialization.Encoding.PEM,
- serialization.Encoding.DER,
- serialization.Encoding.SMIME,
- ):
- raise ValueError(
- "Must be PEM, DER, or SMIME from the Encoding enum"
- )
-
- # Only allow options that make sense for encryption
- if any(
- opt not in [PKCS7Options.Text, PKCS7Options.Binary]
- for opt in options
- ):
- raise ValueError(
- "Only the following options are supported for encryption: "
- "Text, Binary"
- )
- elif PKCS7Options.Text in options and PKCS7Options.Binary in options:
- # OpenSSL accepts both options at the same time, but ignores Text.
- # We fail defensively to avoid unexpected outputs.
- raise ValueError(
- "Cannot use Binary and Text options at the same time"
- )
-
- return rust_pkcs7.encrypt_and_serialize(self, encoding, options)
-
-
-pkcs7_decrypt_der = rust_pkcs7.decrypt_der
-pkcs7_decrypt_pem = rust_pkcs7.decrypt_pem
-pkcs7_decrypt_smime = rust_pkcs7.decrypt_smime
-
-
-def _smime_signed_encode(
- data: bytes, signature: bytes, micalg: str, text_mode: bool
-) -> bytes:
- # This function works pretty hard to replicate what OpenSSL does
- # precisely. For good and for ill.
-
- m = email.message.Message()
- m.add_header("MIME-Version", "1.0")
- m.add_header(
- "Content-Type",
- "multipart/signed",
- protocol="application/x-pkcs7-signature",
- micalg=micalg,
- )
-
- m.preamble = "This is an S/MIME signed message\n"
-
- msg_part = OpenSSLMimePart()
- msg_part.set_payload(data)
- if text_mode:
- msg_part.add_header("Content-Type", "text/plain")
- m.attach(msg_part)
-
- sig_part = email.message.MIMEPart()
- sig_part.add_header(
- "Content-Type", "application/x-pkcs7-signature", name="smime.p7s"
- )
- sig_part.add_header("Content-Transfer-Encoding", "base64")
- sig_part.add_header(
- "Content-Disposition", "attachment", filename="smime.p7s"
- )
- sig_part.set_payload(
- email.base64mime.body_encode(signature, maxlinelen=65)
- )
- del sig_part["MIME-Version"]
- m.attach(sig_part)
-
- fp = io.BytesIO()
- g = email.generator.BytesGenerator(
- fp,
- maxheaderlen=0,
- mangle_from_=False,
- policy=m.policy.clone(linesep="\r\n"),
- )
- g.flatten(m)
- return fp.getvalue()
-
-
-def _smime_enveloped_encode(data: bytes) -> bytes:
- m = email.message.Message()
- m.add_header("MIME-Version", "1.0")
- m.add_header("Content-Disposition", "attachment", filename="smime.p7m")
- m.add_header(
- "Content-Type",
- "application/pkcs7-mime",
- smime_type="enveloped-data",
- name="smime.p7m",
- )
- m.add_header("Content-Transfer-Encoding", "base64")
-
- m.set_payload(email.base64mime.body_encode(data, maxlinelen=65))
-
- return m.as_bytes(policy=m.policy.clone(linesep="\n", max_line_length=0))
-
-
-def _smime_enveloped_decode(data: bytes) -> bytes:
- m = email.message_from_bytes(data)
- if m.get_content_type() not in {
- "application/x-pkcs7-mime",
- "application/pkcs7-mime",
- }:
- raise ValueError("Not an S/MIME enveloped message")
- return bytes(m.get_payload(decode=True))
-
-
-def _smime_remove_text_headers(data: bytes) -> bytes:
- m = email.message_from_bytes(data)
- # Using get() instead of get_content_type() since it has None as default,
- # where the latter has "text/plain". Both methods are case-insensitive.
- content_type = m.get("content-type")
- if content_type is None:
- raise ValueError(
- "Decrypted MIME data has no 'Content-Type' header. "
- "Please remove the 'Text' option to parse it manually."
- )
- if "text/plain" not in content_type:
- raise ValueError(
- f"Decrypted MIME data content type is '{content_type}', not "
- "'text/plain'. Remove the 'Text' option to parse it manually."
- )
- return bytes(m.get_payload(decode=True))
-
-
-class OpenSSLMimePart(email.message.MIMEPart):
- # A MIMEPart subclass that replicates OpenSSL's behavior of not including
- # a newline if there are no headers.
- def _write_headers(self, generator) -> None:
- if list(self.raw_items()):
- generator._write_headers(self)
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/ssh.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/ssh.py
deleted file mode 100644
index c01afb0cc..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/serialization/ssh.py
+++ /dev/null
@@ -1,1569 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import binascii
-import enum
-import os
-import re
-import typing
-import warnings
-from base64 import encodebytes as _base64_encode
-from dataclasses import dataclass
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed25519,
- padding,
- rsa,
-)
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-from cryptography.hazmat.primitives.ciphers import (
- AEADDecryptionContext,
- Cipher,
- algorithms,
- modes,
-)
-from cryptography.hazmat.primitives.serialization import (
- Encoding,
- KeySerializationEncryption,
- NoEncryption,
- PrivateFormat,
- PublicFormat,
- _KeySerializationEncryption,
-)
-
-try:
- from bcrypt import kdf as _bcrypt_kdf
-
- _bcrypt_supported = True
-except ImportError:
- _bcrypt_supported = False
-
- def _bcrypt_kdf(
- password: bytes,
- salt: bytes,
- desired_key_bytes: int,
- rounds: int,
- ignore_few_rounds: bool = False,
- ) -> bytes:
- raise UnsupportedAlgorithm("Need bcrypt module")
-
-
-_SSH_ED25519 = b"ssh-ed25519"
-_SSH_RSA = b"ssh-rsa"
-_SSH_DSA = b"ssh-dss"
-_ECDSA_NISTP256 = b"ecdsa-sha2-nistp256"
-_ECDSA_NISTP384 = b"ecdsa-sha2-nistp384"
-_ECDSA_NISTP521 = b"ecdsa-sha2-nistp521"
-_CERT_SUFFIX = b"-cert-v01@openssh.com"
-
-# U2F application string suffixed pubkey
-_SK_SSH_ED25519 = b"sk-ssh-ed25519@openssh.com"
-_SK_SSH_ECDSA_NISTP256 = b"sk-ecdsa-sha2-nistp256@openssh.com"
-
-# These are not key types, only algorithms, so they cannot appear
-# as a public key type
-_SSH_RSA_SHA256 = b"rsa-sha2-256"
-_SSH_RSA_SHA512 = b"rsa-sha2-512"
-
-_SSH_PUBKEY_RC = re.compile(rb"\A(\S+)[ \t]+(\S+)")
-_SK_MAGIC = b"openssh-key-v1\0"
-_SK_START = b"-----BEGIN OPENSSH PRIVATE KEY-----"
-_SK_END = b"-----END OPENSSH PRIVATE KEY-----"
-_BCRYPT = b"bcrypt"
-_NONE = b"none"
-_DEFAULT_CIPHER = b"aes256-ctr"
-_DEFAULT_ROUNDS = 16
-
-# re is only way to work on bytes-like data
-_PEM_RC = re.compile(_SK_START + b"(.*?)" + _SK_END, re.DOTALL)
-
-# padding for max blocksize
-_PADDING = memoryview(bytearray(range(1, 1 + 16)))
-
-
-@dataclass
-class _SSHCipher:
- alg: type[algorithms.AES]
- key_len: int
- mode: type[modes.CTR] | type[modes.CBC] | type[modes.GCM]
- block_len: int
- iv_len: int
- tag_len: int | None
- is_aead: bool
-
-
-# ciphers that are actually used in key wrapping
-_SSH_CIPHERS: dict[bytes, _SSHCipher] = {
- b"aes256-ctr": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.CTR,
- block_len=16,
- iv_len=16,
- tag_len=None,
- is_aead=False,
- ),
- b"aes256-cbc": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.CBC,
- block_len=16,
- iv_len=16,
- tag_len=None,
- is_aead=False,
- ),
- b"aes256-gcm@openssh.com": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.GCM,
- block_len=16,
- iv_len=12,
- tag_len=16,
- is_aead=True,
- ),
-}
-
-# map local curve name to key type
-_ECDSA_KEY_TYPE = {
- "secp256r1": _ECDSA_NISTP256,
- "secp384r1": _ECDSA_NISTP384,
- "secp521r1": _ECDSA_NISTP521,
-}
-
-
-def _get_ssh_key_type(key: SSHPrivateKeyTypes | SSHPublicKeyTypes) -> bytes:
- if isinstance(key, ec.EllipticCurvePrivateKey):
- key_type = _ecdsa_key_type(key.public_key())
- elif isinstance(key, ec.EllipticCurvePublicKey):
- key_type = _ecdsa_key_type(key)
- elif isinstance(key, (rsa.RSAPrivateKey, rsa.RSAPublicKey)):
- key_type = _SSH_RSA
- elif isinstance(key, (dsa.DSAPrivateKey, dsa.DSAPublicKey)):
- key_type = _SSH_DSA
- elif isinstance(
- key, (ed25519.Ed25519PrivateKey, ed25519.Ed25519PublicKey)
- ):
- key_type = _SSH_ED25519
- else:
- raise ValueError("Unsupported key type")
-
- return key_type
-
-
-def _ecdsa_key_type(public_key: ec.EllipticCurvePublicKey) -> bytes:
- """Return SSH key_type and curve_name for private key."""
- curve = public_key.curve
- if curve.name not in _ECDSA_KEY_TYPE:
- raise ValueError(
- f"Unsupported curve for ssh private key: {curve.name!r}"
- )
- return _ECDSA_KEY_TYPE[curve.name]
-
-
-def _ssh_pem_encode(
- data: bytes,
- prefix: bytes = _SK_START + b"\n",
- suffix: bytes = _SK_END + b"\n",
-) -> bytes:
- return b"".join([prefix, _base64_encode(data), suffix])
-
-
-def _check_block_size(data: bytes, block_len: int) -> None:
- """Require data to be full blocks"""
- if not data or len(data) % block_len != 0:
- raise ValueError("Corrupt data: missing padding")
-
-
-def _check_empty(data: bytes) -> None:
- """All data should have been parsed."""
- if data:
- raise ValueError("Corrupt data: unparsed data")
-
-
-def _init_cipher(
- ciphername: bytes,
- password: bytes | None,
- salt: bytes,
- rounds: int,
-) -> Cipher[modes.CBC | modes.CTR | modes.GCM]:
- """Generate key + iv and return cipher."""
- if not password:
- raise ValueError("Key is password-protected.")
-
- ciph = _SSH_CIPHERS[ciphername]
- seed = _bcrypt_kdf(
- password, salt, ciph.key_len + ciph.iv_len, rounds, True
- )
- return Cipher(
- ciph.alg(seed[: ciph.key_len]),
- ciph.mode(seed[ciph.key_len :]),
- )
-
-
-def _get_u32(data: memoryview) -> tuple[int, memoryview]:
- """Uint32"""
- if len(data) < 4:
- raise ValueError("Invalid data")
- return int.from_bytes(data[:4], byteorder="big"), data[4:]
-
-
-def _get_u64(data: memoryview) -> tuple[int, memoryview]:
- """Uint64"""
- if len(data) < 8:
- raise ValueError("Invalid data")
- return int.from_bytes(data[:8], byteorder="big"), data[8:]
-
-
-def _get_sshstr(data: memoryview) -> tuple[memoryview, memoryview]:
- """Bytes with u32 length prefix"""
- n, data = _get_u32(data)
- if n > len(data):
- raise ValueError("Invalid data")
- return data[:n], data[n:]
-
-
-def _get_mpint(data: memoryview) -> tuple[int, memoryview]:
- """Big integer."""
- val, data = _get_sshstr(data)
- if val and val[0] > 0x7F:
- raise ValueError("Invalid data")
- return int.from_bytes(val, "big"), data
-
-
-def _to_mpint(val: int) -> bytes:
- """Storage format for signed bigint."""
- if val < 0:
- raise ValueError("negative mpint not allowed")
- if not val:
- return b""
- nbytes = (val.bit_length() + 8) // 8
- return utils.int_to_bytes(val, nbytes)
-
-
-class _FragList:
- """Build recursive structure without data copy."""
-
- flist: list[bytes]
-
- def __init__(self, init: list[bytes] | None = None) -> None:
- self.flist = []
- if init:
- self.flist.extend(init)
-
- def put_raw(self, val: bytes) -> None:
- """Add plain bytes"""
- self.flist.append(val)
-
- def put_u32(self, val: int) -> None:
- """Big-endian uint32"""
- self.flist.append(val.to_bytes(length=4, byteorder="big"))
-
- def put_u64(self, val: int) -> None:
- """Big-endian uint64"""
- self.flist.append(val.to_bytes(length=8, byteorder="big"))
-
- def put_sshstr(self, val: bytes | _FragList) -> None:
- """Bytes prefixed with u32 length"""
- if isinstance(val, (bytes, memoryview, bytearray)):
- self.put_u32(len(val))
- self.flist.append(val)
- else:
- self.put_u32(val.size())
- self.flist.extend(val.flist)
-
- def put_mpint(self, val: int) -> None:
- """Big-endian bigint prefixed with u32 length"""
- self.put_sshstr(_to_mpint(val))
-
- def size(self) -> int:
- """Current number of bytes"""
- return sum(map(len, self.flist))
-
- def render(self, dstbuf: memoryview, pos: int = 0) -> int:
- """Write into bytearray"""
- for frag in self.flist:
- flen = len(frag)
- start, pos = pos, pos + flen
- dstbuf[start:pos] = frag
- return pos
-
- def tobytes(self) -> bytes:
- """Return as bytes"""
- buf = memoryview(bytearray(self.size()))
- self.render(buf)
- return buf.tobytes()
-
-
-class _SSHFormatRSA:
- """Format for RSA keys.
-
- Public:
- mpint e, n
- Private:
- mpint n, e, d, iqmp, p, q
- """
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[int, int], memoryview]:
- """RSA public fields"""
- e, data = _get_mpint(data)
- n, data = _get_mpint(data)
- return (e, n), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[rsa.RSAPublicKey, memoryview]:
- """Make RSA public key from data."""
- (e, n), data = self.get_public(data)
- public_numbers = rsa.RSAPublicNumbers(e, n)
- public_key = public_numbers.public_key()
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[rsa.RSAPrivateKey, memoryview]:
- """Make RSA private key from data."""
- n, data = _get_mpint(data)
- e, data = _get_mpint(data)
- d, data = _get_mpint(data)
- iqmp, data = _get_mpint(data)
- p, data = _get_mpint(data)
- q, data = _get_mpint(data)
-
- if (e, n) != pubfields:
- raise ValueError("Corrupt data: rsa field mismatch")
- dmp1 = rsa.rsa_crt_dmp1(d, p)
- dmq1 = rsa.rsa_crt_dmq1(d, q)
- public_numbers = rsa.RSAPublicNumbers(e, n)
- private_numbers = rsa.RSAPrivateNumbers(
- p, q, d, dmp1, dmq1, iqmp, public_numbers
- )
- private_key = private_numbers.private_key()
- return private_key, data
-
- def encode_public(
- self, public_key: rsa.RSAPublicKey, f_pub: _FragList
- ) -> None:
- """Write RSA public key"""
- pubn = public_key.public_numbers()
- f_pub.put_mpint(pubn.e)
- f_pub.put_mpint(pubn.n)
-
- def encode_private(
- self, private_key: rsa.RSAPrivateKey, f_priv: _FragList
- ) -> None:
- """Write RSA private key"""
- private_numbers = private_key.private_numbers()
- public_numbers = private_numbers.public_numbers
-
- f_priv.put_mpint(public_numbers.n)
- f_priv.put_mpint(public_numbers.e)
-
- f_priv.put_mpint(private_numbers.d)
- f_priv.put_mpint(private_numbers.iqmp)
- f_priv.put_mpint(private_numbers.p)
- f_priv.put_mpint(private_numbers.q)
-
-
-class _SSHFormatDSA:
- """Format for DSA keys.
-
- Public:
- mpint p, q, g, y
- Private:
- mpint p, q, g, y, x
- """
-
- def get_public(self, data: memoryview) -> tuple[tuple, memoryview]:
- """DSA public fields"""
- p, data = _get_mpint(data)
- q, data = _get_mpint(data)
- g, data = _get_mpint(data)
- y, data = _get_mpint(data)
- return (p, q, g, y), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[dsa.DSAPublicKey, memoryview]:
- """Make DSA public key from data."""
- (p, q, g, y), data = self.get_public(data)
- parameter_numbers = dsa.DSAParameterNumbers(p, q, g)
- public_numbers = dsa.DSAPublicNumbers(y, parameter_numbers)
- self._validate(public_numbers)
- public_key = public_numbers.public_key()
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[dsa.DSAPrivateKey, memoryview]:
- """Make DSA private key from data."""
- (p, q, g, y), data = self.get_public(data)
- x, data = _get_mpint(data)
-
- if (p, q, g, y) != pubfields:
- raise ValueError("Corrupt data: dsa field mismatch")
- parameter_numbers = dsa.DSAParameterNumbers(p, q, g)
- public_numbers = dsa.DSAPublicNumbers(y, parameter_numbers)
- self._validate(public_numbers)
- private_numbers = dsa.DSAPrivateNumbers(x, public_numbers)
- private_key = private_numbers.private_key()
- return private_key, data
-
- def encode_public(
- self, public_key: dsa.DSAPublicKey, f_pub: _FragList
- ) -> None:
- """Write DSA public key"""
- public_numbers = public_key.public_numbers()
- parameter_numbers = public_numbers.parameter_numbers
- self._validate(public_numbers)
-
- f_pub.put_mpint(parameter_numbers.p)
- f_pub.put_mpint(parameter_numbers.q)
- f_pub.put_mpint(parameter_numbers.g)
- f_pub.put_mpint(public_numbers.y)
-
- def encode_private(
- self, private_key: dsa.DSAPrivateKey, f_priv: _FragList
- ) -> None:
- """Write DSA private key"""
- self.encode_public(private_key.public_key(), f_priv)
- f_priv.put_mpint(private_key.private_numbers().x)
-
- def _validate(self, public_numbers: dsa.DSAPublicNumbers) -> None:
- parameter_numbers = public_numbers.parameter_numbers
- if parameter_numbers.p.bit_length() != 1024:
- raise ValueError("SSH supports only 1024 bit DSA keys")
-
-
-class _SSHFormatECDSA:
- """Format for ECDSA keys.
-
- Public:
- str curve
- bytes point
- Private:
- str curve
- bytes point
- mpint secret
- """
-
- def __init__(self, ssh_curve_name: bytes, curve: ec.EllipticCurve):
- self.ssh_curve_name = ssh_curve_name
- self.curve = curve
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[memoryview, memoryview], memoryview]:
- """ECDSA public fields"""
- curve, data = _get_sshstr(data)
- point, data = _get_sshstr(data)
- if curve != self.ssh_curve_name:
- raise ValueError("Curve name mismatch")
- if point[0] != 4:
- raise NotImplementedError("Need uncompressed point")
- return (curve, point), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ec.EllipticCurvePublicKey, memoryview]:
- """Make ECDSA public key from data."""
- (_, point), data = self.get_public(data)
- public_key = ec.EllipticCurvePublicKey.from_encoded_point(
- self.curve, point.tobytes()
- )
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[ec.EllipticCurvePrivateKey, memoryview]:
- """Make ECDSA private key from data."""
- (curve_name, point), data = self.get_public(data)
- secret, data = _get_mpint(data)
-
- if (curve_name, point) != pubfields:
- raise ValueError("Corrupt data: ecdsa field mismatch")
- private_key = ec.derive_private_key(secret, self.curve)
- return private_key, data
-
- def encode_public(
- self, public_key: ec.EllipticCurvePublicKey, f_pub: _FragList
- ) -> None:
- """Write ECDSA public key"""
- point = public_key.public_bytes(
- Encoding.X962, PublicFormat.UncompressedPoint
- )
- f_pub.put_sshstr(self.ssh_curve_name)
- f_pub.put_sshstr(point)
-
- def encode_private(
- self, private_key: ec.EllipticCurvePrivateKey, f_priv: _FragList
- ) -> None:
- """Write ECDSA private key"""
- public_key = private_key.public_key()
- private_numbers = private_key.private_numbers()
-
- self.encode_public(public_key, f_priv)
- f_priv.put_mpint(private_numbers.private_value)
-
-
-class _SSHFormatEd25519:
- """Format for Ed25519 keys.
-
- Public:
- bytes point
- Private:
- bytes point
- bytes secret_and_point
- """
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[memoryview], memoryview]:
- """Ed25519 public fields"""
- point, data = _get_sshstr(data)
- return (point,), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ed25519.Ed25519PublicKey, memoryview]:
- """Make Ed25519 public key from data."""
- (point,), data = self.get_public(data)
- public_key = ed25519.Ed25519PublicKey.from_public_bytes(
- point.tobytes()
- )
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[ed25519.Ed25519PrivateKey, memoryview]:
- """Make Ed25519 private key from data."""
- (point,), data = self.get_public(data)
- keypair, data = _get_sshstr(data)
-
- secret = keypair[:32]
- point2 = keypair[32:]
- if point != point2 or (point,) != pubfields:
- raise ValueError("Corrupt data: ed25519 field mismatch")
- private_key = ed25519.Ed25519PrivateKey.from_private_bytes(secret)
- return private_key, data
-
- def encode_public(
- self, public_key: ed25519.Ed25519PublicKey, f_pub: _FragList
- ) -> None:
- """Write Ed25519 public key"""
- raw_public_key = public_key.public_bytes(
- Encoding.Raw, PublicFormat.Raw
- )
- f_pub.put_sshstr(raw_public_key)
-
- def encode_private(
- self, private_key: ed25519.Ed25519PrivateKey, f_priv: _FragList
- ) -> None:
- """Write Ed25519 private key"""
- public_key = private_key.public_key()
- raw_private_key = private_key.private_bytes(
- Encoding.Raw, PrivateFormat.Raw, NoEncryption()
- )
- raw_public_key = public_key.public_bytes(
- Encoding.Raw, PublicFormat.Raw
- )
- f_keypair = _FragList([raw_private_key, raw_public_key])
-
- self.encode_public(public_key, f_priv)
- f_priv.put_sshstr(f_keypair)
-
-
-def load_application(data) -> tuple[memoryview, memoryview]:
- """
- U2F application strings
- """
- application, data = _get_sshstr(data)
- if not application.tobytes().startswith(b"ssh:"):
- raise ValueError(
- "U2F application string does not start with b'ssh:' "
- f"({application})"
- )
- return application, data
-
-
-class _SSHFormatSKEd25519:
- """
- The format of a sk-ssh-ed25519@openssh.com public key is:
-
- string "sk-ssh-ed25519@openssh.com"
- string public key
- string application (user-specified, but typically "ssh:")
- """
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ed25519.Ed25519PublicKey, memoryview]:
- """Make Ed25519 public key from data."""
- public_key, data = _lookup_kformat(_SSH_ED25519).load_public(data)
- _, data = load_application(data)
- return public_key, data
-
-
-class _SSHFormatSKECDSA:
- """
- The format of a sk-ecdsa-sha2-nistp256@openssh.com public key is:
-
- string "sk-ecdsa-sha2-nistp256@openssh.com"
- string curve name
- ec_point Q
- string application (user-specified, but typically "ssh:")
- """
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ec.EllipticCurvePublicKey, memoryview]:
- """Make ECDSA public key from data."""
- public_key, data = _lookup_kformat(_ECDSA_NISTP256).load_public(data)
- _, data = load_application(data)
- return public_key, data
-
-
-_KEY_FORMATS = {
- _SSH_RSA: _SSHFormatRSA(),
- _SSH_DSA: _SSHFormatDSA(),
- _SSH_ED25519: _SSHFormatEd25519(),
- _ECDSA_NISTP256: _SSHFormatECDSA(b"nistp256", ec.SECP256R1()),
- _ECDSA_NISTP384: _SSHFormatECDSA(b"nistp384", ec.SECP384R1()),
- _ECDSA_NISTP521: _SSHFormatECDSA(b"nistp521", ec.SECP521R1()),
- _SK_SSH_ED25519: _SSHFormatSKEd25519(),
- _SK_SSH_ECDSA_NISTP256: _SSHFormatSKECDSA(),
-}
-
-
-def _lookup_kformat(key_type: bytes):
- """Return valid format or throw error"""
- if not isinstance(key_type, bytes):
- key_type = memoryview(key_type).tobytes()
- if key_type in _KEY_FORMATS:
- return _KEY_FORMATS[key_type]
- raise UnsupportedAlgorithm(f"Unsupported key type: {key_type!r}")
-
-
-SSHPrivateKeyTypes = typing.Union[
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ed25519.Ed25519PrivateKey,
-]
-
-
-def load_ssh_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> SSHPrivateKeyTypes:
- """Load private key from OpenSSH custom encoding."""
- utils._check_byteslike("data", data)
- if password is not None:
- utils._check_bytes("password", password)
-
- m = _PEM_RC.search(data)
- if not m:
- raise ValueError("Not OpenSSH private key format")
- p1 = m.start(1)
- p2 = m.end(1)
- data = binascii.a2b_base64(memoryview(data)[p1:p2])
- if not data.startswith(_SK_MAGIC):
- raise ValueError("Not OpenSSH private key format")
- data = memoryview(data)[len(_SK_MAGIC) :]
-
- # parse header
- ciphername, data = _get_sshstr(data)
- kdfname, data = _get_sshstr(data)
- kdfoptions, data = _get_sshstr(data)
- nkeys, data = _get_u32(data)
- if nkeys != 1:
- raise ValueError("Only one key supported")
-
- # load public key data
- pubdata, data = _get_sshstr(data)
- pub_key_type, pubdata = _get_sshstr(pubdata)
- kformat = _lookup_kformat(pub_key_type)
- pubfields, pubdata = kformat.get_public(pubdata)
- _check_empty(pubdata)
-
- if (ciphername, kdfname) != (_NONE, _NONE):
- ciphername_bytes = ciphername.tobytes()
- if ciphername_bytes not in _SSH_CIPHERS:
- raise UnsupportedAlgorithm(
- f"Unsupported cipher: {ciphername_bytes!r}"
- )
- if kdfname != _BCRYPT:
- raise UnsupportedAlgorithm(f"Unsupported KDF: {kdfname!r}")
- blklen = _SSH_CIPHERS[ciphername_bytes].block_len
- tag_len = _SSH_CIPHERS[ciphername_bytes].tag_len
- # load secret data
- edata, data = _get_sshstr(data)
- # see https://bugzilla.mindrot.org/show_bug.cgi?id=3553 for
- # information about how OpenSSH handles AEAD tags
- if _SSH_CIPHERS[ciphername_bytes].is_aead:
- tag = bytes(data)
- if len(tag) != tag_len:
- raise ValueError("Corrupt data: invalid tag length for cipher")
- else:
- _check_empty(data)
- _check_block_size(edata, blklen)
- salt, kbuf = _get_sshstr(kdfoptions)
- rounds, kbuf = _get_u32(kbuf)
- _check_empty(kbuf)
- ciph = _init_cipher(ciphername_bytes, password, salt.tobytes(), rounds)
- dec = ciph.decryptor()
- edata = memoryview(dec.update(edata))
- if _SSH_CIPHERS[ciphername_bytes].is_aead:
- assert isinstance(dec, AEADDecryptionContext)
- _check_empty(dec.finalize_with_tag(tag))
- else:
- # _check_block_size requires data to be a full block so there
- # should be no output from finalize
- _check_empty(dec.finalize())
- else:
- # load secret data
- edata, data = _get_sshstr(data)
- _check_empty(data)
- blklen = 8
- _check_block_size(edata, blklen)
- ck1, edata = _get_u32(edata)
- ck2, edata = _get_u32(edata)
- if ck1 != ck2:
- raise ValueError("Corrupt data: broken checksum")
-
- # load per-key struct
- key_type, edata = _get_sshstr(edata)
- if key_type != pub_key_type:
- raise ValueError("Corrupt data: key type mismatch")
- private_key, edata = kformat.load_private(edata, pubfields)
- # We don't use the comment
- _, edata = _get_sshstr(edata)
-
- # yes, SSH does padding check *after* all other parsing is done.
- # need to follow as it writes zero-byte padding too.
- if edata != _PADDING[: len(edata)]:
- raise ValueError("Corrupt data: invalid padding")
-
- if isinstance(private_key, dsa.DSAPrivateKey):
- warnings.warn(
- "SSH DSA keys are deprecated and will be removed in a future "
- "release.",
- utils.DeprecatedIn40,
- stacklevel=2,
- )
-
- return private_key
-
-
-def _serialize_ssh_private_key(
- private_key: SSHPrivateKeyTypes,
- password: bytes,
- encryption_algorithm: KeySerializationEncryption,
-) -> bytes:
- """Serialize private key with OpenSSH custom encoding."""
- utils._check_bytes("password", password)
- if isinstance(private_key, dsa.DSAPrivateKey):
- warnings.warn(
- "SSH DSA key support is deprecated and will be "
- "removed in a future release",
- utils.DeprecatedIn40,
- stacklevel=4,
- )
-
- key_type = _get_ssh_key_type(private_key)
- kformat = _lookup_kformat(key_type)
-
- # setup parameters
- f_kdfoptions = _FragList()
- if password:
- ciphername = _DEFAULT_CIPHER
- blklen = _SSH_CIPHERS[ciphername].block_len
- kdfname = _BCRYPT
- rounds = _DEFAULT_ROUNDS
- if (
- isinstance(encryption_algorithm, _KeySerializationEncryption)
- and encryption_algorithm._kdf_rounds is not None
- ):
- rounds = encryption_algorithm._kdf_rounds
- salt = os.urandom(16)
- f_kdfoptions.put_sshstr(salt)
- f_kdfoptions.put_u32(rounds)
- ciph = _init_cipher(ciphername, password, salt, rounds)
- else:
- ciphername = kdfname = _NONE
- blklen = 8
- ciph = None
- nkeys = 1
- checkval = os.urandom(4)
- comment = b""
-
- # encode public and private parts together
- f_public_key = _FragList()
- f_public_key.put_sshstr(key_type)
- kformat.encode_public(private_key.public_key(), f_public_key)
-
- f_secrets = _FragList([checkval, checkval])
- f_secrets.put_sshstr(key_type)
- kformat.encode_private(private_key, f_secrets)
- f_secrets.put_sshstr(comment)
- f_secrets.put_raw(_PADDING[: blklen - (f_secrets.size() % blklen)])
-
- # top-level structure
- f_main = _FragList()
- f_main.put_raw(_SK_MAGIC)
- f_main.put_sshstr(ciphername)
- f_main.put_sshstr(kdfname)
- f_main.put_sshstr(f_kdfoptions)
- f_main.put_u32(nkeys)
- f_main.put_sshstr(f_public_key)
- f_main.put_sshstr(f_secrets)
-
- # copy result info bytearray
- slen = f_secrets.size()
- mlen = f_main.size()
- buf = memoryview(bytearray(mlen + blklen))
- f_main.render(buf)
- ofs = mlen - slen
-
- # encrypt in-place
- if ciph is not None:
- ciph.encryptor().update_into(buf[ofs:mlen], buf[ofs:])
-
- return _ssh_pem_encode(buf[:mlen])
-
-
-SSHPublicKeyTypes = typing.Union[
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- dsa.DSAPublicKey,
- ed25519.Ed25519PublicKey,
-]
-
-SSHCertPublicKeyTypes = typing.Union[
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- ed25519.Ed25519PublicKey,
-]
-
-
-class SSHCertificateType(enum.Enum):
- USER = 1
- HOST = 2
-
-
-class SSHCertificate:
- def __init__(
- self,
- _nonce: memoryview,
- _public_key: SSHPublicKeyTypes,
- _serial: int,
- _cctype: int,
- _key_id: memoryview,
- _valid_principals: list[bytes],
- _valid_after: int,
- _valid_before: int,
- _critical_options: dict[bytes, bytes],
- _extensions: dict[bytes, bytes],
- _sig_type: memoryview,
- _sig_key: memoryview,
- _inner_sig_type: memoryview,
- _signature: memoryview,
- _tbs_cert_body: memoryview,
- _cert_key_type: bytes,
- _cert_body: memoryview,
- ):
- self._nonce = _nonce
- self._public_key = _public_key
- self._serial = _serial
- try:
- self._type = SSHCertificateType(_cctype)
- except ValueError:
- raise ValueError("Invalid certificate type")
- self._key_id = _key_id
- self._valid_principals = _valid_principals
- self._valid_after = _valid_after
- self._valid_before = _valid_before
- self._critical_options = _critical_options
- self._extensions = _extensions
- self._sig_type = _sig_type
- self._sig_key = _sig_key
- self._inner_sig_type = _inner_sig_type
- self._signature = _signature
- self._cert_key_type = _cert_key_type
- self._cert_body = _cert_body
- self._tbs_cert_body = _tbs_cert_body
-
- @property
- def nonce(self) -> bytes:
- return bytes(self._nonce)
-
- def public_key(self) -> SSHCertPublicKeyTypes:
- # make mypy happy until we remove DSA support entirely and
- # the underlying union won't have a disallowed type
- return typing.cast(SSHCertPublicKeyTypes, self._public_key)
-
- @property
- def serial(self) -> int:
- return self._serial
-
- @property
- def type(self) -> SSHCertificateType:
- return self._type
-
- @property
- def key_id(self) -> bytes:
- return bytes(self._key_id)
-
- @property
- def valid_principals(self) -> list[bytes]:
- return self._valid_principals
-
- @property
- def valid_before(self) -> int:
- return self._valid_before
-
- @property
- def valid_after(self) -> int:
- return self._valid_after
-
- @property
- def critical_options(self) -> dict[bytes, bytes]:
- return self._critical_options
-
- @property
- def extensions(self) -> dict[bytes, bytes]:
- return self._extensions
-
- def signature_key(self) -> SSHCertPublicKeyTypes:
- sigformat = _lookup_kformat(self._sig_type)
- signature_key, sigkey_rest = sigformat.load_public(self._sig_key)
- _check_empty(sigkey_rest)
- return signature_key
-
- def public_bytes(self) -> bytes:
- return (
- bytes(self._cert_key_type)
- + b" "
- + binascii.b2a_base64(bytes(self._cert_body), newline=False)
- )
-
- def verify_cert_signature(self) -> None:
- signature_key = self.signature_key()
- if isinstance(signature_key, ed25519.Ed25519PublicKey):
- signature_key.verify(
- bytes(self._signature), bytes(self._tbs_cert_body)
- )
- elif isinstance(signature_key, ec.EllipticCurvePublicKey):
- # The signature is encoded as a pair of big-endian integers
- r, data = _get_mpint(self._signature)
- s, data = _get_mpint(data)
- _check_empty(data)
- computed_sig = asym_utils.encode_dss_signature(r, s)
- hash_alg = _get_ec_hash_alg(signature_key.curve)
- signature_key.verify(
- computed_sig, bytes(self._tbs_cert_body), ec.ECDSA(hash_alg)
- )
- else:
- assert isinstance(signature_key, rsa.RSAPublicKey)
- if self._inner_sig_type == _SSH_RSA:
- hash_alg = hashes.SHA1()
- elif self._inner_sig_type == _SSH_RSA_SHA256:
- hash_alg = hashes.SHA256()
- else:
- assert self._inner_sig_type == _SSH_RSA_SHA512
- hash_alg = hashes.SHA512()
- signature_key.verify(
- bytes(self._signature),
- bytes(self._tbs_cert_body),
- padding.PKCS1v15(),
- hash_alg,
- )
-
-
-def _get_ec_hash_alg(curve: ec.EllipticCurve) -> hashes.HashAlgorithm:
- if isinstance(curve, ec.SECP256R1):
- return hashes.SHA256()
- elif isinstance(curve, ec.SECP384R1):
- return hashes.SHA384()
- else:
- assert isinstance(curve, ec.SECP521R1)
- return hashes.SHA512()
-
-
-def _load_ssh_public_identity(
- data: bytes,
- _legacy_dsa_allowed=False,
-) -> SSHCertificate | SSHPublicKeyTypes:
- utils._check_byteslike("data", data)
-
- m = _SSH_PUBKEY_RC.match(data)
- if not m:
- raise ValueError("Invalid line format")
- key_type = orig_key_type = m.group(1)
- key_body = m.group(2)
- with_cert = False
- if key_type.endswith(_CERT_SUFFIX):
- with_cert = True
- key_type = key_type[: -len(_CERT_SUFFIX)]
- if key_type == _SSH_DSA and not _legacy_dsa_allowed:
- raise UnsupportedAlgorithm(
- "DSA keys aren't supported in SSH certificates"
- )
- kformat = _lookup_kformat(key_type)
-
- try:
- rest = memoryview(binascii.a2b_base64(key_body))
- except (TypeError, binascii.Error):
- raise ValueError("Invalid format")
-
- if with_cert:
- cert_body = rest
- inner_key_type, rest = _get_sshstr(rest)
- if inner_key_type != orig_key_type:
- raise ValueError("Invalid key format")
- if with_cert:
- nonce, rest = _get_sshstr(rest)
- public_key, rest = kformat.load_public(rest)
- if with_cert:
- serial, rest = _get_u64(rest)
- cctype, rest = _get_u32(rest)
- key_id, rest = _get_sshstr(rest)
- principals, rest = _get_sshstr(rest)
- valid_principals = []
- while principals:
- principal, principals = _get_sshstr(principals)
- valid_principals.append(bytes(principal))
- valid_after, rest = _get_u64(rest)
- valid_before, rest = _get_u64(rest)
- crit_options, rest = _get_sshstr(rest)
- critical_options = _parse_exts_opts(crit_options)
- exts, rest = _get_sshstr(rest)
- extensions = _parse_exts_opts(exts)
- # Get the reserved field, which is unused.
- _, rest = _get_sshstr(rest)
- sig_key_raw, rest = _get_sshstr(rest)
- sig_type, sig_key = _get_sshstr(sig_key_raw)
- if sig_type == _SSH_DSA and not _legacy_dsa_allowed:
- raise UnsupportedAlgorithm(
- "DSA signatures aren't supported in SSH certificates"
- )
- # Get the entire cert body and subtract the signature
- tbs_cert_body = cert_body[: -len(rest)]
- signature_raw, rest = _get_sshstr(rest)
- _check_empty(rest)
- inner_sig_type, sig_rest = _get_sshstr(signature_raw)
- # RSA certs can have multiple algorithm types
- if (
- sig_type == _SSH_RSA
- and inner_sig_type
- not in [_SSH_RSA_SHA256, _SSH_RSA_SHA512, _SSH_RSA]
- ) or (sig_type != _SSH_RSA and inner_sig_type != sig_type):
- raise ValueError("Signature key type does not match")
- signature, sig_rest = _get_sshstr(sig_rest)
- _check_empty(sig_rest)
- return SSHCertificate(
- nonce,
- public_key,
- serial,
- cctype,
- key_id,
- valid_principals,
- valid_after,
- valid_before,
- critical_options,
- extensions,
- sig_type,
- sig_key,
- inner_sig_type,
- signature,
- tbs_cert_body,
- orig_key_type,
- cert_body,
- )
- else:
- _check_empty(rest)
- return public_key
-
-
-def load_ssh_public_identity(
- data: bytes,
-) -> SSHCertificate | SSHPublicKeyTypes:
- return _load_ssh_public_identity(data)
-
-
-def _parse_exts_opts(exts_opts: memoryview) -> dict[bytes, bytes]:
- result: dict[bytes, bytes] = {}
- last_name = None
- while exts_opts:
- name, exts_opts = _get_sshstr(exts_opts)
- bname: bytes = bytes(name)
- if bname in result:
- raise ValueError("Duplicate name")
- if last_name is not None and bname < last_name:
- raise ValueError("Fields not lexically sorted")
- value, exts_opts = _get_sshstr(exts_opts)
- if len(value) > 0:
- value, extra = _get_sshstr(value)
- if len(extra) > 0:
- raise ValueError("Unexpected extra data after value")
- result[bname] = bytes(value)
- last_name = bname
- return result
-
-
-def load_ssh_public_key(
- data: bytes, backend: typing.Any = None
-) -> SSHPublicKeyTypes:
- cert_or_key = _load_ssh_public_identity(data, _legacy_dsa_allowed=True)
- public_key: SSHPublicKeyTypes
- if isinstance(cert_or_key, SSHCertificate):
- public_key = cert_or_key.public_key()
- else:
- public_key = cert_or_key
-
- if isinstance(public_key, dsa.DSAPublicKey):
- warnings.warn(
- "SSH DSA keys are deprecated and will be removed in a future "
- "release.",
- utils.DeprecatedIn40,
- stacklevel=2,
- )
- return public_key
-
-
-def serialize_ssh_public_key(public_key: SSHPublicKeyTypes) -> bytes:
- """One-line public key format for OpenSSH"""
- if isinstance(public_key, dsa.DSAPublicKey):
- warnings.warn(
- "SSH DSA key support is deprecated and will be "
- "removed in a future release",
- utils.DeprecatedIn40,
- stacklevel=4,
- )
- key_type = _get_ssh_key_type(public_key)
- kformat = _lookup_kformat(key_type)
-
- f_pub = _FragList()
- f_pub.put_sshstr(key_type)
- kformat.encode_public(public_key, f_pub)
-
- pub = binascii.b2a_base64(f_pub.tobytes()).strip()
- return b"".join([key_type, b" ", pub])
-
-
-SSHCertPrivateKeyTypes = typing.Union[
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- ed25519.Ed25519PrivateKey,
-]
-
-
-# This is an undocumented limit enforced in the openssh codebase for sshd and
-# ssh-keygen, but it is undefined in the ssh certificates spec.
-_SSHKEY_CERT_MAX_PRINCIPALS = 256
-
-
-class SSHCertificateBuilder:
- def __init__(
- self,
- _public_key: SSHCertPublicKeyTypes | None = None,
- _serial: int | None = None,
- _type: SSHCertificateType | None = None,
- _key_id: bytes | None = None,
- _valid_principals: list[bytes] = [],
- _valid_for_all_principals: bool = False,
- _valid_before: int | None = None,
- _valid_after: int | None = None,
- _critical_options: list[tuple[bytes, bytes]] = [],
- _extensions: list[tuple[bytes, bytes]] = [],
- ):
- self._public_key = _public_key
- self._serial = _serial
- self._type = _type
- self._key_id = _key_id
- self._valid_principals = _valid_principals
- self._valid_for_all_principals = _valid_for_all_principals
- self._valid_before = _valid_before
- self._valid_after = _valid_after
- self._critical_options = _critical_options
- self._extensions = _extensions
-
- def public_key(
- self, public_key: SSHCertPublicKeyTypes
- ) -> SSHCertificateBuilder:
- if not isinstance(
- public_key,
- (
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- ed25519.Ed25519PublicKey,
- ),
- ):
- raise TypeError("Unsupported key type")
- if self._public_key is not None:
- raise ValueError("public_key already set")
-
- return SSHCertificateBuilder(
- _public_key=public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def serial(self, serial: int) -> SSHCertificateBuilder:
- if not isinstance(serial, int):
- raise TypeError("serial must be an integer")
- if not 0 <= serial < 2**64:
- raise ValueError("serial must be between 0 and 2**64")
- if self._serial is not None:
- raise ValueError("serial already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def type(self, type: SSHCertificateType) -> SSHCertificateBuilder:
- if not isinstance(type, SSHCertificateType):
- raise TypeError("type must be an SSHCertificateType")
- if self._type is not None:
- raise ValueError("type already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def key_id(self, key_id: bytes) -> SSHCertificateBuilder:
- if not isinstance(key_id, bytes):
- raise TypeError("key_id must be bytes")
- if self._key_id is not None:
- raise ValueError("key_id already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_principals(
- self, valid_principals: list[bytes]
- ) -> SSHCertificateBuilder:
- if self._valid_for_all_principals:
- raise ValueError(
- "Principals can't be set because the cert is valid "
- "for all principals"
- )
- if (
- not all(isinstance(x, bytes) for x in valid_principals)
- or not valid_principals
- ):
- raise TypeError(
- "principals must be a list of bytes and can't be empty"
- )
- if self._valid_principals:
- raise ValueError("valid_principals already set")
-
- if len(valid_principals) > _SSHKEY_CERT_MAX_PRINCIPALS:
- raise ValueError(
- "Reached or exceeded the maximum number of valid_principals"
- )
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_for_all_principals(self):
- if self._valid_principals:
- raise ValueError(
- "valid_principals already set, can't set "
- "valid_for_all_principals"
- )
- if self._valid_for_all_principals:
- raise ValueError("valid_for_all_principals already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=True,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_before(self, valid_before: int | float) -> SSHCertificateBuilder:
- if not isinstance(valid_before, (int, float)):
- raise TypeError("valid_before must be an int or float")
- valid_before = int(valid_before)
- if valid_before < 0 or valid_before >= 2**64:
- raise ValueError("valid_before must [0, 2**64)")
- if self._valid_before is not None:
- raise ValueError("valid_before already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_after(self, valid_after: int | float) -> SSHCertificateBuilder:
- if not isinstance(valid_after, (int, float)):
- raise TypeError("valid_after must be an int or float")
- valid_after = int(valid_after)
- if valid_after < 0 or valid_after >= 2**64:
- raise ValueError("valid_after must [0, 2**64)")
- if self._valid_after is not None:
- raise ValueError("valid_after already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def add_critical_option(
- self, name: bytes, value: bytes
- ) -> SSHCertificateBuilder:
- if not isinstance(name, bytes) or not isinstance(value, bytes):
- raise TypeError("name and value must be bytes")
- # This is O(n**2)
- if name in [name for name, _ in self._critical_options]:
- raise ValueError("Duplicate critical option name")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=[*self._critical_options, (name, value)],
- _extensions=self._extensions,
- )
-
- def add_extension(
- self, name: bytes, value: bytes
- ) -> SSHCertificateBuilder:
- if not isinstance(name, bytes) or not isinstance(value, bytes):
- raise TypeError("name and value must be bytes")
- # This is O(n**2)
- if name in [name for name, _ in self._extensions]:
- raise ValueError("Duplicate extension name")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=[*self._extensions, (name, value)],
- )
-
- def sign(self, private_key: SSHCertPrivateKeyTypes) -> SSHCertificate:
- if not isinstance(
- private_key,
- (
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- ed25519.Ed25519PrivateKey,
- ),
- ):
- raise TypeError("Unsupported private key type")
-
- if self._public_key is None:
- raise ValueError("public_key must be set")
-
- # Not required
- serial = 0 if self._serial is None else self._serial
-
- if self._type is None:
- raise ValueError("type must be set")
-
- # Not required
- key_id = b"" if self._key_id is None else self._key_id
-
- # A zero length list is valid, but means the certificate
- # is valid for any principal of the specified type. We require
- # the user to explicitly set valid_for_all_principals to get
- # that behavior.
- if not self._valid_principals and not self._valid_for_all_principals:
- raise ValueError(
- "valid_principals must be set if valid_for_all_principals "
- "is False"
- )
-
- if self._valid_before is None:
- raise ValueError("valid_before must be set")
-
- if self._valid_after is None:
- raise ValueError("valid_after must be set")
-
- if self._valid_after > self._valid_before:
- raise ValueError("valid_after must be earlier than valid_before")
-
- # lexically sort our byte strings
- self._critical_options.sort(key=lambda x: x[0])
- self._extensions.sort(key=lambda x: x[0])
-
- key_type = _get_ssh_key_type(self._public_key)
- cert_prefix = key_type + _CERT_SUFFIX
-
- # Marshal the bytes to be signed
- nonce = os.urandom(32)
- kformat = _lookup_kformat(key_type)
- f = _FragList()
- f.put_sshstr(cert_prefix)
- f.put_sshstr(nonce)
- kformat.encode_public(self._public_key, f)
- f.put_u64(serial)
- f.put_u32(self._type.value)
- f.put_sshstr(key_id)
- fprincipals = _FragList()
- for p in self._valid_principals:
- fprincipals.put_sshstr(p)
- f.put_sshstr(fprincipals.tobytes())
- f.put_u64(self._valid_after)
- f.put_u64(self._valid_before)
- fcrit = _FragList()
- for name, value in self._critical_options:
- fcrit.put_sshstr(name)
- if len(value) > 0:
- foptval = _FragList()
- foptval.put_sshstr(value)
- fcrit.put_sshstr(foptval.tobytes())
- else:
- fcrit.put_sshstr(value)
- f.put_sshstr(fcrit.tobytes())
- fext = _FragList()
- for name, value in self._extensions:
- fext.put_sshstr(name)
- if len(value) > 0:
- fextval = _FragList()
- fextval.put_sshstr(value)
- fext.put_sshstr(fextval.tobytes())
- else:
- fext.put_sshstr(value)
- f.put_sshstr(fext.tobytes())
- f.put_sshstr(b"") # RESERVED FIELD
- # encode CA public key
- ca_type = _get_ssh_key_type(private_key)
- caformat = _lookup_kformat(ca_type)
- caf = _FragList()
- caf.put_sshstr(ca_type)
- caformat.encode_public(private_key.public_key(), caf)
- f.put_sshstr(caf.tobytes())
- # Sigs according to the rules defined for the CA's public key
- # (RFC4253 section 6.6 for ssh-rsa, RFC5656 for ECDSA,
- # and RFC8032 for Ed25519).
- if isinstance(private_key, ed25519.Ed25519PrivateKey):
- signature = private_key.sign(f.tobytes())
- fsig = _FragList()
- fsig.put_sshstr(ca_type)
- fsig.put_sshstr(signature)
- f.put_sshstr(fsig.tobytes())
- elif isinstance(private_key, ec.EllipticCurvePrivateKey):
- hash_alg = _get_ec_hash_alg(private_key.curve)
- signature = private_key.sign(f.tobytes(), ec.ECDSA(hash_alg))
- r, s = asym_utils.decode_dss_signature(signature)
- fsig = _FragList()
- fsig.put_sshstr(ca_type)
- fsigblob = _FragList()
- fsigblob.put_mpint(r)
- fsigblob.put_mpint(s)
- fsig.put_sshstr(fsigblob.tobytes())
- f.put_sshstr(fsig.tobytes())
-
- else:
- assert isinstance(private_key, rsa.RSAPrivateKey)
- # Just like Golang, we're going to use SHA512 for RSA
- # https://cs.opensource.google/go/x/crypto/+/refs/tags/
- # v0.4.0:ssh/certs.go;l=445
- # RFC 8332 defines SHA256 and 512 as options
- fsig = _FragList()
- fsig.put_sshstr(_SSH_RSA_SHA512)
- signature = private_key.sign(
- f.tobytes(), padding.PKCS1v15(), hashes.SHA512()
- )
- fsig.put_sshstr(signature)
- f.put_sshstr(fsig.tobytes())
-
- cert_data = binascii.b2a_base64(f.tobytes()).strip()
- # load_ssh_public_identity returns a union, but this is
- # guaranteed to be an SSHCertificate, so we cast to make
- # mypy happy.
- return typing.cast(
- SSHCertificate,
- load_ssh_public_identity(b"".join([cert_prefix, b" ", cert_data])),
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/__init__.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/__init__.py
deleted file mode 100644
index c1af42300..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-
-class InvalidToken(Exception):
- pass
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/hotp.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/hotp.py
deleted file mode 100644
index 855a5d212..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/hotp.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import base64
-import typing
-from urllib.parse import quote, urlencode
-
-from cryptography.hazmat.primitives import constant_time, hmac
-from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512
-from cryptography.hazmat.primitives.twofactor import InvalidToken
-
-HOTPHashTypes = typing.Union[SHA1, SHA256, SHA512]
-
-
-def _generate_uri(
- hotp: HOTP,
- type_name: str,
- account_name: str,
- issuer: str | None,
- extra_parameters: list[tuple[str, int]],
-) -> str:
- parameters = [
- ("digits", hotp._length),
- ("secret", base64.b32encode(hotp._key)),
- ("algorithm", hotp._algorithm.name.upper()),
- ]
-
- if issuer is not None:
- parameters.append(("issuer", issuer))
-
- parameters.extend(extra_parameters)
-
- label = (
- f"{quote(issuer)}:{quote(account_name)}"
- if issuer
- else quote(account_name)
- )
- return f"otpauth://{type_name}/{label}?{urlencode(parameters)}"
-
-
-class HOTP:
- def __init__(
- self,
- key: bytes,
- length: int,
- algorithm: HOTPHashTypes,
- backend: typing.Any = None,
- enforce_key_length: bool = True,
- ) -> None:
- if len(key) < 16 and enforce_key_length is True:
- raise ValueError("Key length has to be at least 128 bits.")
-
- if not isinstance(length, int):
- raise TypeError("Length parameter must be an integer type.")
-
- if length < 6 or length > 8:
- raise ValueError("Length of HOTP has to be between 6 and 8.")
-
- if not isinstance(algorithm, (SHA1, SHA256, SHA512)):
- raise TypeError("Algorithm must be SHA1, SHA256 or SHA512.")
-
- self._key = key
- self._length = length
- self._algorithm = algorithm
-
- def generate(self, counter: int) -> bytes:
- if not isinstance(counter, int):
- raise TypeError("Counter parameter must be an integer type.")
-
- truncated_value = self._dynamic_truncate(counter)
- hotp = truncated_value % (10**self._length)
- return "{0:0{1}}".format(hotp, self._length).encode()
-
- def verify(self, hotp: bytes, counter: int) -> None:
- if not constant_time.bytes_eq(self.generate(counter), hotp):
- raise InvalidToken("Supplied HOTP value does not match.")
-
- def _dynamic_truncate(self, counter: int) -> int:
- ctx = hmac.HMAC(self._key, self._algorithm)
-
- try:
- ctx.update(counter.to_bytes(length=8, byteorder="big"))
- except OverflowError:
- raise ValueError(f"Counter must be between 0 and {2 ** 64 - 1}.")
-
- hmac_value = ctx.finalize()
-
- offset = hmac_value[len(hmac_value) - 1] & 0b1111
- p = hmac_value[offset : offset + 4]
- return int.from_bytes(p, byteorder="big") & 0x7FFFFFFF
-
- def get_provisioning_uri(
- self, account_name: str, counter: int, issuer: str | None
- ) -> str:
- return _generate_uri(
- self, "hotp", account_name, issuer, [("counter", int(counter))]
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/totp.py b/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/totp.py
deleted file mode 100644
index b9ed7349a..000000000
--- a/resources/python/bin/3.7/linux/cryptography/hazmat/primitives/twofactor/totp.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.primitives import constant_time
-from cryptography.hazmat.primitives.twofactor import InvalidToken
-from cryptography.hazmat.primitives.twofactor.hotp import (
- HOTP,
- HOTPHashTypes,
- _generate_uri,
-)
-
-
-class TOTP:
- def __init__(
- self,
- key: bytes,
- length: int,
- algorithm: HOTPHashTypes,
- time_step: int,
- backend: typing.Any = None,
- enforce_key_length: bool = True,
- ):
- self._time_step = time_step
- self._hotp = HOTP(
- key, length, algorithm, enforce_key_length=enforce_key_length
- )
-
- def generate(self, time: int | float) -> bytes:
- if not isinstance(time, (int, float)):
- raise TypeError(
- "Time parameter must be an integer type or float type."
- )
-
- counter = int(time / self._time_step)
- return self._hotp.generate(counter)
-
- def verify(self, totp: bytes, time: int) -> None:
- if not constant_time.bytes_eq(self.generate(time), totp):
- raise InvalidToken("Supplied TOTP value does not match.")
-
- def get_provisioning_uri(
- self, account_name: str, issuer: str | None
- ) -> str:
- return _generate_uri(
- self._hotp,
- "totp",
- account_name,
- issuer,
- [("period", int(self._time_step))],
- )
diff --git a/resources/python/bin/3.7/linux/cryptography/py.typed b/resources/python/bin/3.7/linux/cryptography/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/linux/cryptography/utils.py b/resources/python/bin/3.7/linux/cryptography/utils.py
deleted file mode 100644
index 706d0ae4c..000000000
--- a/resources/python/bin/3.7/linux/cryptography/utils.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import enum
-import sys
-import types
-import typing
-import warnings
-
-
-# We use a UserWarning subclass, instead of DeprecationWarning, because CPython
-# decided deprecation warnings should be invisible by default.
-class CryptographyDeprecationWarning(UserWarning):
- pass
-
-
-# Several APIs were deprecated with no specific end-of-life date because of the
-# ubiquity of their use. They should not be removed until we agree on when that
-# cycle ends.
-DeprecatedIn36 = CryptographyDeprecationWarning
-DeprecatedIn37 = CryptographyDeprecationWarning
-DeprecatedIn40 = CryptographyDeprecationWarning
-DeprecatedIn41 = CryptographyDeprecationWarning
-DeprecatedIn42 = CryptographyDeprecationWarning
-DeprecatedIn43 = CryptographyDeprecationWarning
-
-
-def _check_bytes(name: str, value: bytes) -> None:
- if not isinstance(value, bytes):
- raise TypeError(f"{name} must be bytes")
-
-
-def _check_byteslike(name: str, value: bytes) -> None:
- try:
- memoryview(value)
- except TypeError:
- raise TypeError(f"{name} must be bytes-like")
-
-
-def int_to_bytes(integer: int, length: int | None = None) -> bytes:
- if length == 0:
- raise ValueError("length argument can't be 0")
- return integer.to_bytes(
- length or (integer.bit_length() + 7) // 8 or 1, "big"
- )
-
-
-class InterfaceNotImplemented(Exception):
- pass
-
-
-class _DeprecatedValue:
- def __init__(self, value: object, message: str, warning_class):
- self.value = value
- self.message = message
- self.warning_class = warning_class
-
-
-class _ModuleWithDeprecations(types.ModuleType):
- def __init__(self, module: types.ModuleType):
- super().__init__(module.__name__)
- self.__dict__["_module"] = module
-
- def __getattr__(self, attr: str) -> object:
- obj = getattr(self._module, attr)
- if isinstance(obj, _DeprecatedValue):
- warnings.warn(obj.message, obj.warning_class, stacklevel=2)
- obj = obj.value
- return obj
-
- def __setattr__(self, attr: str, value: object) -> None:
- setattr(self._module, attr, value)
-
- def __delattr__(self, attr: str) -> None:
- obj = getattr(self._module, attr)
- if isinstance(obj, _DeprecatedValue):
- warnings.warn(obj.message, obj.warning_class, stacklevel=2)
-
- delattr(self._module, attr)
-
- def __dir__(self) -> typing.Sequence[str]:
- return ["_module", *dir(self._module)]
-
-
-def deprecated(
- value: object,
- module_name: str,
- message: str,
- warning_class: type[Warning],
- name: str | None = None,
-) -> _DeprecatedValue:
- module = sys.modules[module_name]
- if not isinstance(module, _ModuleWithDeprecations):
- sys.modules[module_name] = module = _ModuleWithDeprecations(module)
- dv = _DeprecatedValue(value, message, warning_class)
- # Maintain backwards compatibility with `name is None` for pyOpenSSL.
- if name is not None:
- setattr(module, name, dv)
- return dv
-
-
-def cached_property(func: typing.Callable) -> property:
- cached_name = f"_cached_{func}"
- sentinel = object()
-
- def inner(instance: object):
- cache = getattr(instance, cached_name, sentinel)
- if cache is not sentinel:
- return cache
- result = func(instance)
- setattr(instance, cached_name, result)
- return result
-
- return property(inner)
-
-
-# Python 3.10 changed representation of enums. We use well-defined object
-# representation and string representation from Python 3.9.
-class Enum(enum.Enum):
- def __repr__(self) -> str:
- return f"<{self.__class__.__name__}.{self._name_}: {self._value_!r}>"
-
- def __str__(self) -> str:
- return f"{self.__class__.__name__}.{self._name_}"
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/__init__.py b/resources/python/bin/3.7/linux/cryptography/x509/__init__.py
deleted file mode 100644
index 8a89d67f1..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/__init__.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.x509 import certificate_transparency, verification
-from cryptography.x509.base import (
- Attribute,
- AttributeNotFound,
- Attributes,
- Certificate,
- CertificateBuilder,
- CertificateRevocationList,
- CertificateRevocationListBuilder,
- CertificateSigningRequest,
- CertificateSigningRequestBuilder,
- InvalidVersion,
- RevokedCertificate,
- RevokedCertificateBuilder,
- Version,
- load_der_x509_certificate,
- load_der_x509_crl,
- load_der_x509_csr,
- load_pem_x509_certificate,
- load_pem_x509_certificates,
- load_pem_x509_crl,
- load_pem_x509_csr,
- random_serial_number,
-)
-from cryptography.x509.extensions import (
- AccessDescription,
- Admission,
- Admissions,
- AuthorityInformationAccess,
- AuthorityKeyIdentifier,
- BasicConstraints,
- CertificateIssuer,
- CertificatePolicies,
- CRLDistributionPoints,
- CRLNumber,
- CRLReason,
- DeltaCRLIndicator,
- DistributionPoint,
- DuplicateExtension,
- ExtendedKeyUsage,
- Extension,
- ExtensionNotFound,
- Extensions,
- ExtensionType,
- FreshestCRL,
- GeneralNames,
- InhibitAnyPolicy,
- InvalidityDate,
- IssuerAlternativeName,
- IssuingDistributionPoint,
- KeyUsage,
- MSCertificateTemplate,
- NameConstraints,
- NamingAuthority,
- NoticeReference,
- OCSPAcceptableResponses,
- OCSPNoCheck,
- OCSPNonce,
- PolicyConstraints,
- PolicyInformation,
- PrecertificateSignedCertificateTimestamps,
- PrecertPoison,
- ProfessionInfo,
- ReasonFlags,
- SignedCertificateTimestamps,
- SubjectAlternativeName,
- SubjectInformationAccess,
- SubjectKeyIdentifier,
- TLSFeature,
- TLSFeatureType,
- UnrecognizedExtension,
- UserNotice,
-)
-from cryptography.x509.general_name import (
- DirectoryName,
- DNSName,
- GeneralName,
- IPAddress,
- OtherName,
- RegisteredID,
- RFC822Name,
- UniformResourceIdentifier,
- UnsupportedGeneralNameType,
-)
-from cryptography.x509.name import (
- Name,
- NameAttribute,
- RelativeDistinguishedName,
-)
-from cryptography.x509.oid import (
- AuthorityInformationAccessOID,
- CertificatePoliciesOID,
- CRLEntryExtensionOID,
- ExtendedKeyUsageOID,
- ExtensionOID,
- NameOID,
- ObjectIdentifier,
- PublicKeyAlgorithmOID,
- SignatureAlgorithmOID,
-)
-
-OID_AUTHORITY_INFORMATION_ACCESS = ExtensionOID.AUTHORITY_INFORMATION_ACCESS
-OID_AUTHORITY_KEY_IDENTIFIER = ExtensionOID.AUTHORITY_KEY_IDENTIFIER
-OID_BASIC_CONSTRAINTS = ExtensionOID.BASIC_CONSTRAINTS
-OID_CERTIFICATE_POLICIES = ExtensionOID.CERTIFICATE_POLICIES
-OID_CRL_DISTRIBUTION_POINTS = ExtensionOID.CRL_DISTRIBUTION_POINTS
-OID_EXTENDED_KEY_USAGE = ExtensionOID.EXTENDED_KEY_USAGE
-OID_FRESHEST_CRL = ExtensionOID.FRESHEST_CRL
-OID_INHIBIT_ANY_POLICY = ExtensionOID.INHIBIT_ANY_POLICY
-OID_ISSUER_ALTERNATIVE_NAME = ExtensionOID.ISSUER_ALTERNATIVE_NAME
-OID_KEY_USAGE = ExtensionOID.KEY_USAGE
-OID_NAME_CONSTRAINTS = ExtensionOID.NAME_CONSTRAINTS
-OID_OCSP_NO_CHECK = ExtensionOID.OCSP_NO_CHECK
-OID_POLICY_CONSTRAINTS = ExtensionOID.POLICY_CONSTRAINTS
-OID_POLICY_MAPPINGS = ExtensionOID.POLICY_MAPPINGS
-OID_SUBJECT_ALTERNATIVE_NAME = ExtensionOID.SUBJECT_ALTERNATIVE_NAME
-OID_SUBJECT_DIRECTORY_ATTRIBUTES = ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES
-OID_SUBJECT_INFORMATION_ACCESS = ExtensionOID.SUBJECT_INFORMATION_ACCESS
-OID_SUBJECT_KEY_IDENTIFIER = ExtensionOID.SUBJECT_KEY_IDENTIFIER
-
-OID_DSA_WITH_SHA1 = SignatureAlgorithmOID.DSA_WITH_SHA1
-OID_DSA_WITH_SHA224 = SignatureAlgorithmOID.DSA_WITH_SHA224
-OID_DSA_WITH_SHA256 = SignatureAlgorithmOID.DSA_WITH_SHA256
-OID_ECDSA_WITH_SHA1 = SignatureAlgorithmOID.ECDSA_WITH_SHA1
-OID_ECDSA_WITH_SHA224 = SignatureAlgorithmOID.ECDSA_WITH_SHA224
-OID_ECDSA_WITH_SHA256 = SignatureAlgorithmOID.ECDSA_WITH_SHA256
-OID_ECDSA_WITH_SHA384 = SignatureAlgorithmOID.ECDSA_WITH_SHA384
-OID_ECDSA_WITH_SHA512 = SignatureAlgorithmOID.ECDSA_WITH_SHA512
-OID_RSA_WITH_MD5 = SignatureAlgorithmOID.RSA_WITH_MD5
-OID_RSA_WITH_SHA1 = SignatureAlgorithmOID.RSA_WITH_SHA1
-OID_RSA_WITH_SHA224 = SignatureAlgorithmOID.RSA_WITH_SHA224
-OID_RSA_WITH_SHA256 = SignatureAlgorithmOID.RSA_WITH_SHA256
-OID_RSA_WITH_SHA384 = SignatureAlgorithmOID.RSA_WITH_SHA384
-OID_RSA_WITH_SHA512 = SignatureAlgorithmOID.RSA_WITH_SHA512
-OID_RSASSA_PSS = SignatureAlgorithmOID.RSASSA_PSS
-
-OID_COMMON_NAME = NameOID.COMMON_NAME
-OID_COUNTRY_NAME = NameOID.COUNTRY_NAME
-OID_DOMAIN_COMPONENT = NameOID.DOMAIN_COMPONENT
-OID_DN_QUALIFIER = NameOID.DN_QUALIFIER
-OID_EMAIL_ADDRESS = NameOID.EMAIL_ADDRESS
-OID_GENERATION_QUALIFIER = NameOID.GENERATION_QUALIFIER
-OID_GIVEN_NAME = NameOID.GIVEN_NAME
-OID_LOCALITY_NAME = NameOID.LOCALITY_NAME
-OID_ORGANIZATIONAL_UNIT_NAME = NameOID.ORGANIZATIONAL_UNIT_NAME
-OID_ORGANIZATION_NAME = NameOID.ORGANIZATION_NAME
-OID_PSEUDONYM = NameOID.PSEUDONYM
-OID_SERIAL_NUMBER = NameOID.SERIAL_NUMBER
-OID_STATE_OR_PROVINCE_NAME = NameOID.STATE_OR_PROVINCE_NAME
-OID_SURNAME = NameOID.SURNAME
-OID_TITLE = NameOID.TITLE
-
-OID_CLIENT_AUTH = ExtendedKeyUsageOID.CLIENT_AUTH
-OID_CODE_SIGNING = ExtendedKeyUsageOID.CODE_SIGNING
-OID_EMAIL_PROTECTION = ExtendedKeyUsageOID.EMAIL_PROTECTION
-OID_OCSP_SIGNING = ExtendedKeyUsageOID.OCSP_SIGNING
-OID_SERVER_AUTH = ExtendedKeyUsageOID.SERVER_AUTH
-OID_TIME_STAMPING = ExtendedKeyUsageOID.TIME_STAMPING
-
-OID_ANY_POLICY = CertificatePoliciesOID.ANY_POLICY
-OID_CPS_QUALIFIER = CertificatePoliciesOID.CPS_QUALIFIER
-OID_CPS_USER_NOTICE = CertificatePoliciesOID.CPS_USER_NOTICE
-
-OID_CERTIFICATE_ISSUER = CRLEntryExtensionOID.CERTIFICATE_ISSUER
-OID_CRL_REASON = CRLEntryExtensionOID.CRL_REASON
-OID_INVALIDITY_DATE = CRLEntryExtensionOID.INVALIDITY_DATE
-
-OID_CA_ISSUERS = AuthorityInformationAccessOID.CA_ISSUERS
-OID_OCSP = AuthorityInformationAccessOID.OCSP
-
-__all__ = [
- "OID_CA_ISSUERS",
- "OID_OCSP",
- "AccessDescription",
- "Admission",
- "Admissions",
- "Attribute",
- "AttributeNotFound",
- "Attributes",
- "AuthorityInformationAccess",
- "AuthorityKeyIdentifier",
- "BasicConstraints",
- "CRLDistributionPoints",
- "CRLNumber",
- "CRLReason",
- "Certificate",
- "CertificateBuilder",
- "CertificateIssuer",
- "CertificatePolicies",
- "CertificateRevocationList",
- "CertificateRevocationListBuilder",
- "CertificateSigningRequest",
- "CertificateSigningRequestBuilder",
- "DNSName",
- "DeltaCRLIndicator",
- "DirectoryName",
- "DistributionPoint",
- "DuplicateExtension",
- "ExtendedKeyUsage",
- "Extension",
- "ExtensionNotFound",
- "ExtensionType",
- "Extensions",
- "FreshestCRL",
- "GeneralName",
- "GeneralNames",
- "IPAddress",
- "InhibitAnyPolicy",
- "InvalidVersion",
- "InvalidityDate",
- "IssuerAlternativeName",
- "IssuingDistributionPoint",
- "KeyUsage",
- "MSCertificateTemplate",
- "Name",
- "NameAttribute",
- "NameConstraints",
- "NameOID",
- "NamingAuthority",
- "NoticeReference",
- "OCSPAcceptableResponses",
- "OCSPNoCheck",
- "OCSPNonce",
- "ObjectIdentifier",
- "OtherName",
- "PolicyConstraints",
- "PolicyInformation",
- "PrecertPoison",
- "PrecertificateSignedCertificateTimestamps",
- "ProfessionInfo",
- "PublicKeyAlgorithmOID",
- "RFC822Name",
- "ReasonFlags",
- "RegisteredID",
- "RelativeDistinguishedName",
- "RevokedCertificate",
- "RevokedCertificateBuilder",
- "SignatureAlgorithmOID",
- "SignedCertificateTimestamps",
- "SubjectAlternativeName",
- "SubjectInformationAccess",
- "SubjectKeyIdentifier",
- "TLSFeature",
- "TLSFeatureType",
- "UniformResourceIdentifier",
- "UnrecognizedExtension",
- "UnsupportedGeneralNameType",
- "UserNotice",
- "Version",
- "certificate_transparency",
- "load_der_x509_certificate",
- "load_der_x509_crl",
- "load_der_x509_csr",
- "load_pem_x509_certificate",
- "load_pem_x509_certificates",
- "load_pem_x509_crl",
- "load_pem_x509_csr",
- "random_serial_number",
- "verification",
- "verification",
-]
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/base.py b/resources/python/bin/3.7/linux/cryptography/x509/base.py
deleted file mode 100644
index 25b317af6..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/base.py
+++ /dev/null
@@ -1,815 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import datetime
-import os
-import typing
-import warnings
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed448,
- ed25519,
- padding,
- rsa,
- x448,
- x25519,
-)
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPrivateKeyTypes,
- CertificatePublicKeyTypes,
-)
-from cryptography.x509.extensions import (
- Extension,
- Extensions,
- ExtensionType,
- _make_sequence_methods,
-)
-from cryptography.x509.name import Name, _ASN1Type
-from cryptography.x509.oid import ObjectIdentifier
-
-_EARLIEST_UTC_TIME = datetime.datetime(1950, 1, 1)
-
-# This must be kept in sync with sign.rs's list of allowable types in
-# identify_hash_type
-_AllowedHashTypes = typing.Union[
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- hashes.SHA3_224,
- hashes.SHA3_256,
- hashes.SHA3_384,
- hashes.SHA3_512,
-]
-
-
-class AttributeNotFound(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-def _reject_duplicate_extension(
- extension: Extension[ExtensionType],
- extensions: list[Extension[ExtensionType]],
-) -> None:
- # This is quadratic in the number of extensions
- for e in extensions:
- if e.oid == extension.oid:
- raise ValueError("This extension has already been set.")
-
-
-def _reject_duplicate_attribute(
- oid: ObjectIdentifier,
- attributes: list[tuple[ObjectIdentifier, bytes, int | None]],
-) -> None:
- # This is quadratic in the number of attributes
- for attr_oid, _, _ in attributes:
- if attr_oid == oid:
- raise ValueError("This attribute has already been set.")
-
-
-def _convert_to_naive_utc_time(time: datetime.datetime) -> datetime.datetime:
- """Normalizes a datetime to a naive datetime in UTC.
-
- time -- datetime to normalize. Assumed to be in UTC if not timezone
- aware.
- """
- if time.tzinfo is not None:
- offset = time.utcoffset()
- offset = offset if offset else datetime.timedelta()
- return time.replace(tzinfo=None) - offset
- else:
- return time
-
-
-class Attribute:
- def __init__(
- self,
- oid: ObjectIdentifier,
- value: bytes,
- _type: int = _ASN1Type.UTF8String.value,
- ) -> None:
- self._oid = oid
- self._value = value
- self._type = _type
-
- @property
- def oid(self) -> ObjectIdentifier:
- return self._oid
-
- @property
- def value(self) -> bytes:
- return self._value
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Attribute):
- return NotImplemented
-
- return (
- self.oid == other.oid
- and self.value == other.value
- and self._type == other._type
- )
-
- def __hash__(self) -> int:
- return hash((self.oid, self.value, self._type))
-
-
-class Attributes:
- def __init__(
- self,
- attributes: typing.Iterable[Attribute],
- ) -> None:
- self._attributes = list(attributes)
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_attributes")
-
- def __repr__(self) -> str:
- return f""
-
- def get_attribute_for_oid(self, oid: ObjectIdentifier) -> Attribute:
- for attr in self:
- if attr.oid == oid:
- return attr
-
- raise AttributeNotFound(f"No {oid} attribute was found", oid)
-
-
-class Version(utils.Enum):
- v1 = 0
- v3 = 2
-
-
-class InvalidVersion(Exception):
- def __init__(self, msg: str, parsed_version: int) -> None:
- super().__init__(msg)
- self.parsed_version = parsed_version
-
-
-Certificate = rust_x509.Certificate
-
-
-class RevokedCertificate(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def serial_number(self) -> int:
- """
- Returns the serial number of the revoked certificate.
- """
-
- @property
- @abc.abstractmethod
- def revocation_date(self) -> datetime.datetime:
- """
- Returns the date of when this certificate was revoked.
- """
-
- @property
- @abc.abstractmethod
- def revocation_date_utc(self) -> datetime.datetime:
- """
- Returns the date of when this certificate was revoked as a non-naive
- UTC datetime.
- """
-
- @property
- @abc.abstractmethod
- def extensions(self) -> Extensions:
- """
- Returns an Extensions object containing a list of Revoked extensions.
- """
-
-
-# Runtime isinstance checks need this since the rust class is not a subclass.
-RevokedCertificate.register(rust_x509.RevokedCertificate)
-
-
-class _RawRevokedCertificate(RevokedCertificate):
- def __init__(
- self,
- serial_number: int,
- revocation_date: datetime.datetime,
- extensions: Extensions,
- ):
- self._serial_number = serial_number
- self._revocation_date = revocation_date
- self._extensions = extensions
-
- @property
- def serial_number(self) -> int:
- return self._serial_number
-
- @property
- def revocation_date(self) -> datetime.datetime:
- warnings.warn(
- "Properties that return a naïve datetime object have been "
- "deprecated. Please switch to revocation_date_utc.",
- utils.DeprecatedIn42,
- stacklevel=2,
- )
- return self._revocation_date
-
- @property
- def revocation_date_utc(self) -> datetime.datetime:
- return self._revocation_date.replace(tzinfo=datetime.timezone.utc)
-
- @property
- def extensions(self) -> Extensions:
- return self._extensions
-
-
-CertificateRevocationList = rust_x509.CertificateRevocationList
-CertificateSigningRequest = rust_x509.CertificateSigningRequest
-
-
-load_pem_x509_certificate = rust_x509.load_pem_x509_certificate
-load_der_x509_certificate = rust_x509.load_der_x509_certificate
-
-load_pem_x509_certificates = rust_x509.load_pem_x509_certificates
-
-load_pem_x509_csr = rust_x509.load_pem_x509_csr
-load_der_x509_csr = rust_x509.load_der_x509_csr
-
-load_pem_x509_crl = rust_x509.load_pem_x509_crl
-load_der_x509_crl = rust_x509.load_der_x509_crl
-
-
-class CertificateSigningRequestBuilder:
- def __init__(
- self,
- subject_name: Name | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- attributes: list[tuple[ObjectIdentifier, bytes, int | None]] = [],
- ):
- """
- Creates an empty X.509 certificate request (v1).
- """
- self._subject_name = subject_name
- self._extensions = extensions
- self._attributes = attributes
-
- def subject_name(self, name: Name) -> CertificateSigningRequestBuilder:
- """
- Sets the certificate requestor's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._subject_name is not None:
- raise ValueError("The subject name may only be set once.")
- return CertificateSigningRequestBuilder(
- name, self._extensions, self._attributes
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateSigningRequestBuilder:
- """
- Adds an X.509 extension to the certificate request.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return CertificateSigningRequestBuilder(
- self._subject_name,
- [*self._extensions, extension],
- self._attributes,
- )
-
- def add_attribute(
- self,
- oid: ObjectIdentifier,
- value: bytes,
- *,
- _tag: _ASN1Type | None = None,
- ) -> CertificateSigningRequestBuilder:
- """
- Adds an X.509 attribute with an OID and associated value.
- """
- if not isinstance(oid, ObjectIdentifier):
- raise TypeError("oid must be an ObjectIdentifier")
-
- if not isinstance(value, bytes):
- raise TypeError("value must be bytes")
-
- if _tag is not None and not isinstance(_tag, _ASN1Type):
- raise TypeError("tag must be _ASN1Type")
-
- _reject_duplicate_attribute(oid, self._attributes)
-
- if _tag is not None:
- tag = _tag.value
- else:
- tag = None
-
- return CertificateSigningRequestBuilder(
- self._subject_name,
- self._extensions,
- [*self._attributes, (oid, value, tag)],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> CertificateSigningRequest:
- """
- Signs the request using the requestor's private key.
- """
- if self._subject_name is None:
- raise ValueError("A CertificateSigningRequest must have a subject")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_csr(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class CertificateBuilder:
- _extensions: list[Extension[ExtensionType]]
-
- def __init__(
- self,
- issuer_name: Name | None = None,
- subject_name: Name | None = None,
- public_key: CertificatePublicKeyTypes | None = None,
- serial_number: int | None = None,
- not_valid_before: datetime.datetime | None = None,
- not_valid_after: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- ) -> None:
- self._version = Version.v3
- self._issuer_name = issuer_name
- self._subject_name = subject_name
- self._public_key = public_key
- self._serial_number = serial_number
- self._not_valid_before = not_valid_before
- self._not_valid_after = not_valid_after
- self._extensions = extensions
-
- def issuer_name(self, name: Name) -> CertificateBuilder:
- """
- Sets the CA's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._issuer_name is not None:
- raise ValueError("The issuer name may only be set once.")
- return CertificateBuilder(
- name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def subject_name(self, name: Name) -> CertificateBuilder:
- """
- Sets the requestor's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._subject_name is not None:
- raise ValueError("The subject name may only be set once.")
- return CertificateBuilder(
- self._issuer_name,
- name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def public_key(
- self,
- key: CertificatePublicKeyTypes,
- ) -> CertificateBuilder:
- """
- Sets the requestor's public key (as found in the signing request).
- """
- if not isinstance(
- key,
- (
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
- ),
- ):
- raise TypeError(
- "Expecting one of DSAPublicKey, RSAPublicKey,"
- " EllipticCurvePublicKey, Ed25519PublicKey,"
- " Ed448PublicKey, X25519PublicKey, or "
- "X448PublicKey."
- )
- if self._public_key is not None:
- raise ValueError("The public key may only be set once.")
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def serial_number(self, number: int) -> CertificateBuilder:
- """
- Sets the certificate serial number.
- """
- if not isinstance(number, int):
- raise TypeError("Serial number must be of integral type.")
- if self._serial_number is not None:
- raise ValueError("The serial number may only be set once.")
- if number <= 0:
- raise ValueError("The serial number should be positive.")
-
- # ASN.1 integers are always signed, so most significant bit must be
- # zero.
- if number.bit_length() >= 160: # As defined in RFC 5280
- raise ValueError(
- "The serial number should not be more than 159 bits."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def not_valid_before(self, time: datetime.datetime) -> CertificateBuilder:
- """
- Sets the certificate activation time.
- """
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._not_valid_before is not None:
- raise ValueError("The not valid before may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The not valid before date must be on or after"
- " 1950 January 1)."
- )
- if self._not_valid_after is not None and time > self._not_valid_after:
- raise ValueError(
- "The not valid before date must be before the not valid after "
- "date."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- time,
- self._not_valid_after,
- self._extensions,
- )
-
- def not_valid_after(self, time: datetime.datetime) -> CertificateBuilder:
- """
- Sets the certificate expiration time.
- """
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._not_valid_after is not None:
- raise ValueError("The not valid after may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The not valid after date must be on or after"
- " 1950 January 1."
- )
- if (
- self._not_valid_before is not None
- and time < self._not_valid_before
- ):
- raise ValueError(
- "The not valid after date must be after the not valid before "
- "date."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- time,
- self._extensions,
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateBuilder:
- """
- Adds an X.509 extension to the certificate.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- [*self._extensions, extension],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> Certificate:
- """
- Signs the certificate using the CA's private key.
- """
- if self._subject_name is None:
- raise ValueError("A certificate must have a subject name")
-
- if self._issuer_name is None:
- raise ValueError("A certificate must have an issuer name")
-
- if self._serial_number is None:
- raise ValueError("A certificate must have a serial number")
-
- if self._not_valid_before is None:
- raise ValueError("A certificate must have a not valid before time")
-
- if self._not_valid_after is None:
- raise ValueError("A certificate must have a not valid after time")
-
- if self._public_key is None:
- raise ValueError("A certificate must have a public key")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_certificate(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class CertificateRevocationListBuilder:
- _extensions: list[Extension[ExtensionType]]
- _revoked_certificates: list[RevokedCertificate]
-
- def __init__(
- self,
- issuer_name: Name | None = None,
- last_update: datetime.datetime | None = None,
- next_update: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- revoked_certificates: list[RevokedCertificate] = [],
- ):
- self._issuer_name = issuer_name
- self._last_update = last_update
- self._next_update = next_update
- self._extensions = extensions
- self._revoked_certificates = revoked_certificates
-
- def issuer_name(
- self, issuer_name: Name
- ) -> CertificateRevocationListBuilder:
- if not isinstance(issuer_name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._issuer_name is not None:
- raise ValueError("The issuer name may only be set once.")
- return CertificateRevocationListBuilder(
- issuer_name,
- self._last_update,
- self._next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def last_update(
- self, last_update: datetime.datetime
- ) -> CertificateRevocationListBuilder:
- if not isinstance(last_update, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._last_update is not None:
- raise ValueError("Last update may only be set once.")
- last_update = _convert_to_naive_utc_time(last_update)
- if last_update < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The last update date must be on or after 1950 January 1."
- )
- if self._next_update is not None and last_update > self._next_update:
- raise ValueError(
- "The last update date must be before the next update date."
- )
- return CertificateRevocationListBuilder(
- self._issuer_name,
- last_update,
- self._next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def next_update(
- self, next_update: datetime.datetime
- ) -> CertificateRevocationListBuilder:
- if not isinstance(next_update, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._next_update is not None:
- raise ValueError("Last update may only be set once.")
- next_update = _convert_to_naive_utc_time(next_update)
- if next_update < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The last update date must be on or after 1950 January 1."
- )
- if self._last_update is not None and next_update < self._last_update:
- raise ValueError(
- "The next update date must be after the last update date."
- )
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateRevocationListBuilder:
- """
- Adds an X.509 extension to the certificate revocation list.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- self._next_update,
- [*self._extensions, extension],
- self._revoked_certificates,
- )
-
- def add_revoked_certificate(
- self, revoked_certificate: RevokedCertificate
- ) -> CertificateRevocationListBuilder:
- """
- Adds a revoked certificate to the CRL.
- """
- if not isinstance(revoked_certificate, RevokedCertificate):
- raise TypeError("Must be an instance of RevokedCertificate")
-
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- self._next_update,
- self._extensions,
- [*self._revoked_certificates, revoked_certificate],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> CertificateRevocationList:
- if self._issuer_name is None:
- raise ValueError("A CRL must have an issuer name")
-
- if self._last_update is None:
- raise ValueError("A CRL must have a last update time")
-
- if self._next_update is None:
- raise ValueError("A CRL must have a next update time")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_crl(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class RevokedCertificateBuilder:
- def __init__(
- self,
- serial_number: int | None = None,
- revocation_date: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- ):
- self._serial_number = serial_number
- self._revocation_date = revocation_date
- self._extensions = extensions
-
- def serial_number(self, number: int) -> RevokedCertificateBuilder:
- if not isinstance(number, int):
- raise TypeError("Serial number must be of integral type.")
- if self._serial_number is not None:
- raise ValueError("The serial number may only be set once.")
- if number <= 0:
- raise ValueError("The serial number should be positive")
-
- # ASN.1 integers are always signed, so most significant bit must be
- # zero.
- if number.bit_length() >= 160: # As defined in RFC 5280
- raise ValueError(
- "The serial number should not be more than 159 bits."
- )
- return RevokedCertificateBuilder(
- number, self._revocation_date, self._extensions
- )
-
- def revocation_date(
- self, time: datetime.datetime
- ) -> RevokedCertificateBuilder:
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._revocation_date is not None:
- raise ValueError("The revocation date may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The revocation date must be on or after 1950 January 1."
- )
- return RevokedCertificateBuilder(
- self._serial_number, time, self._extensions
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> RevokedCertificateBuilder:
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
- return RevokedCertificateBuilder(
- self._serial_number,
- self._revocation_date,
- [*self._extensions, extension],
- )
-
- def build(self, backend: typing.Any = None) -> RevokedCertificate:
- if self._serial_number is None:
- raise ValueError("A revoked certificate must have a serial number")
- if self._revocation_date is None:
- raise ValueError(
- "A revoked certificate must have a revocation date"
- )
- return _RawRevokedCertificate(
- self._serial_number,
- self._revocation_date,
- Extensions(self._extensions),
- )
-
-
-def random_serial_number() -> int:
- return int.from_bytes(os.urandom(20), "big") >> 1
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/certificate_transparency.py b/resources/python/bin/3.7/linux/cryptography/x509/certificate_transparency.py
deleted file mode 100644
index fb66cc604..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/certificate_transparency.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-
-
-class LogEntryType(utils.Enum):
- X509_CERTIFICATE = 0
- PRE_CERTIFICATE = 1
-
-
-class Version(utils.Enum):
- v1 = 0
-
-
-class SignatureAlgorithm(utils.Enum):
- """
- Signature algorithms that are valid for SCTs.
-
- These are exactly the same as SignatureAlgorithm in RFC 5246 (TLS 1.2).
-
- See:
- """
-
- ANONYMOUS = 0
- RSA = 1
- DSA = 2
- ECDSA = 3
-
-
-SignedCertificateTimestamp = rust_x509.Sct
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/extensions.py b/resources/python/bin/3.7/linux/cryptography/x509/extensions.py
deleted file mode 100644
index fc3e7730e..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/extensions.py
+++ /dev/null
@@ -1,2477 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import datetime
-import hashlib
-import ipaddress
-import typing
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import asn1
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.hazmat.primitives import constant_time, serialization
-from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey
-from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPublicKeyTypes,
- CertificatePublicKeyTypes,
-)
-from cryptography.x509.certificate_transparency import (
- SignedCertificateTimestamp,
-)
-from cryptography.x509.general_name import (
- DirectoryName,
- DNSName,
- GeneralName,
- IPAddress,
- OtherName,
- RegisteredID,
- RFC822Name,
- UniformResourceIdentifier,
- _IPAddressTypes,
-)
-from cryptography.x509.name import Name, RelativeDistinguishedName
-from cryptography.x509.oid import (
- CRLEntryExtensionOID,
- ExtensionOID,
- ObjectIdentifier,
- OCSPExtensionOID,
-)
-
-ExtensionTypeVar = typing.TypeVar(
- "ExtensionTypeVar", bound="ExtensionType", covariant=True
-)
-
-
-def _key_identifier_from_public_key(
- public_key: CertificatePublicKeyTypes,
-) -> bytes:
- if isinstance(public_key, RSAPublicKey):
- data = public_key.public_bytes(
- serialization.Encoding.DER,
- serialization.PublicFormat.PKCS1,
- )
- elif isinstance(public_key, EllipticCurvePublicKey):
- data = public_key.public_bytes(
- serialization.Encoding.X962,
- serialization.PublicFormat.UncompressedPoint,
- )
- else:
- # This is a very slow way to do this.
- serialized = public_key.public_bytes(
- serialization.Encoding.DER,
- serialization.PublicFormat.SubjectPublicKeyInfo,
- )
- data = asn1.parse_spki_for_data(serialized)
-
- return hashlib.sha1(data).digest()
-
-
-def _make_sequence_methods(field_name: str):
- def len_method(self) -> int:
- return len(getattr(self, field_name))
-
- def iter_method(self):
- return iter(getattr(self, field_name))
-
- def getitem_method(self, idx):
- return getattr(self, field_name)[idx]
-
- return len_method, iter_method, getitem_method
-
-
-class DuplicateExtension(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-class ExtensionNotFound(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-class ExtensionType(metaclass=abc.ABCMeta):
- oid: typing.ClassVar[ObjectIdentifier]
-
- def public_bytes(self) -> bytes:
- """
- Serializes the extension type to DER.
- """
- raise NotImplementedError(
- f"public_bytes is not implemented for extension type {self!r}"
- )
-
-
-class Extensions:
- def __init__(
- self, extensions: typing.Iterable[Extension[ExtensionType]]
- ) -> None:
- self._extensions = list(extensions)
-
- def get_extension_for_oid(
- self, oid: ObjectIdentifier
- ) -> Extension[ExtensionType]:
- for ext in self:
- if ext.oid == oid:
- return ext
-
- raise ExtensionNotFound(f"No {oid} extension was found", oid)
-
- def get_extension_for_class(
- self, extclass: type[ExtensionTypeVar]
- ) -> Extension[ExtensionTypeVar]:
- if extclass is UnrecognizedExtension:
- raise TypeError(
- "UnrecognizedExtension can't be used with "
- "get_extension_for_class because more than one instance of the"
- " class may be present."
- )
-
- for ext in self:
- if isinstance(ext.value, extclass):
- return ext
-
- raise ExtensionNotFound(
- f"No {extclass} extension was found", extclass.oid
- )
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_extensions")
-
- def __repr__(self) -> str:
- return f""
-
-
-class CRLNumber(ExtensionType):
- oid = ExtensionOID.CRL_NUMBER
-
- def __init__(self, crl_number: int) -> None:
- if not isinstance(crl_number, int):
- raise TypeError("crl_number must be an integer")
-
- self._crl_number = crl_number
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CRLNumber):
- return NotImplemented
-
- return self.crl_number == other.crl_number
-
- def __hash__(self) -> int:
- return hash(self.crl_number)
-
- def __repr__(self) -> str:
- return f""
-
- @property
- def crl_number(self) -> int:
- return self._crl_number
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AuthorityKeyIdentifier(ExtensionType):
- oid = ExtensionOID.AUTHORITY_KEY_IDENTIFIER
-
- def __init__(
- self,
- key_identifier: bytes | None,
- authority_cert_issuer: typing.Iterable[GeneralName] | None,
- authority_cert_serial_number: int | None,
- ) -> None:
- if (authority_cert_issuer is None) != (
- authority_cert_serial_number is None
- ):
- raise ValueError(
- "authority_cert_issuer and authority_cert_serial_number "
- "must both be present or both None"
- )
-
- if authority_cert_issuer is not None:
- authority_cert_issuer = list(authority_cert_issuer)
- if not all(
- isinstance(x, GeneralName) for x in authority_cert_issuer
- ):
- raise TypeError(
- "authority_cert_issuer must be a list of GeneralName "
- "objects"
- )
-
- if authority_cert_serial_number is not None and not isinstance(
- authority_cert_serial_number, int
- ):
- raise TypeError("authority_cert_serial_number must be an integer")
-
- self._key_identifier = key_identifier
- self._authority_cert_issuer = authority_cert_issuer
- self._authority_cert_serial_number = authority_cert_serial_number
-
- # This takes a subset of CertificatePublicKeyTypes because an issuer
- # cannot have an X25519/X448 key. This introduces some unfortunate
- # asymmetry that requires typing users to explicitly
- # narrow their type, but we should make this accurate and not just
- # convenient.
- @classmethod
- def from_issuer_public_key(
- cls, public_key: CertificateIssuerPublicKeyTypes
- ) -> AuthorityKeyIdentifier:
- digest = _key_identifier_from_public_key(public_key)
- return cls(
- key_identifier=digest,
- authority_cert_issuer=None,
- authority_cert_serial_number=None,
- )
-
- @classmethod
- def from_issuer_subject_key_identifier(
- cls, ski: SubjectKeyIdentifier
- ) -> AuthorityKeyIdentifier:
- return cls(
- key_identifier=ski.digest,
- authority_cert_issuer=None,
- authority_cert_serial_number=None,
- )
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AuthorityKeyIdentifier):
- return NotImplemented
-
- return (
- self.key_identifier == other.key_identifier
- and self.authority_cert_issuer == other.authority_cert_issuer
- and self.authority_cert_serial_number
- == other.authority_cert_serial_number
- )
-
- def __hash__(self) -> int:
- if self.authority_cert_issuer is None:
- aci = None
- else:
- aci = tuple(self.authority_cert_issuer)
- return hash(
- (self.key_identifier, aci, self.authority_cert_serial_number)
- )
-
- @property
- def key_identifier(self) -> bytes | None:
- return self._key_identifier
-
- @property
- def authority_cert_issuer(
- self,
- ) -> list[GeneralName] | None:
- return self._authority_cert_issuer
-
- @property
- def authority_cert_serial_number(self) -> int | None:
- return self._authority_cert_serial_number
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class SubjectKeyIdentifier(ExtensionType):
- oid = ExtensionOID.SUBJECT_KEY_IDENTIFIER
-
- def __init__(self, digest: bytes) -> None:
- self._digest = digest
-
- @classmethod
- def from_public_key(
- cls, public_key: CertificatePublicKeyTypes
- ) -> SubjectKeyIdentifier:
- return cls(_key_identifier_from_public_key(public_key))
-
- @property
- def digest(self) -> bytes:
- return self._digest
-
- @property
- def key_identifier(self) -> bytes:
- return self._digest
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SubjectKeyIdentifier):
- return NotImplemented
-
- return constant_time.bytes_eq(self.digest, other.digest)
-
- def __hash__(self) -> int:
- return hash(self.digest)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AuthorityInformationAccess(ExtensionType):
- oid = ExtensionOID.AUTHORITY_INFORMATION_ACCESS
-
- def __init__(
- self, descriptions: typing.Iterable[AccessDescription]
- ) -> None:
- descriptions = list(descriptions)
- if not all(isinstance(x, AccessDescription) for x in descriptions):
- raise TypeError(
- "Every item in the descriptions list must be an "
- "AccessDescription"
- )
-
- self._descriptions = descriptions
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_descriptions")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AuthorityInformationAccess):
- return NotImplemented
-
- return self._descriptions == other._descriptions
-
- def __hash__(self) -> int:
- return hash(tuple(self._descriptions))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class SubjectInformationAccess(ExtensionType):
- oid = ExtensionOID.SUBJECT_INFORMATION_ACCESS
-
- def __init__(
- self, descriptions: typing.Iterable[AccessDescription]
- ) -> None:
- descriptions = list(descriptions)
- if not all(isinstance(x, AccessDescription) for x in descriptions):
- raise TypeError(
- "Every item in the descriptions list must be an "
- "AccessDescription"
- )
-
- self._descriptions = descriptions
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_descriptions")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SubjectInformationAccess):
- return NotImplemented
-
- return self._descriptions == other._descriptions
-
- def __hash__(self) -> int:
- return hash(tuple(self._descriptions))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AccessDescription:
- def __init__(
- self, access_method: ObjectIdentifier, access_location: GeneralName
- ) -> None:
- if not isinstance(access_method, ObjectIdentifier):
- raise TypeError("access_method must be an ObjectIdentifier")
-
- if not isinstance(access_location, GeneralName):
- raise TypeError("access_location must be a GeneralName")
-
- self._access_method = access_method
- self._access_location = access_location
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AccessDescription):
- return NotImplemented
-
- return (
- self.access_method == other.access_method
- and self.access_location == other.access_location
- )
-
- def __hash__(self) -> int:
- return hash((self.access_method, self.access_location))
-
- @property
- def access_method(self) -> ObjectIdentifier:
- return self._access_method
-
- @property
- def access_location(self) -> GeneralName:
- return self._access_location
-
-
-class BasicConstraints(ExtensionType):
- oid = ExtensionOID.BASIC_CONSTRAINTS
-
- def __init__(self, ca: bool, path_length: int | None) -> None:
- if not isinstance(ca, bool):
- raise TypeError("ca must be a boolean value")
-
- if path_length is not None and not ca:
- raise ValueError("path_length must be None when ca is False")
-
- if path_length is not None and (
- not isinstance(path_length, int) or path_length < 0
- ):
- raise TypeError(
- "path_length must be a non-negative integer or None"
- )
-
- self._ca = ca
- self._path_length = path_length
-
- @property
- def ca(self) -> bool:
- return self._ca
-
- @property
- def path_length(self) -> int | None:
- return self._path_length
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, BasicConstraints):
- return NotImplemented
-
- return self.ca == other.ca and self.path_length == other.path_length
-
- def __hash__(self) -> int:
- return hash((self.ca, self.path_length))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class DeltaCRLIndicator(ExtensionType):
- oid = ExtensionOID.DELTA_CRL_INDICATOR
-
- def __init__(self, crl_number: int) -> None:
- if not isinstance(crl_number, int):
- raise TypeError("crl_number must be an integer")
-
- self._crl_number = crl_number
-
- @property
- def crl_number(self) -> int:
- return self._crl_number
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DeltaCRLIndicator):
- return NotImplemented
-
- return self.crl_number == other.crl_number
-
- def __hash__(self) -> int:
- return hash(self.crl_number)
-
- def __repr__(self) -> str:
- return f""
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CRLDistributionPoints(ExtensionType):
- oid = ExtensionOID.CRL_DISTRIBUTION_POINTS
-
- def __init__(
- self, distribution_points: typing.Iterable[DistributionPoint]
- ) -> None:
- distribution_points = list(distribution_points)
- if not all(
- isinstance(x, DistributionPoint) for x in distribution_points
- ):
- raise TypeError(
- "distribution_points must be a list of DistributionPoint "
- "objects"
- )
-
- self._distribution_points = distribution_points
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_distribution_points"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CRLDistributionPoints):
- return NotImplemented
-
- return self._distribution_points == other._distribution_points
-
- def __hash__(self) -> int:
- return hash(tuple(self._distribution_points))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class FreshestCRL(ExtensionType):
- oid = ExtensionOID.FRESHEST_CRL
-
- def __init__(
- self, distribution_points: typing.Iterable[DistributionPoint]
- ) -> None:
- distribution_points = list(distribution_points)
- if not all(
- isinstance(x, DistributionPoint) for x in distribution_points
- ):
- raise TypeError(
- "distribution_points must be a list of DistributionPoint "
- "objects"
- )
-
- self._distribution_points = distribution_points
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_distribution_points"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, FreshestCRL):
- return NotImplemented
-
- return self._distribution_points == other._distribution_points
-
- def __hash__(self) -> int:
- return hash(tuple(self._distribution_points))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class DistributionPoint:
- def __init__(
- self,
- full_name: typing.Iterable[GeneralName] | None,
- relative_name: RelativeDistinguishedName | None,
- reasons: frozenset[ReasonFlags] | None,
- crl_issuer: typing.Iterable[GeneralName] | None,
- ) -> None:
- if full_name and relative_name:
- raise ValueError(
- "You cannot provide both full_name and relative_name, at "
- "least one must be None."
- )
- if not full_name and not relative_name and not crl_issuer:
- raise ValueError(
- "Either full_name, relative_name or crl_issuer must be "
- "provided."
- )
-
- if full_name is not None:
- full_name = list(full_name)
- if not all(isinstance(x, GeneralName) for x in full_name):
- raise TypeError(
- "full_name must be a list of GeneralName objects"
- )
-
- if relative_name:
- if not isinstance(relative_name, RelativeDistinguishedName):
- raise TypeError(
- "relative_name must be a RelativeDistinguishedName"
- )
-
- if crl_issuer is not None:
- crl_issuer = list(crl_issuer)
- if not all(isinstance(x, GeneralName) for x in crl_issuer):
- raise TypeError(
- "crl_issuer must be None or a list of general names"
- )
-
- if reasons and (
- not isinstance(reasons, frozenset)
- or not all(isinstance(x, ReasonFlags) for x in reasons)
- ):
- raise TypeError("reasons must be None or frozenset of ReasonFlags")
-
- if reasons and (
- ReasonFlags.unspecified in reasons
- or ReasonFlags.remove_from_crl in reasons
- ):
- raise ValueError(
- "unspecified and remove_from_crl are not valid reasons in a "
- "DistributionPoint"
- )
-
- self._full_name = full_name
- self._relative_name = relative_name
- self._reasons = reasons
- self._crl_issuer = crl_issuer
-
- def __repr__(self) -> str:
- return (
- "".format(self)
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DistributionPoint):
- return NotImplemented
-
- return (
- self.full_name == other.full_name
- and self.relative_name == other.relative_name
- and self.reasons == other.reasons
- and self.crl_issuer == other.crl_issuer
- )
-
- def __hash__(self) -> int:
- if self.full_name is not None:
- fn: tuple[GeneralName, ...] | None = tuple(self.full_name)
- else:
- fn = None
-
- if self.crl_issuer is not None:
- crl_issuer: tuple[GeneralName, ...] | None = tuple(self.crl_issuer)
- else:
- crl_issuer = None
-
- return hash((fn, self.relative_name, self.reasons, crl_issuer))
-
- @property
- def full_name(self) -> list[GeneralName] | None:
- return self._full_name
-
- @property
- def relative_name(self) -> RelativeDistinguishedName | None:
- return self._relative_name
-
- @property
- def reasons(self) -> frozenset[ReasonFlags] | None:
- return self._reasons
-
- @property
- def crl_issuer(self) -> list[GeneralName] | None:
- return self._crl_issuer
-
-
-class ReasonFlags(utils.Enum):
- unspecified = "unspecified"
- key_compromise = "keyCompromise"
- ca_compromise = "cACompromise"
- affiliation_changed = "affiliationChanged"
- superseded = "superseded"
- cessation_of_operation = "cessationOfOperation"
- certificate_hold = "certificateHold"
- privilege_withdrawn = "privilegeWithdrawn"
- aa_compromise = "aACompromise"
- remove_from_crl = "removeFromCRL"
-
-
-# These are distribution point bit string mappings. Not to be confused with
-# CRLReason reason flags bit string mappings.
-# ReasonFlags ::= BIT STRING {
-# unused (0),
-# keyCompromise (1),
-# cACompromise (2),
-# affiliationChanged (3),
-# superseded (4),
-# cessationOfOperation (5),
-# certificateHold (6),
-# privilegeWithdrawn (7),
-# aACompromise (8) }
-_REASON_BIT_MAPPING = {
- 1: ReasonFlags.key_compromise,
- 2: ReasonFlags.ca_compromise,
- 3: ReasonFlags.affiliation_changed,
- 4: ReasonFlags.superseded,
- 5: ReasonFlags.cessation_of_operation,
- 6: ReasonFlags.certificate_hold,
- 7: ReasonFlags.privilege_withdrawn,
- 8: ReasonFlags.aa_compromise,
-}
-
-_CRLREASONFLAGS = {
- ReasonFlags.key_compromise: 1,
- ReasonFlags.ca_compromise: 2,
- ReasonFlags.affiliation_changed: 3,
- ReasonFlags.superseded: 4,
- ReasonFlags.cessation_of_operation: 5,
- ReasonFlags.certificate_hold: 6,
- ReasonFlags.privilege_withdrawn: 7,
- ReasonFlags.aa_compromise: 8,
-}
-
-# CRLReason ::= ENUMERATED {
-# unspecified (0),
-# keyCompromise (1),
-# cACompromise (2),
-# affiliationChanged (3),
-# superseded (4),
-# cessationOfOperation (5),
-# certificateHold (6),
-# -- value 7 is not used
-# removeFromCRL (8),
-# privilegeWithdrawn (9),
-# aACompromise (10) }
-_CRL_ENTRY_REASON_ENUM_TO_CODE = {
- ReasonFlags.unspecified: 0,
- ReasonFlags.key_compromise: 1,
- ReasonFlags.ca_compromise: 2,
- ReasonFlags.affiliation_changed: 3,
- ReasonFlags.superseded: 4,
- ReasonFlags.cessation_of_operation: 5,
- ReasonFlags.certificate_hold: 6,
- ReasonFlags.remove_from_crl: 8,
- ReasonFlags.privilege_withdrawn: 9,
- ReasonFlags.aa_compromise: 10,
-}
-
-
-class PolicyConstraints(ExtensionType):
- oid = ExtensionOID.POLICY_CONSTRAINTS
-
- def __init__(
- self,
- require_explicit_policy: int | None,
- inhibit_policy_mapping: int | None,
- ) -> None:
- if require_explicit_policy is not None and not isinstance(
- require_explicit_policy, int
- ):
- raise TypeError(
- "require_explicit_policy must be a non-negative integer or "
- "None"
- )
-
- if inhibit_policy_mapping is not None and not isinstance(
- inhibit_policy_mapping, int
- ):
- raise TypeError(
- "inhibit_policy_mapping must be a non-negative integer or None"
- )
-
- if inhibit_policy_mapping is None and require_explicit_policy is None:
- raise ValueError(
- "At least one of require_explicit_policy and "
- "inhibit_policy_mapping must not be None"
- )
-
- self._require_explicit_policy = require_explicit_policy
- self._inhibit_policy_mapping = inhibit_policy_mapping
-
- def __repr__(self) -> str:
- return (
- "".format(self)
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PolicyConstraints):
- return NotImplemented
-
- return (
- self.require_explicit_policy == other.require_explicit_policy
- and self.inhibit_policy_mapping == other.inhibit_policy_mapping
- )
-
- def __hash__(self) -> int:
- return hash(
- (self.require_explicit_policy, self.inhibit_policy_mapping)
- )
-
- @property
- def require_explicit_policy(self) -> int | None:
- return self._require_explicit_policy
-
- @property
- def inhibit_policy_mapping(self) -> int | None:
- return self._inhibit_policy_mapping
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CertificatePolicies(ExtensionType):
- oid = ExtensionOID.CERTIFICATE_POLICIES
-
- def __init__(self, policies: typing.Iterable[PolicyInformation]) -> None:
- policies = list(policies)
- if not all(isinstance(x, PolicyInformation) for x in policies):
- raise TypeError(
- "Every item in the policies list must be a "
- "PolicyInformation"
- )
-
- self._policies = policies
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_policies")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CertificatePolicies):
- return NotImplemented
-
- return self._policies == other._policies
-
- def __hash__(self) -> int:
- return hash(tuple(self._policies))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class PolicyInformation:
- def __init__(
- self,
- policy_identifier: ObjectIdentifier,
- policy_qualifiers: typing.Iterable[str | UserNotice] | None,
- ) -> None:
- if not isinstance(policy_identifier, ObjectIdentifier):
- raise TypeError("policy_identifier must be an ObjectIdentifier")
-
- self._policy_identifier = policy_identifier
-
- if policy_qualifiers is not None:
- policy_qualifiers = list(policy_qualifiers)
- if not all(
- isinstance(x, (str, UserNotice)) for x in policy_qualifiers
- ):
- raise TypeError(
- "policy_qualifiers must be a list of strings and/or "
- "UserNotice objects or None"
- )
-
- self._policy_qualifiers = policy_qualifiers
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PolicyInformation):
- return NotImplemented
-
- return (
- self.policy_identifier == other.policy_identifier
- and self.policy_qualifiers == other.policy_qualifiers
- )
-
- def __hash__(self) -> int:
- if self.policy_qualifiers is not None:
- pq = tuple(self.policy_qualifiers)
- else:
- pq = None
-
- return hash((self.policy_identifier, pq))
-
- @property
- def policy_identifier(self) -> ObjectIdentifier:
- return self._policy_identifier
-
- @property
- def policy_qualifiers(
- self,
- ) -> list[str | UserNotice] | None:
- return self._policy_qualifiers
-
-
-class UserNotice:
- def __init__(
- self,
- notice_reference: NoticeReference | None,
- explicit_text: str | None,
- ) -> None:
- if notice_reference and not isinstance(
- notice_reference, NoticeReference
- ):
- raise TypeError(
- "notice_reference must be None or a NoticeReference"
- )
-
- self._notice_reference = notice_reference
- self._explicit_text = explicit_text
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, UserNotice):
- return NotImplemented
-
- return (
- self.notice_reference == other.notice_reference
- and self.explicit_text == other.explicit_text
- )
-
- def __hash__(self) -> int:
- return hash((self.notice_reference, self.explicit_text))
-
- @property
- def notice_reference(self) -> NoticeReference | None:
- return self._notice_reference
-
- @property
- def explicit_text(self) -> str | None:
- return self._explicit_text
-
-
-class NoticeReference:
- def __init__(
- self,
- organization: str | None,
- notice_numbers: typing.Iterable[int],
- ) -> None:
- self._organization = organization
- notice_numbers = list(notice_numbers)
- if not all(isinstance(x, int) for x in notice_numbers):
- raise TypeError("notice_numbers must be a list of integers")
-
- self._notice_numbers = notice_numbers
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, NoticeReference):
- return NotImplemented
-
- return (
- self.organization == other.organization
- and self.notice_numbers == other.notice_numbers
- )
-
- def __hash__(self) -> int:
- return hash((self.organization, tuple(self.notice_numbers)))
-
- @property
- def organization(self) -> str | None:
- return self._organization
-
- @property
- def notice_numbers(self) -> list[int]:
- return self._notice_numbers
-
-
-class ExtendedKeyUsage(ExtensionType):
- oid = ExtensionOID.EXTENDED_KEY_USAGE
-
- def __init__(self, usages: typing.Iterable[ObjectIdentifier]) -> None:
- usages = list(usages)
- if not all(isinstance(x, ObjectIdentifier) for x in usages):
- raise TypeError(
- "Every item in the usages list must be an ObjectIdentifier"
- )
-
- self._usages = usages
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_usages")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, ExtendedKeyUsage):
- return NotImplemented
-
- return self._usages == other._usages
-
- def __hash__(self) -> int:
- return hash(tuple(self._usages))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class OCSPNoCheck(ExtensionType):
- oid = ExtensionOID.OCSP_NO_CHECK
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, OCSPNoCheck):
- return NotImplemented
-
- return True
-
- def __hash__(self) -> int:
- return hash(OCSPNoCheck)
-
- def __repr__(self) -> str:
- return ""
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class PrecertPoison(ExtensionType):
- oid = ExtensionOID.PRECERT_POISON
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PrecertPoison):
- return NotImplemented
-
- return True
-
- def __hash__(self) -> int:
- return hash(PrecertPoison)
-
- def __repr__(self) -> str:
- return ""
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class TLSFeature(ExtensionType):
- oid = ExtensionOID.TLS_FEATURE
-
- def __init__(self, features: typing.Iterable[TLSFeatureType]) -> None:
- features = list(features)
- if (
- not all(isinstance(x, TLSFeatureType) for x in features)
- or len(features) == 0
- ):
- raise TypeError(
- "features must be a list of elements from the TLSFeatureType "
- "enum"
- )
-
- self._features = features
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_features")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, TLSFeature):
- return NotImplemented
-
- return self._features == other._features
-
- def __hash__(self) -> int:
- return hash(tuple(self._features))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class TLSFeatureType(utils.Enum):
- # status_request is defined in RFC 6066 and is used for what is commonly
- # called OCSP Must-Staple when present in the TLS Feature extension in an
- # X.509 certificate.
- status_request = 5
- # status_request_v2 is defined in RFC 6961 and allows multiple OCSP
- # responses to be provided. It is not currently in use by clients or
- # servers.
- status_request_v2 = 17
-
-
-_TLS_FEATURE_TYPE_TO_ENUM = {x.value: x for x in TLSFeatureType}
-
-
-class InhibitAnyPolicy(ExtensionType):
- oid = ExtensionOID.INHIBIT_ANY_POLICY
-
- def __init__(self, skip_certs: int) -> None:
- if not isinstance(skip_certs, int):
- raise TypeError("skip_certs must be an integer")
-
- if skip_certs < 0:
- raise ValueError("skip_certs must be a non-negative integer")
-
- self._skip_certs = skip_certs
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, InhibitAnyPolicy):
- return NotImplemented
-
- return self.skip_certs == other.skip_certs
-
- def __hash__(self) -> int:
- return hash(self.skip_certs)
-
- @property
- def skip_certs(self) -> int:
- return self._skip_certs
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class KeyUsage(ExtensionType):
- oid = ExtensionOID.KEY_USAGE
-
- def __init__(
- self,
- digital_signature: bool,
- content_commitment: bool,
- key_encipherment: bool,
- data_encipherment: bool,
- key_agreement: bool,
- key_cert_sign: bool,
- crl_sign: bool,
- encipher_only: bool,
- decipher_only: bool,
- ) -> None:
- if not key_agreement and (encipher_only or decipher_only):
- raise ValueError(
- "encipher_only and decipher_only can only be true when "
- "key_agreement is true"
- )
-
- self._digital_signature = digital_signature
- self._content_commitment = content_commitment
- self._key_encipherment = key_encipherment
- self._data_encipherment = data_encipherment
- self._key_agreement = key_agreement
- self._key_cert_sign = key_cert_sign
- self._crl_sign = crl_sign
- self._encipher_only = encipher_only
- self._decipher_only = decipher_only
-
- @property
- def digital_signature(self) -> bool:
- return self._digital_signature
-
- @property
- def content_commitment(self) -> bool:
- return self._content_commitment
-
- @property
- def key_encipherment(self) -> bool:
- return self._key_encipherment
-
- @property
- def data_encipherment(self) -> bool:
- return self._data_encipherment
-
- @property
- def key_agreement(self) -> bool:
- return self._key_agreement
-
- @property
- def key_cert_sign(self) -> bool:
- return self._key_cert_sign
-
- @property
- def crl_sign(self) -> bool:
- return self._crl_sign
-
- @property
- def encipher_only(self) -> bool:
- if not self.key_agreement:
- raise ValueError(
- "encipher_only is undefined unless key_agreement is true"
- )
- else:
- return self._encipher_only
-
- @property
- def decipher_only(self) -> bool:
- if not self.key_agreement:
- raise ValueError(
- "decipher_only is undefined unless key_agreement is true"
- )
- else:
- return self._decipher_only
-
- def __repr__(self) -> str:
- try:
- encipher_only = self.encipher_only
- decipher_only = self.decipher_only
- except ValueError:
- # Users found None confusing because even though encipher/decipher
- # have no meaning unless key_agreement is true, to construct an
- # instance of the class you still need to pass False.
- encipher_only = False
- decipher_only = False
-
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, KeyUsage):
- return NotImplemented
-
- return (
- self.digital_signature == other.digital_signature
- and self.content_commitment == other.content_commitment
- and self.key_encipherment == other.key_encipherment
- and self.data_encipherment == other.data_encipherment
- and self.key_agreement == other.key_agreement
- and self.key_cert_sign == other.key_cert_sign
- and self.crl_sign == other.crl_sign
- and self._encipher_only == other._encipher_only
- and self._decipher_only == other._decipher_only
- )
-
- def __hash__(self) -> int:
- return hash(
- (
- self.digital_signature,
- self.content_commitment,
- self.key_encipherment,
- self.data_encipherment,
- self.key_agreement,
- self.key_cert_sign,
- self.crl_sign,
- self._encipher_only,
- self._decipher_only,
- )
- )
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class NameConstraints(ExtensionType):
- oid = ExtensionOID.NAME_CONSTRAINTS
-
- def __init__(
- self,
- permitted_subtrees: typing.Iterable[GeneralName] | None,
- excluded_subtrees: typing.Iterable[GeneralName] | None,
- ) -> None:
- if permitted_subtrees is not None:
- permitted_subtrees = list(permitted_subtrees)
- if not permitted_subtrees:
- raise ValueError(
- "permitted_subtrees must be a non-empty list or None"
- )
- if not all(isinstance(x, GeneralName) for x in permitted_subtrees):
- raise TypeError(
- "permitted_subtrees must be a list of GeneralName objects "
- "or None"
- )
-
- self._validate_tree(permitted_subtrees)
-
- if excluded_subtrees is not None:
- excluded_subtrees = list(excluded_subtrees)
- if not excluded_subtrees:
- raise ValueError(
- "excluded_subtrees must be a non-empty list or None"
- )
- if not all(isinstance(x, GeneralName) for x in excluded_subtrees):
- raise TypeError(
- "excluded_subtrees must be a list of GeneralName objects "
- "or None"
- )
-
- self._validate_tree(excluded_subtrees)
-
- if permitted_subtrees is None and excluded_subtrees is None:
- raise ValueError(
- "At least one of permitted_subtrees and excluded_subtrees "
- "must not be None"
- )
-
- self._permitted_subtrees = permitted_subtrees
- self._excluded_subtrees = excluded_subtrees
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, NameConstraints):
- return NotImplemented
-
- return (
- self.excluded_subtrees == other.excluded_subtrees
- and self.permitted_subtrees == other.permitted_subtrees
- )
-
- def _validate_tree(self, tree: typing.Iterable[GeneralName]) -> None:
- self._validate_ip_name(tree)
- self._validate_dns_name(tree)
-
- def _validate_ip_name(self, tree: typing.Iterable[GeneralName]) -> None:
- if any(
- isinstance(name, IPAddress)
- and not isinstance(
- name.value, (ipaddress.IPv4Network, ipaddress.IPv6Network)
- )
- for name in tree
- ):
- raise TypeError(
- "IPAddress name constraints must be an IPv4Network or"
- " IPv6Network object"
- )
-
- def _validate_dns_name(self, tree: typing.Iterable[GeneralName]) -> None:
- if any(
- isinstance(name, DNSName) and "*" in name.value for name in tree
- ):
- raise ValueError(
- "DNSName name constraints must not contain the '*' wildcard"
- " character"
- )
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __hash__(self) -> int:
- if self.permitted_subtrees is not None:
- ps: tuple[GeneralName, ...] | None = tuple(self.permitted_subtrees)
- else:
- ps = None
-
- if self.excluded_subtrees is not None:
- es: tuple[GeneralName, ...] | None = tuple(self.excluded_subtrees)
- else:
- es = None
-
- return hash((ps, es))
-
- @property
- def permitted_subtrees(
- self,
- ) -> list[GeneralName] | None:
- return self._permitted_subtrees
-
- @property
- def excluded_subtrees(
- self,
- ) -> list[GeneralName] | None:
- return self._excluded_subtrees
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class Extension(typing.Generic[ExtensionTypeVar]):
- def __init__(
- self, oid: ObjectIdentifier, critical: bool, value: ExtensionTypeVar
- ) -> None:
- if not isinstance(oid, ObjectIdentifier):
- raise TypeError(
- "oid argument must be an ObjectIdentifier instance."
- )
-
- if not isinstance(critical, bool):
- raise TypeError("critical must be a boolean value")
-
- self._oid = oid
- self._critical = critical
- self._value = value
-
- @property
- def oid(self) -> ObjectIdentifier:
- return self._oid
-
- @property
- def critical(self) -> bool:
- return self._critical
-
- @property
- def value(self) -> ExtensionTypeVar:
- return self._value
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Extension):
- return NotImplemented
-
- return (
- self.oid == other.oid
- and self.critical == other.critical
- and self.value == other.value
- )
-
- def __hash__(self) -> int:
- return hash((self.oid, self.critical, self.value))
-
-
-class GeneralNames:
- def __init__(self, general_names: typing.Iterable[GeneralName]) -> None:
- general_names = list(general_names)
- if not all(isinstance(x, GeneralName) for x in general_names):
- raise TypeError(
- "Every item in the general_names list must be an "
- "object conforming to the GeneralName interface"
- )
-
- self._general_names = general_names
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names")
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[UniformResourceIdentifier]
- | type[RFC822Name],
- ) -> list[str]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DirectoryName],
- ) -> list[Name]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[RegisteredID],
- ) -> list[ObjectIdentifier]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[IPAddress]
- ) -> list[_IPAddressTypes]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[OtherName]
- ) -> list[OtherName]: ...
-
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[DirectoryName]
- | type[IPAddress]
- | type[OtherName]
- | type[RFC822Name]
- | type[RegisteredID]
- | type[UniformResourceIdentifier],
- ) -> (
- list[_IPAddressTypes]
- | list[str]
- | list[OtherName]
- | list[Name]
- | list[ObjectIdentifier]
- ):
- # Return the value of each GeneralName, except for OtherName instances
- # which we return directly because it has two important properties not
- # just one value.
- objs = (i for i in self if isinstance(i, type))
- if type != OtherName:
- return [i.value for i in objs]
- return list(objs)
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, GeneralNames):
- return NotImplemented
-
- return self._general_names == other._general_names
-
- def __hash__(self) -> int:
- return hash(tuple(self._general_names))
-
-
-class SubjectAlternativeName(ExtensionType):
- oid = ExtensionOID.SUBJECT_ALTERNATIVE_NAME
-
- def __init__(self, general_names: typing.Iterable[GeneralName]) -> None:
- self._general_names = GeneralNames(general_names)
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names")
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[UniformResourceIdentifier]
- | type[RFC822Name],
- ) -> list[str]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DirectoryName],
- ) -> list[Name]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[RegisteredID],
- ) -> list[ObjectIdentifier]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[IPAddress]
- ) -> list[_IPAddressTypes]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[OtherName]
- ) -> list[OtherName]: ...
-
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[DirectoryName]
- | type[IPAddress]
- | type[OtherName]
- | type[RFC822Name]
- | type[RegisteredID]
- | type[UniformResourceIdentifier],
- ) -> (
- list[_IPAddressTypes]
- | list[str]
- | list[OtherName]
- | list[Name]
- | list[ObjectIdentifier]
- ):
- return self._general_names.get_values_for_type(type)
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SubjectAlternativeName):
- return NotImplemented
-
- return self._general_names == other._general_names
-
- def __hash__(self) -> int:
- return hash(self._general_names)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class IssuerAlternativeName(ExtensionType):
- oid = ExtensionOID.ISSUER_ALTERNATIVE_NAME
-
- def __init__(self, general_names: typing.Iterable[GeneralName]) -> None:
- self._general_names = GeneralNames(general_names)
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names")
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[UniformResourceIdentifier]
- | type[RFC822Name],
- ) -> list[str]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DirectoryName],
- ) -> list[Name]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[RegisteredID],
- ) -> list[ObjectIdentifier]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[IPAddress]
- ) -> list[_IPAddressTypes]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[OtherName]
- ) -> list[OtherName]: ...
-
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[DirectoryName]
- | type[IPAddress]
- | type[OtherName]
- | type[RFC822Name]
- | type[RegisteredID]
- | type[UniformResourceIdentifier],
- ) -> (
- list[_IPAddressTypes]
- | list[str]
- | list[OtherName]
- | list[Name]
- | list[ObjectIdentifier]
- ):
- return self._general_names.get_values_for_type(type)
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, IssuerAlternativeName):
- return NotImplemented
-
- return self._general_names == other._general_names
-
- def __hash__(self) -> int:
- return hash(self._general_names)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CertificateIssuer(ExtensionType):
- oid = CRLEntryExtensionOID.CERTIFICATE_ISSUER
-
- def __init__(self, general_names: typing.Iterable[GeneralName]) -> None:
- self._general_names = GeneralNames(general_names)
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names")
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[UniformResourceIdentifier]
- | type[RFC822Name],
- ) -> list[str]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[DirectoryName],
- ) -> list[Name]: ...
-
- @typing.overload
- def get_values_for_type(
- self,
- type: type[RegisteredID],
- ) -> list[ObjectIdentifier]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[IPAddress]
- ) -> list[_IPAddressTypes]: ...
-
- @typing.overload
- def get_values_for_type(
- self, type: type[OtherName]
- ) -> list[OtherName]: ...
-
- def get_values_for_type(
- self,
- type: type[DNSName]
- | type[DirectoryName]
- | type[IPAddress]
- | type[OtherName]
- | type[RFC822Name]
- | type[RegisteredID]
- | type[UniformResourceIdentifier],
- ) -> (
- list[_IPAddressTypes]
- | list[str]
- | list[OtherName]
- | list[Name]
- | list[ObjectIdentifier]
- ):
- return self._general_names.get_values_for_type(type)
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CertificateIssuer):
- return NotImplemented
-
- return self._general_names == other._general_names
-
- def __hash__(self) -> int:
- return hash(self._general_names)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CRLReason(ExtensionType):
- oid = CRLEntryExtensionOID.CRL_REASON
-
- def __init__(self, reason: ReasonFlags) -> None:
- if not isinstance(reason, ReasonFlags):
- raise TypeError("reason must be an element from ReasonFlags")
-
- self._reason = reason
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CRLReason):
- return NotImplemented
-
- return self.reason == other.reason
-
- def __hash__(self) -> int:
- return hash(self.reason)
-
- @property
- def reason(self) -> ReasonFlags:
- return self._reason
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class InvalidityDate(ExtensionType):
- oid = CRLEntryExtensionOID.INVALIDITY_DATE
-
- def __init__(self, invalidity_date: datetime.datetime) -> None:
- if not isinstance(invalidity_date, datetime.datetime):
- raise TypeError("invalidity_date must be a datetime.datetime")
-
- self._invalidity_date = invalidity_date
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, InvalidityDate):
- return NotImplemented
-
- return self.invalidity_date == other.invalidity_date
-
- def __hash__(self) -> int:
- return hash(self.invalidity_date)
-
- @property
- def invalidity_date(self) -> datetime.datetime:
- return self._invalidity_date
-
- @property
- def invalidity_date_utc(self) -> datetime.datetime:
- if self._invalidity_date.tzinfo is None:
- return self._invalidity_date.replace(tzinfo=datetime.timezone.utc)
- else:
- return self._invalidity_date.astimezone(tz=datetime.timezone.utc)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class PrecertificateSignedCertificateTimestamps(ExtensionType):
- oid = ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS
-
- def __init__(
- self,
- signed_certificate_timestamps: typing.Iterable[
- SignedCertificateTimestamp
- ],
- ) -> None:
- signed_certificate_timestamps = list(signed_certificate_timestamps)
- if not all(
- isinstance(sct, SignedCertificateTimestamp)
- for sct in signed_certificate_timestamps
- ):
- raise TypeError(
- "Every item in the signed_certificate_timestamps list must be "
- "a SignedCertificateTimestamp"
- )
- self._signed_certificate_timestamps = signed_certificate_timestamps
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_signed_certificate_timestamps"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __hash__(self) -> int:
- return hash(tuple(self._signed_certificate_timestamps))
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PrecertificateSignedCertificateTimestamps):
- return NotImplemented
-
- return (
- self._signed_certificate_timestamps
- == other._signed_certificate_timestamps
- )
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class SignedCertificateTimestamps(ExtensionType):
- oid = ExtensionOID.SIGNED_CERTIFICATE_TIMESTAMPS
-
- def __init__(
- self,
- signed_certificate_timestamps: typing.Iterable[
- SignedCertificateTimestamp
- ],
- ) -> None:
- signed_certificate_timestamps = list(signed_certificate_timestamps)
- if not all(
- isinstance(sct, SignedCertificateTimestamp)
- for sct in signed_certificate_timestamps
- ):
- raise TypeError(
- "Every item in the signed_certificate_timestamps list must be "
- "a SignedCertificateTimestamp"
- )
- self._signed_certificate_timestamps = signed_certificate_timestamps
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_signed_certificate_timestamps"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __hash__(self) -> int:
- return hash(tuple(self._signed_certificate_timestamps))
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SignedCertificateTimestamps):
- return NotImplemented
-
- return (
- self._signed_certificate_timestamps
- == other._signed_certificate_timestamps
- )
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class OCSPNonce(ExtensionType):
- oid = OCSPExtensionOID.NONCE
-
- def __init__(self, nonce: bytes) -> None:
- if not isinstance(nonce, bytes):
- raise TypeError("nonce must be bytes")
-
- self._nonce = nonce
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, OCSPNonce):
- return NotImplemented
-
- return self.nonce == other.nonce
-
- def __hash__(self) -> int:
- return hash(self.nonce)
-
- def __repr__(self) -> str:
- return f""
-
- @property
- def nonce(self) -> bytes:
- return self._nonce
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class OCSPAcceptableResponses(ExtensionType):
- oid = OCSPExtensionOID.ACCEPTABLE_RESPONSES
-
- def __init__(self, responses: typing.Iterable[ObjectIdentifier]) -> None:
- responses = list(responses)
- if any(not isinstance(r, ObjectIdentifier) for r in responses):
- raise TypeError("All responses must be ObjectIdentifiers")
-
- self._responses = responses
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, OCSPAcceptableResponses):
- return NotImplemented
-
- return self._responses == other._responses
-
- def __hash__(self) -> int:
- return hash(tuple(self._responses))
-
- def __repr__(self) -> str:
- return f""
-
- def __iter__(self) -> typing.Iterator[ObjectIdentifier]:
- return iter(self._responses)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class IssuingDistributionPoint(ExtensionType):
- oid = ExtensionOID.ISSUING_DISTRIBUTION_POINT
-
- def __init__(
- self,
- full_name: typing.Iterable[GeneralName] | None,
- relative_name: RelativeDistinguishedName | None,
- only_contains_user_certs: bool,
- only_contains_ca_certs: bool,
- only_some_reasons: frozenset[ReasonFlags] | None,
- indirect_crl: bool,
- only_contains_attribute_certs: bool,
- ) -> None:
- if full_name is not None:
- full_name = list(full_name)
-
- if only_some_reasons and (
- not isinstance(only_some_reasons, frozenset)
- or not all(isinstance(x, ReasonFlags) for x in only_some_reasons)
- ):
- raise TypeError(
- "only_some_reasons must be None or frozenset of ReasonFlags"
- )
-
- if only_some_reasons and (
- ReasonFlags.unspecified in only_some_reasons
- or ReasonFlags.remove_from_crl in only_some_reasons
- ):
- raise ValueError(
- "unspecified and remove_from_crl are not valid reasons in an "
- "IssuingDistributionPoint"
- )
-
- if not (
- isinstance(only_contains_user_certs, bool)
- and isinstance(only_contains_ca_certs, bool)
- and isinstance(indirect_crl, bool)
- and isinstance(only_contains_attribute_certs, bool)
- ):
- raise TypeError(
- "only_contains_user_certs, only_contains_ca_certs, "
- "indirect_crl and only_contains_attribute_certs "
- "must all be boolean."
- )
-
- # Per RFC5280 Section 5.2.5, the Issuing Distribution Point extension
- # in a CRL can have only one of onlyContainsUserCerts,
- # onlyContainsCACerts, onlyContainsAttributeCerts set to TRUE.
- crl_constraints = [
- only_contains_user_certs,
- only_contains_ca_certs,
- only_contains_attribute_certs,
- ]
-
- if len([x for x in crl_constraints if x]) > 1:
- raise ValueError(
- "Only one of the following can be set to True: "
- "only_contains_user_certs, only_contains_ca_certs, "
- "only_contains_attribute_certs"
- )
-
- if not any(
- [
- only_contains_user_certs,
- only_contains_ca_certs,
- indirect_crl,
- only_contains_attribute_certs,
- full_name,
- relative_name,
- only_some_reasons,
- ]
- ):
- raise ValueError(
- "Cannot create empty extension: "
- "if only_contains_user_certs, only_contains_ca_certs, "
- "indirect_crl, and only_contains_attribute_certs are all False"
- ", then either full_name, relative_name, or only_some_reasons "
- "must have a value."
- )
-
- self._only_contains_user_certs = only_contains_user_certs
- self._only_contains_ca_certs = only_contains_ca_certs
- self._indirect_crl = indirect_crl
- self._only_contains_attribute_certs = only_contains_attribute_certs
- self._only_some_reasons = only_some_reasons
- self._full_name = full_name
- self._relative_name = relative_name
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, IssuingDistributionPoint):
- return NotImplemented
-
- return (
- self.full_name == other.full_name
- and self.relative_name == other.relative_name
- and self.only_contains_user_certs == other.only_contains_user_certs
- and self.only_contains_ca_certs == other.only_contains_ca_certs
- and self.only_some_reasons == other.only_some_reasons
- and self.indirect_crl == other.indirect_crl
- and self.only_contains_attribute_certs
- == other.only_contains_attribute_certs
- )
-
- def __hash__(self) -> int:
- return hash(
- (
- self.full_name,
- self.relative_name,
- self.only_contains_user_certs,
- self.only_contains_ca_certs,
- self.only_some_reasons,
- self.indirect_crl,
- self.only_contains_attribute_certs,
- )
- )
-
- @property
- def full_name(self) -> list[GeneralName] | None:
- return self._full_name
-
- @property
- def relative_name(self) -> RelativeDistinguishedName | None:
- return self._relative_name
-
- @property
- def only_contains_user_certs(self) -> bool:
- return self._only_contains_user_certs
-
- @property
- def only_contains_ca_certs(self) -> bool:
- return self._only_contains_ca_certs
-
- @property
- def only_some_reasons(
- self,
- ) -> frozenset[ReasonFlags] | None:
- return self._only_some_reasons
-
- @property
- def indirect_crl(self) -> bool:
- return self._indirect_crl
-
- @property
- def only_contains_attribute_certs(self) -> bool:
- return self._only_contains_attribute_certs
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class MSCertificateTemplate(ExtensionType):
- oid = ExtensionOID.MS_CERTIFICATE_TEMPLATE
-
- def __init__(
- self,
- template_id: ObjectIdentifier,
- major_version: int | None,
- minor_version: int | None,
- ) -> None:
- if not isinstance(template_id, ObjectIdentifier):
- raise TypeError("oid must be an ObjectIdentifier")
- self._template_id = template_id
- if (
- major_version is not None and not isinstance(major_version, int)
- ) or (
- minor_version is not None and not isinstance(minor_version, int)
- ):
- raise TypeError(
- "major_version and minor_version must be integers or None"
- )
- self._major_version = major_version
- self._minor_version = minor_version
-
- @property
- def template_id(self) -> ObjectIdentifier:
- return self._template_id
-
- @property
- def major_version(self) -> int | None:
- return self._major_version
-
- @property
- def minor_version(self) -> int | None:
- return self._minor_version
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, MSCertificateTemplate):
- return NotImplemented
-
- return (
- self.template_id == other.template_id
- and self.major_version == other.major_version
- and self.minor_version == other.minor_version
- )
-
- def __hash__(self) -> int:
- return hash((self.template_id, self.major_version, self.minor_version))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class NamingAuthority:
- def __init__(
- self,
- id: ObjectIdentifier | None,
- url: str | None,
- text: str | None,
- ) -> None:
- if id is not None and not isinstance(id, ObjectIdentifier):
- raise TypeError("id must be an ObjectIdentifier")
-
- if url is not None and not isinstance(url, str):
- raise TypeError("url must be a str")
-
- if text is not None and not isinstance(text, str):
- raise TypeError("text must be a str")
-
- self._id = id
- self._url = url
- self._text = text
-
- @property
- def id(self) -> ObjectIdentifier | None:
- return self._id
-
- @property
- def url(self) -> str | None:
- return self._url
-
- @property
- def text(self) -> str | None:
- return self._text
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, NamingAuthority):
- return NotImplemented
-
- return (
- self.id == other.id
- and self.url == other.url
- and self.text == other.text
- )
-
- def __hash__(self) -> int:
- return hash(
- (
- self.id,
- self.url,
- self.text,
- )
- )
-
-
-class ProfessionInfo:
- def __init__(
- self,
- naming_authority: NamingAuthority | None,
- profession_items: typing.Iterable[str],
- profession_oids: typing.Iterable[ObjectIdentifier] | None,
- registration_number: str | None,
- add_profession_info: bytes | None,
- ) -> None:
- if naming_authority is not None and not isinstance(
- naming_authority, NamingAuthority
- ):
- raise TypeError("naming_authority must be a NamingAuthority")
-
- profession_items = list(profession_items)
- if not all(isinstance(item, str) for item in profession_items):
- raise TypeError(
- "Every item in the profession_items list must be a str"
- )
-
- if profession_oids is not None:
- profession_oids = list(profession_oids)
- if not all(
- isinstance(oid, ObjectIdentifier) for oid in profession_oids
- ):
- raise TypeError(
- "Every item in the profession_oids list must be an "
- "ObjectIdentifier"
- )
-
- if registration_number is not None and not isinstance(
- registration_number, str
- ):
- raise TypeError("registration_number must be a str")
-
- if add_profession_info is not None and not isinstance(
- add_profession_info, bytes
- ):
- raise TypeError("add_profession_info must be bytes")
-
- self._naming_authority = naming_authority
- self._profession_items = profession_items
- self._profession_oids = profession_oids
- self._registration_number = registration_number
- self._add_profession_info = add_profession_info
-
- @property
- def naming_authority(self) -> NamingAuthority | None:
- return self._naming_authority
-
- @property
- def profession_items(self) -> list[str]:
- return self._profession_items
-
- @property
- def profession_oids(self) -> list[ObjectIdentifier] | None:
- return self._profession_oids
-
- @property
- def registration_number(self) -> str | None:
- return self._registration_number
-
- @property
- def add_profession_info(self) -> bytes | None:
- return self._add_profession_info
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, ProfessionInfo):
- return NotImplemented
-
- return (
- self.naming_authority == other.naming_authority
- and self.profession_items == other.profession_items
- and self.profession_oids == other.profession_oids
- and self.registration_number == other.registration_number
- and self.add_profession_info == other.add_profession_info
- )
-
- def __hash__(self) -> int:
- if self.profession_oids is not None:
- profession_oids = tuple(self.profession_oids)
- else:
- profession_oids = None
- return hash(
- (
- self.naming_authority,
- tuple(self.profession_items),
- profession_oids,
- self.registration_number,
- self.add_profession_info,
- )
- )
-
-
-class Admission:
- def __init__(
- self,
- admission_authority: GeneralName | None,
- naming_authority: NamingAuthority | None,
- profession_infos: typing.Iterable[ProfessionInfo],
- ) -> None:
- if admission_authority is not None and not isinstance(
- admission_authority, GeneralName
- ):
- raise TypeError("admission_authority must be a GeneralName")
-
- if naming_authority is not None and not isinstance(
- naming_authority, NamingAuthority
- ):
- raise TypeError("naming_authority must be a NamingAuthority")
-
- profession_infos = list(profession_infos)
- if not all(
- isinstance(info, ProfessionInfo) for info in profession_infos
- ):
- raise TypeError(
- "Every item in the profession_infos list must be a "
- "ProfessionInfo"
- )
-
- self._admission_authority = admission_authority
- self._naming_authority = naming_authority
- self._profession_infos = profession_infos
-
- @property
- def admission_authority(self) -> GeneralName | None:
- return self._admission_authority
-
- @property
- def naming_authority(self) -> NamingAuthority | None:
- return self._naming_authority
-
- @property
- def profession_infos(self) -> list[ProfessionInfo]:
- return self._profession_infos
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Admission):
- return NotImplemented
-
- return (
- self.admission_authority == other.admission_authority
- and self.naming_authority == other.naming_authority
- and self.profession_infos == other.profession_infos
- )
-
- def __hash__(self) -> int:
- return hash(
- (
- self.admission_authority,
- self.naming_authority,
- tuple(self.profession_infos),
- )
- )
-
-
-class Admissions(ExtensionType):
- oid = ExtensionOID.ADMISSIONS
-
- def __init__(
- self,
- authority: GeneralName | None,
- admissions: typing.Iterable[Admission],
- ) -> None:
- if authority is not None and not isinstance(authority, GeneralName):
- raise TypeError("authority must be a GeneralName")
-
- admissions = list(admissions)
- if not all(
- isinstance(admission, Admission) for admission in admissions
- ):
- raise TypeError(
- "Every item in the contents_of_admissions list must be an "
- "Admission"
- )
-
- self._authority = authority
- self._admissions = admissions
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_admissions")
-
- @property
- def authority(self) -> GeneralName | None:
- return self._authority
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Admissions):
- return NotImplemented
-
- return (
- self.authority == other.authority
- and self._admissions == other._admissions
- )
-
- def __hash__(self) -> int:
- return hash((self.authority, tuple(self._admissions)))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class UnrecognizedExtension(ExtensionType):
- def __init__(self, oid: ObjectIdentifier, value: bytes) -> None:
- if not isinstance(oid, ObjectIdentifier):
- raise TypeError("oid must be an ObjectIdentifier")
- self._oid = oid
- self._value = value
-
- @property
- def oid(self) -> ObjectIdentifier: # type: ignore[override]
- return self._oid
-
- @property
- def value(self) -> bytes:
- return self._value
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, UnrecognizedExtension):
- return NotImplemented
-
- return self.oid == other.oid and self.value == other.value
-
- def __hash__(self) -> int:
- return hash((self.oid, self.value))
-
- def public_bytes(self) -> bytes:
- return self.value
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/general_name.py b/resources/python/bin/3.7/linux/cryptography/x509/general_name.py
deleted file mode 100644
index 672f28759..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/general_name.py
+++ /dev/null
@@ -1,281 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import ipaddress
-import typing
-from email.utils import parseaddr
-
-from cryptography.x509.name import Name
-from cryptography.x509.oid import ObjectIdentifier
-
-_IPAddressTypes = typing.Union[
- ipaddress.IPv4Address,
- ipaddress.IPv6Address,
- ipaddress.IPv4Network,
- ipaddress.IPv6Network,
-]
-
-
-class UnsupportedGeneralNameType(Exception):
- pass
-
-
-class GeneralName(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def value(self) -> typing.Any:
- """
- Return the value of the object
- """
-
-
-class RFC822Name(GeneralName):
- def __init__(self, value: str) -> None:
- if isinstance(value, str):
- try:
- value.encode("ascii")
- except UnicodeEncodeError:
- raise ValueError(
- "RFC822Name values should be passed as an A-label string. "
- "This means unicode characters should be encoded via "
- "a library like idna."
- )
- else:
- raise TypeError("value must be string")
-
- name, address = parseaddr(value)
- if name or not address:
- # parseaddr has found a name (e.g. Name ) or the entire
- # value is an empty string.
- raise ValueError("Invalid rfc822name value")
-
- self._value = value
-
- @property
- def value(self) -> str:
- return self._value
-
- @classmethod
- def _init_without_validation(cls, value: str) -> RFC822Name:
- instance = cls.__new__(cls)
- instance._value = value
- return instance
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, RFC822Name):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class DNSName(GeneralName):
- def __init__(self, value: str) -> None:
- if isinstance(value, str):
- try:
- value.encode("ascii")
- except UnicodeEncodeError:
- raise ValueError(
- "DNSName values should be passed as an A-label string. "
- "This means unicode characters should be encoded via "
- "a library like idna."
- )
- else:
- raise TypeError("value must be string")
-
- self._value = value
-
- @property
- def value(self) -> str:
- return self._value
-
- @classmethod
- def _init_without_validation(cls, value: str) -> DNSName:
- instance = cls.__new__(cls)
- instance._value = value
- return instance
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DNSName):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class UniformResourceIdentifier(GeneralName):
- def __init__(self, value: str) -> None:
- if isinstance(value, str):
- try:
- value.encode("ascii")
- except UnicodeEncodeError:
- raise ValueError(
- "URI values should be passed as an A-label string. "
- "This means unicode characters should be encoded via "
- "a library like idna."
- )
- else:
- raise TypeError("value must be string")
-
- self._value = value
-
- @property
- def value(self) -> str:
- return self._value
-
- @classmethod
- def _init_without_validation(cls, value: str) -> UniformResourceIdentifier:
- instance = cls.__new__(cls)
- instance._value = value
- return instance
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, UniformResourceIdentifier):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class DirectoryName(GeneralName):
- def __init__(self, value: Name) -> None:
- if not isinstance(value, Name):
- raise TypeError("value must be a Name")
-
- self._value = value
-
- @property
- def value(self) -> Name:
- return self._value
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DirectoryName):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class RegisteredID(GeneralName):
- def __init__(self, value: ObjectIdentifier) -> None:
- if not isinstance(value, ObjectIdentifier):
- raise TypeError("value must be an ObjectIdentifier")
-
- self._value = value
-
- @property
- def value(self) -> ObjectIdentifier:
- return self._value
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, RegisteredID):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class IPAddress(GeneralName):
- def __init__(self, value: _IPAddressTypes) -> None:
- if not isinstance(
- value,
- (
- ipaddress.IPv4Address,
- ipaddress.IPv6Address,
- ipaddress.IPv4Network,
- ipaddress.IPv6Network,
- ),
- ):
- raise TypeError(
- "value must be an instance of ipaddress.IPv4Address, "
- "ipaddress.IPv6Address, ipaddress.IPv4Network, or "
- "ipaddress.IPv6Network"
- )
-
- self._value = value
-
- @property
- def value(self) -> _IPAddressTypes:
- return self._value
-
- def _packed(self) -> bytes:
- if isinstance(
- self.value, (ipaddress.IPv4Address, ipaddress.IPv6Address)
- ):
- return self.value.packed
- else:
- return (
- self.value.network_address.packed + self.value.netmask.packed
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, IPAddress):
- return NotImplemented
-
- return self.value == other.value
-
- def __hash__(self) -> int:
- return hash(self.value)
-
-
-class OtherName(GeneralName):
- def __init__(self, type_id: ObjectIdentifier, value: bytes) -> None:
- if not isinstance(type_id, ObjectIdentifier):
- raise TypeError("type_id must be an ObjectIdentifier")
- if not isinstance(value, bytes):
- raise TypeError("value must be a binary string")
-
- self._type_id = type_id
- self._value = value
-
- @property
- def type_id(self) -> ObjectIdentifier:
- return self._type_id
-
- @property
- def value(self) -> bytes:
- return self._value
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, OtherName):
- return NotImplemented
-
- return self.type_id == other.type_id and self.value == other.value
-
- def __hash__(self) -> int:
- return hash((self.type_id, self.value))
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/name.py b/resources/python/bin/3.7/linux/cryptography/x509/name.py
deleted file mode 100644
index 1b6b89d12..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/name.py
+++ /dev/null
@@ -1,465 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import binascii
-import re
-import sys
-import typing
-import warnings
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.x509.oid import NameOID, ObjectIdentifier
-
-
-class _ASN1Type(utils.Enum):
- BitString = 3
- OctetString = 4
- UTF8String = 12
- NumericString = 18
- PrintableString = 19
- T61String = 20
- IA5String = 22
- UTCTime = 23
- GeneralizedTime = 24
- VisibleString = 26
- UniversalString = 28
- BMPString = 30
-
-
-_ASN1_TYPE_TO_ENUM = {i.value: i for i in _ASN1Type}
-_NAMEOID_DEFAULT_TYPE: dict[ObjectIdentifier, _ASN1Type] = {
- NameOID.COUNTRY_NAME: _ASN1Type.PrintableString,
- NameOID.JURISDICTION_COUNTRY_NAME: _ASN1Type.PrintableString,
- NameOID.SERIAL_NUMBER: _ASN1Type.PrintableString,
- NameOID.DN_QUALIFIER: _ASN1Type.PrintableString,
- NameOID.EMAIL_ADDRESS: _ASN1Type.IA5String,
- NameOID.DOMAIN_COMPONENT: _ASN1Type.IA5String,
-}
-
-# Type alias
-_OidNameMap = typing.Mapping[ObjectIdentifier, str]
-_NameOidMap = typing.Mapping[str, ObjectIdentifier]
-
-#: Short attribute names from RFC 4514:
-#: https://tools.ietf.org/html/rfc4514#page-7
-_NAMEOID_TO_NAME: _OidNameMap = {
- NameOID.COMMON_NAME: "CN",
- NameOID.LOCALITY_NAME: "L",
- NameOID.STATE_OR_PROVINCE_NAME: "ST",
- NameOID.ORGANIZATION_NAME: "O",
- NameOID.ORGANIZATIONAL_UNIT_NAME: "OU",
- NameOID.COUNTRY_NAME: "C",
- NameOID.STREET_ADDRESS: "STREET",
- NameOID.DOMAIN_COMPONENT: "DC",
- NameOID.USER_ID: "UID",
-}
-_NAME_TO_NAMEOID = {v: k for k, v in _NAMEOID_TO_NAME.items()}
-
-_NAMEOID_LENGTH_LIMIT = {
- NameOID.COUNTRY_NAME: (2, 2),
- NameOID.JURISDICTION_COUNTRY_NAME: (2, 2),
- NameOID.COMMON_NAME: (1, 64),
-}
-
-
-def _escape_dn_value(val: str | bytes) -> str:
- """Escape special characters in RFC4514 Distinguished Name value."""
-
- if not val:
- return ""
-
- # RFC 4514 Section 2.4 defines the value as being the # (U+0023) character
- # followed by the hexadecimal encoding of the octets.
- if isinstance(val, bytes):
- return "#" + binascii.hexlify(val).decode("utf8")
-
- # See https://tools.ietf.org/html/rfc4514#section-2.4
- val = val.replace("\\", "\\\\")
- val = val.replace('"', '\\"')
- val = val.replace("+", "\\+")
- val = val.replace(",", "\\,")
- val = val.replace(";", "\\;")
- val = val.replace("<", "\\<")
- val = val.replace(">", "\\>")
- val = val.replace("\0", "\\00")
-
- if val[0] in ("#", " "):
- val = "\\" + val
- if val[-1] == " ":
- val = val[:-1] + "\\ "
-
- return val
-
-
-def _unescape_dn_value(val: str) -> str:
- if not val:
- return ""
-
- # See https://tools.ietf.org/html/rfc4514#section-3
-
- # special = escaped / SPACE / SHARP / EQUALS
- # escaped = DQUOTE / PLUS / COMMA / SEMI / LANGLE / RANGLE
- def sub(m):
- val = m.group(1)
- # Regular escape
- if len(val) == 1:
- return val
- # Hex-value scape
- return chr(int(val, 16))
-
- return _RFC4514NameParser._PAIR_RE.sub(sub, val)
-
-
-class NameAttribute:
- def __init__(
- self,
- oid: ObjectIdentifier,
- value: str | bytes,
- _type: _ASN1Type | None = None,
- *,
- _validate: bool = True,
- ) -> None:
- if not isinstance(oid, ObjectIdentifier):
- raise TypeError(
- "oid argument must be an ObjectIdentifier instance."
- )
- if _type == _ASN1Type.BitString:
- if oid != NameOID.X500_UNIQUE_IDENTIFIER:
- raise TypeError(
- "oid must be X500_UNIQUE_IDENTIFIER for BitString type."
- )
- if not isinstance(value, bytes):
- raise TypeError("value must be bytes for BitString")
- else:
- if not isinstance(value, str):
- raise TypeError("value argument must be a str")
-
- length_limits = _NAMEOID_LENGTH_LIMIT.get(oid)
- if length_limits is not None:
- min_length, max_length = length_limits
- assert isinstance(value, str)
- c_len = len(value.encode("utf8"))
- if c_len < min_length or c_len > max_length:
- msg = (
- f"Attribute's length must be >= {min_length} and "
- f"<= {max_length}, but it was {c_len}"
- )
- if _validate is True:
- raise ValueError(msg)
- else:
- warnings.warn(msg, stacklevel=2)
-
- # The appropriate ASN1 string type varies by OID and is defined across
- # multiple RFCs including 2459, 3280, and 5280. In general UTF8String
- # is preferred (2459), but 3280 and 5280 specify several OIDs with
- # alternate types. This means when we see the sentinel value we need
- # to look up whether the OID has a non-UTF8 type. If it does, set it
- # to that. Otherwise, UTF8!
- if _type is None:
- _type = _NAMEOID_DEFAULT_TYPE.get(oid, _ASN1Type.UTF8String)
-
- if not isinstance(_type, _ASN1Type):
- raise TypeError("_type must be from the _ASN1Type enum")
-
- self._oid = oid
- self._value = value
- self._type = _type
-
- @property
- def oid(self) -> ObjectIdentifier:
- return self._oid
-
- @property
- def value(self) -> str | bytes:
- return self._value
-
- @property
- def rfc4514_attribute_name(self) -> str:
- """
- The short attribute name (for example "CN") if available,
- otherwise the OID dotted string.
- """
- return _NAMEOID_TO_NAME.get(self.oid, self.oid.dotted_string)
-
- def rfc4514_string(
- self, attr_name_overrides: _OidNameMap | None = None
- ) -> str:
- """
- Format as RFC4514 Distinguished Name string.
-
- Use short attribute name if available, otherwise fall back to OID
- dotted string.
- """
- attr_name = (
- attr_name_overrides.get(self.oid) if attr_name_overrides else None
- )
- if attr_name is None:
- attr_name = self.rfc4514_attribute_name
-
- return f"{attr_name}={_escape_dn_value(self.value)}"
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, NameAttribute):
- return NotImplemented
-
- return self.oid == other.oid and self.value == other.value
-
- def __hash__(self) -> int:
- return hash((self.oid, self.value))
-
- def __repr__(self) -> str:
- return f""
-
-
-class RelativeDistinguishedName:
- def __init__(self, attributes: typing.Iterable[NameAttribute]):
- attributes = list(attributes)
- if not attributes:
- raise ValueError("a relative distinguished name cannot be empty")
- if not all(isinstance(x, NameAttribute) for x in attributes):
- raise TypeError("attributes must be an iterable of NameAttribute")
-
- # Keep list and frozenset to preserve attribute order where it matters
- self._attributes = attributes
- self._attribute_set = frozenset(attributes)
-
- if len(self._attribute_set) != len(attributes):
- raise ValueError("duplicate attributes are not allowed")
-
- def get_attributes_for_oid(
- self, oid: ObjectIdentifier
- ) -> list[NameAttribute]:
- return [i for i in self if i.oid == oid]
-
- def rfc4514_string(
- self, attr_name_overrides: _OidNameMap | None = None
- ) -> str:
- """
- Format as RFC4514 Distinguished Name string.
-
- Within each RDN, attributes are joined by '+', although that is rarely
- used in certificates.
- """
- return "+".join(
- attr.rfc4514_string(attr_name_overrides)
- for attr in self._attributes
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, RelativeDistinguishedName):
- return NotImplemented
-
- return self._attribute_set == other._attribute_set
-
- def __hash__(self) -> int:
- return hash(self._attribute_set)
-
- def __iter__(self) -> typing.Iterator[NameAttribute]:
- return iter(self._attributes)
-
- def __len__(self) -> int:
- return len(self._attributes)
-
- def __repr__(self) -> str:
- return f""
-
-
-class Name:
- @typing.overload
- def __init__(self, attributes: typing.Iterable[NameAttribute]) -> None: ...
-
- @typing.overload
- def __init__(
- self, attributes: typing.Iterable[RelativeDistinguishedName]
- ) -> None: ...
-
- def __init__(
- self,
- attributes: typing.Iterable[NameAttribute | RelativeDistinguishedName],
- ) -> None:
- attributes = list(attributes)
- if all(isinstance(x, NameAttribute) for x in attributes):
- self._attributes = [
- RelativeDistinguishedName([typing.cast(NameAttribute, x)])
- for x in attributes
- ]
- elif all(isinstance(x, RelativeDistinguishedName) for x in attributes):
- self._attributes = typing.cast(
- typing.List[RelativeDistinguishedName], attributes
- )
- else:
- raise TypeError(
- "attributes must be a list of NameAttribute"
- " or a list RelativeDistinguishedName"
- )
-
- @classmethod
- def from_rfc4514_string(
- cls,
- data: str,
- attr_name_overrides: _NameOidMap | None = None,
- ) -> Name:
- return _RFC4514NameParser(data, attr_name_overrides or {}).parse()
-
- def rfc4514_string(
- self, attr_name_overrides: _OidNameMap | None = None
- ) -> str:
- """
- Format as RFC4514 Distinguished Name string.
- For example 'CN=foobar.com,O=Foo Corp,C=US'
-
- An X.509 name is a two-level structure: a list of sets of attributes.
- Each list element is separated by ',' and within each list element, set
- elements are separated by '+'. The latter is almost never used in
- real world certificates. According to RFC4514 section 2.1 the
- RDNSequence must be reversed when converting to string representation.
- """
- return ",".join(
- attr.rfc4514_string(attr_name_overrides)
- for attr in reversed(self._attributes)
- )
-
- def get_attributes_for_oid(
- self, oid: ObjectIdentifier
- ) -> list[NameAttribute]:
- return [i for i in self if i.oid == oid]
-
- @property
- def rdns(self) -> list[RelativeDistinguishedName]:
- return self._attributes
-
- def public_bytes(self, backend: typing.Any = None) -> bytes:
- return rust_x509.encode_name_bytes(self)
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Name):
- return NotImplemented
-
- return self._attributes == other._attributes
-
- def __hash__(self) -> int:
- # TODO: this is relatively expensive, if this looks like a bottleneck
- # for you, consider optimizing!
- return hash(tuple(self._attributes))
-
- def __iter__(self) -> typing.Iterator[NameAttribute]:
- for rdn in self._attributes:
- yield from rdn
-
- def __len__(self) -> int:
- return sum(len(rdn) for rdn in self._attributes)
-
- def __repr__(self) -> str:
- rdns = ",".join(attr.rfc4514_string() for attr in self._attributes)
- return f""
-
-
-class _RFC4514NameParser:
- _OID_RE = re.compile(r"(0|([1-9]\d*))(\.(0|([1-9]\d*)))+")
- _DESCR_RE = re.compile(r"[a-zA-Z][a-zA-Z\d-]*")
-
- _PAIR = r"\\([\\ #=\"\+,;<>]|[\da-zA-Z]{2})"
- _PAIR_RE = re.compile(_PAIR)
- _LUTF1 = r"[\x01-\x1f\x21\x24-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]"
- _SUTF1 = r"[\x01-\x21\x23-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]"
- _TUTF1 = r"[\x01-\x1F\x21\x23-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]"
- _UTFMB = rf"[\x80-{chr(sys.maxunicode)}]"
- _LEADCHAR = rf"{_LUTF1}|{_UTFMB}"
- _STRINGCHAR = rf"{_SUTF1}|{_UTFMB}"
- _TRAILCHAR = rf"{_TUTF1}|{_UTFMB}"
- _STRING_RE = re.compile(
- rf"""
- (
- ({_LEADCHAR}|{_PAIR})
- (
- ({_STRINGCHAR}|{_PAIR})*
- ({_TRAILCHAR}|{_PAIR})
- )?
- )?
- """,
- re.VERBOSE,
- )
- _HEXSTRING_RE = re.compile(r"#([\da-zA-Z]{2})+")
-
- def __init__(self, data: str, attr_name_overrides: _NameOidMap) -> None:
- self._data = data
- self._idx = 0
-
- self._attr_name_overrides = attr_name_overrides
-
- def _has_data(self) -> bool:
- return self._idx < len(self._data)
-
- def _peek(self) -> str | None:
- if self._has_data():
- return self._data[self._idx]
- return None
-
- def _read_char(self, ch: str) -> None:
- if self._peek() != ch:
- raise ValueError
- self._idx += 1
-
- def _read_re(self, pat) -> str:
- match = pat.match(self._data, pos=self._idx)
- if match is None:
- raise ValueError
- val = match.group()
- self._idx += len(val)
- return val
-
- def parse(self) -> Name:
- """
- Parses the `data` string and converts it to a Name.
-
- According to RFC4514 section 2.1 the RDNSequence must be
- reversed when converting to string representation. So, when
- we parse it, we need to reverse again to get the RDNs on the
- correct order.
- """
-
- if not self._has_data():
- return Name([])
-
- rdns = [self._parse_rdn()]
-
- while self._has_data():
- self._read_char(",")
- rdns.append(self._parse_rdn())
-
- return Name(reversed(rdns))
-
- def _parse_rdn(self) -> RelativeDistinguishedName:
- nas = [self._parse_na()]
- while self._peek() == "+":
- self._read_char("+")
- nas.append(self._parse_na())
-
- return RelativeDistinguishedName(nas)
-
- def _parse_na(self) -> NameAttribute:
- try:
- oid_value = self._read_re(self._OID_RE)
- except ValueError:
- name = self._read_re(self._DESCR_RE)
- oid = self._attr_name_overrides.get(
- name, _NAME_TO_NAMEOID.get(name)
- )
- if oid is None:
- raise ValueError
- else:
- oid = ObjectIdentifier(oid_value)
-
- self._read_char("=")
- if self._peek() == "#":
- value = self._read_re(self._HEXSTRING_RE)
- value = binascii.unhexlify(value[1:]).decode()
- else:
- raw_value = self._read_re(self._STRING_RE)
- value = _unescape_dn_value(raw_value)
-
- return NameAttribute(oid, value)
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/ocsp.py b/resources/python/bin/3.7/linux/cryptography/x509/ocsp.py
deleted file mode 100644
index 5a011c412..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/ocsp.py
+++ /dev/null
@@ -1,344 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import datetime
-import typing
-
-from cryptography import utils, x509
-from cryptography.hazmat.bindings._rust import ocsp
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPrivateKeyTypes,
-)
-from cryptography.x509.base import (
- _EARLIEST_UTC_TIME,
- _convert_to_naive_utc_time,
- _reject_duplicate_extension,
-)
-
-
-class OCSPResponderEncoding(utils.Enum):
- HASH = "By Hash"
- NAME = "By Name"
-
-
-class OCSPResponseStatus(utils.Enum):
- SUCCESSFUL = 0
- MALFORMED_REQUEST = 1
- INTERNAL_ERROR = 2
- TRY_LATER = 3
- SIG_REQUIRED = 5
- UNAUTHORIZED = 6
-
-
-_ALLOWED_HASHES = (
- hashes.SHA1,
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
-)
-
-
-def _verify_algorithm(algorithm: hashes.HashAlgorithm) -> None:
- if not isinstance(algorithm, _ALLOWED_HASHES):
- raise ValueError(
- "Algorithm must be SHA1, SHA224, SHA256, SHA384, or SHA512"
- )
-
-
-class OCSPCertStatus(utils.Enum):
- GOOD = 0
- REVOKED = 1
- UNKNOWN = 2
-
-
-class _SingleResponse:
- def __init__(
- self,
- cert: x509.Certificate,
- issuer: x509.Certificate,
- algorithm: hashes.HashAlgorithm,
- cert_status: OCSPCertStatus,
- this_update: datetime.datetime,
- next_update: datetime.datetime | None,
- revocation_time: datetime.datetime | None,
- revocation_reason: x509.ReasonFlags | None,
- ):
- if not isinstance(cert, x509.Certificate) or not isinstance(
- issuer, x509.Certificate
- ):
- raise TypeError("cert and issuer must be a Certificate")
-
- _verify_algorithm(algorithm)
- if not isinstance(this_update, datetime.datetime):
- raise TypeError("this_update must be a datetime object")
- if next_update is not None and not isinstance(
- next_update, datetime.datetime
- ):
- raise TypeError("next_update must be a datetime object or None")
-
- self._cert = cert
- self._issuer = issuer
- self._algorithm = algorithm
- self._this_update = this_update
- self._next_update = next_update
-
- if not isinstance(cert_status, OCSPCertStatus):
- raise TypeError(
- "cert_status must be an item from the OCSPCertStatus enum"
- )
- if cert_status is not OCSPCertStatus.REVOKED:
- if revocation_time is not None:
- raise ValueError(
- "revocation_time can only be provided if the certificate "
- "is revoked"
- )
- if revocation_reason is not None:
- raise ValueError(
- "revocation_reason can only be provided if the certificate"
- " is revoked"
- )
- else:
- if not isinstance(revocation_time, datetime.datetime):
- raise TypeError("revocation_time must be a datetime object")
-
- revocation_time = _convert_to_naive_utc_time(revocation_time)
- if revocation_time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The revocation_time must be on or after"
- " 1950 January 1."
- )
-
- if revocation_reason is not None and not isinstance(
- revocation_reason, x509.ReasonFlags
- ):
- raise TypeError(
- "revocation_reason must be an item from the ReasonFlags "
- "enum or None"
- )
-
- self._cert_status = cert_status
- self._revocation_time = revocation_time
- self._revocation_reason = revocation_reason
-
-
-OCSPRequest = ocsp.OCSPRequest
-OCSPResponse = ocsp.OCSPResponse
-OCSPSingleResponse = ocsp.OCSPSingleResponse
-
-
-class OCSPRequestBuilder:
- def __init__(
- self,
- request: tuple[
- x509.Certificate, x509.Certificate, hashes.HashAlgorithm
- ]
- | None = None,
- request_hash: tuple[bytes, bytes, int, hashes.HashAlgorithm]
- | None = None,
- extensions: list[x509.Extension[x509.ExtensionType]] = [],
- ) -> None:
- self._request = request
- self._request_hash = request_hash
- self._extensions = extensions
-
- def add_certificate(
- self,
- cert: x509.Certificate,
- issuer: x509.Certificate,
- algorithm: hashes.HashAlgorithm,
- ) -> OCSPRequestBuilder:
- if self._request is not None or self._request_hash is not None:
- raise ValueError("Only one certificate can be added to a request")
-
- _verify_algorithm(algorithm)
- if not isinstance(cert, x509.Certificate) or not isinstance(
- issuer, x509.Certificate
- ):
- raise TypeError("cert and issuer must be a Certificate")
-
- return OCSPRequestBuilder(
- (cert, issuer, algorithm), self._request_hash, self._extensions
- )
-
- def add_certificate_by_hash(
- self,
- issuer_name_hash: bytes,
- issuer_key_hash: bytes,
- serial_number: int,
- algorithm: hashes.HashAlgorithm,
- ) -> OCSPRequestBuilder:
- if self._request is not None or self._request_hash is not None:
- raise ValueError("Only one certificate can be added to a request")
-
- if not isinstance(serial_number, int):
- raise TypeError("serial_number must be an integer")
-
- _verify_algorithm(algorithm)
- utils._check_bytes("issuer_name_hash", issuer_name_hash)
- utils._check_bytes("issuer_key_hash", issuer_key_hash)
- if algorithm.digest_size != len(
- issuer_name_hash
- ) or algorithm.digest_size != len(issuer_key_hash):
- raise ValueError(
- "issuer_name_hash and issuer_key_hash must be the same length "
- "as the digest size of the algorithm"
- )
-
- return OCSPRequestBuilder(
- self._request,
- (issuer_name_hash, issuer_key_hash, serial_number, algorithm),
- self._extensions,
- )
-
- def add_extension(
- self, extval: x509.ExtensionType, critical: bool
- ) -> OCSPRequestBuilder:
- if not isinstance(extval, x509.ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = x509.Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return OCSPRequestBuilder(
- self._request, self._request_hash, [*self._extensions, extension]
- )
-
- def build(self) -> OCSPRequest:
- if self._request is None and self._request_hash is None:
- raise ValueError("You must add a certificate before building")
-
- return ocsp.create_ocsp_request(self)
-
-
-class OCSPResponseBuilder:
- def __init__(
- self,
- response: _SingleResponse | None = None,
- responder_id: tuple[x509.Certificate, OCSPResponderEncoding]
- | None = None,
- certs: list[x509.Certificate] | None = None,
- extensions: list[x509.Extension[x509.ExtensionType]] = [],
- ):
- self._response = response
- self._responder_id = responder_id
- self._certs = certs
- self._extensions = extensions
-
- def add_response(
- self,
- cert: x509.Certificate,
- issuer: x509.Certificate,
- algorithm: hashes.HashAlgorithm,
- cert_status: OCSPCertStatus,
- this_update: datetime.datetime,
- next_update: datetime.datetime | None,
- revocation_time: datetime.datetime | None,
- revocation_reason: x509.ReasonFlags | None,
- ) -> OCSPResponseBuilder:
- if self._response is not None:
- raise ValueError("Only one response per OCSPResponse.")
-
- singleresp = _SingleResponse(
- cert,
- issuer,
- algorithm,
- cert_status,
- this_update,
- next_update,
- revocation_time,
- revocation_reason,
- )
- return OCSPResponseBuilder(
- singleresp,
- self._responder_id,
- self._certs,
- self._extensions,
- )
-
- def responder_id(
- self, encoding: OCSPResponderEncoding, responder_cert: x509.Certificate
- ) -> OCSPResponseBuilder:
- if self._responder_id is not None:
- raise ValueError("responder_id can only be set once")
- if not isinstance(responder_cert, x509.Certificate):
- raise TypeError("responder_cert must be a Certificate")
- if not isinstance(encoding, OCSPResponderEncoding):
- raise TypeError(
- "encoding must be an element from OCSPResponderEncoding"
- )
-
- return OCSPResponseBuilder(
- self._response,
- (responder_cert, encoding),
- self._certs,
- self._extensions,
- )
-
- def certificates(
- self, certs: typing.Iterable[x509.Certificate]
- ) -> OCSPResponseBuilder:
- if self._certs is not None:
- raise ValueError("certificates may only be set once")
- certs = list(certs)
- if len(certs) == 0:
- raise ValueError("certs must not be an empty list")
- if not all(isinstance(x, x509.Certificate) for x in certs):
- raise TypeError("certs must be a list of Certificates")
- return OCSPResponseBuilder(
- self._response,
- self._responder_id,
- certs,
- self._extensions,
- )
-
- def add_extension(
- self, extval: x509.ExtensionType, critical: bool
- ) -> OCSPResponseBuilder:
- if not isinstance(extval, x509.ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = x509.Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return OCSPResponseBuilder(
- self._response,
- self._responder_id,
- self._certs,
- [*self._extensions, extension],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: hashes.HashAlgorithm | None,
- ) -> OCSPResponse:
- if self._response is None:
- raise ValueError("You must add a response before signing")
- if self._responder_id is None:
- raise ValueError("You must add a responder_id before signing")
-
- return ocsp.create_ocsp_response(
- OCSPResponseStatus.SUCCESSFUL, self, private_key, algorithm
- )
-
- @classmethod
- def build_unsuccessful(
- cls, response_status: OCSPResponseStatus
- ) -> OCSPResponse:
- if not isinstance(response_status, OCSPResponseStatus):
- raise TypeError(
- "response_status must be an item from OCSPResponseStatus"
- )
- if response_status is OCSPResponseStatus.SUCCESSFUL:
- raise ValueError("response_status cannot be SUCCESSFUL")
-
- return ocsp.create_ocsp_response(response_status, None, None, None)
-
-
-load_der_ocsp_request = ocsp.load_der_ocsp_request
-load_der_ocsp_response = ocsp.load_der_ocsp_response
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/oid.py b/resources/python/bin/3.7/linux/cryptography/x509/oid.py
deleted file mode 100644
index d4e409e0a..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/oid.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat._oid import (
- AttributeOID,
- AuthorityInformationAccessOID,
- CertificatePoliciesOID,
- CRLEntryExtensionOID,
- ExtendedKeyUsageOID,
- ExtensionOID,
- NameOID,
- ObjectIdentifier,
- OCSPExtensionOID,
- PublicKeyAlgorithmOID,
- SignatureAlgorithmOID,
- SubjectInformationAccessOID,
-)
-
-__all__ = [
- "AttributeOID",
- "AuthorityInformationAccessOID",
- "CRLEntryExtensionOID",
- "CertificatePoliciesOID",
- "ExtendedKeyUsageOID",
- "ExtensionOID",
- "NameOID",
- "OCSPExtensionOID",
- "ObjectIdentifier",
- "PublicKeyAlgorithmOID",
- "SignatureAlgorithmOID",
- "SubjectInformationAccessOID",
-]
diff --git a/resources/python/bin/3.7/linux/cryptography/x509/verification.py b/resources/python/bin/3.7/linux/cryptography/x509/verification.py
deleted file mode 100644
index b83650681..000000000
--- a/resources/python/bin/3.7/linux/cryptography/x509/verification.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.x509.general_name import DNSName, IPAddress
-
-__all__ = [
- "ClientVerifier",
- "PolicyBuilder",
- "ServerVerifier",
- "Store",
- "Subject",
- "VerificationError",
- "VerifiedClient",
-]
-
-Store = rust_x509.Store
-Subject = typing.Union[DNSName, IPAddress]
-VerifiedClient = rust_x509.VerifiedClient
-ClientVerifier = rust_x509.ClientVerifier
-ServerVerifier = rust_x509.ServerVerifier
-PolicyBuilder = rust_x509.PolicyBuilder
-VerificationError = rust_x509.VerificationError
diff --git a/resources/python/bin/3.7/linux/rust/Cargo.toml b/resources/python/bin/3.7/linux/rust/Cargo.toml
deleted file mode 100644
index 9eb165a96..000000000
--- a/resources/python/bin/3.7/linux/rust/Cargo.toml
+++ /dev/null
@@ -1,35 +0,0 @@
-[package]
-name = "cryptography-rust"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-once_cell = "1"
-cfg-if = "1"
-pyo3.workspace = true
-asn1.workspace = true
-cryptography-cffi = { path = "cryptography-cffi" }
-cryptography-keepalive = { path = "cryptography-keepalive" }
-cryptography-key-parsing = { path = "cryptography-key-parsing" }
-cryptography-x509 = { path = "cryptography-x509" }
-cryptography-x509-verification = { path = "cryptography-x509-verification" }
-cryptography-openssl = { path = "cryptography-openssl" }
-pem = { version = "3", default-features = false }
-openssl = "0.10.68"
-openssl-sys = "0.9.104"
-foreign-types-shared = "0.1"
-self_cell = "1"
-
-[features]
-extension-module = ["pyo3/extension-module"]
-default = ["extension-module"]
-
-[lib]
-name = "cryptography_rust"
-crate-type = ["cdylib"]
-
-[lints.rust]
-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_OPENSSL_300_OR_GREATER)', 'cfg(CRYPTOGRAPHY_OPENSSL_309_OR_GREATER)', 'cfg(CRYPTOGRAPHY_OPENSSL_320_OR_GREATER)', 'cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)', 'cfg(CRYPTOGRAPHY_OSSLCONF, values("OPENSSL_NO_IDEA", "OPENSSL_NO_CAST", "OPENSSL_NO_BF", "OPENSSL_NO_CAMELLIA", "OPENSSL_NO_SEED", "OPENSSL_NO_SM4"))'] }
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-cffi/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-cffi/Cargo.toml
deleted file mode 100644
index 9408de8b4..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-cffi/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "cryptography-cffi"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-pyo3.workspace = true
-openssl-sys = "0.9.104"
-
-[build-dependencies]
-cc = "1.2.1"
-
-[lints.rust]
-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(python_implementation, values("CPython", "PyPy"))'] }
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-keepalive/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-keepalive/Cargo.toml
deleted file mode 100644
index baf8d9342..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-keepalive/Cargo.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[package]
-name = "cryptography-keepalive"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-pyo3.workspace = true
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-key-parsing/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-key-parsing/Cargo.toml
deleted file mode 100644
index 9b96b736c..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-key-parsing/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "cryptography-key-parsing"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-asn1.workspace = true
-cfg-if = "1"
-openssl = "0.10.68"
-openssl-sys = "0.9.104"
-cryptography-x509 = { path = "../cryptography-x509" }
-
-[lints.rust]
-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)'] }
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-openssl/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-openssl/Cargo.toml
deleted file mode 100644
index 3d4c17eba..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-openssl/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "cryptography-openssl"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-cfg-if = "1"
-openssl = "0.10.68"
-ffi = { package = "openssl-sys", version = "0.9.101" }
-foreign-types = "0.3"
-foreign-types-shared = "0.1"
-
-[lints.rust]
-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_OPENSSL_300_OR_GREATER)', 'cfg(CRYPTOGRAPHY_OPENSSL_320_OR_GREATER)', 'cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)'] }
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-x509-verification/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-x509-verification/Cargo.toml
deleted file mode 100644
index 2cc2ff488..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-x509-verification/Cargo.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[package]
-name = "cryptography-x509-verification"
-version.workspace = true
-authors.workspace = true
-edition.workspace = true
-publish.workspace = true
-rust-version.workspace = true
-
-[dependencies]
-asn1.workspace = true
-cryptography-x509 = { path = "../cryptography-x509" }
-cryptography-key-parsing = { path = "../cryptography-key-parsing" }
-once_cell = "1"
-
-[dev-dependencies]
-pem = { version = "3", default-features = false }
diff --git a/resources/python/bin/3.7/linux/rust/cryptography-x509/Cargo.toml b/resources/python/bin/3.7/linux/rust/cryptography-x509/Cargo.toml
deleted file mode 100644
index 03f2c2608..000000000
--- a/resources/python/bin/3.7/linux/rust/cryptography-x509/Cargo.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[package]
-name = "cryptography-x509"
-version = "0.1.0"
-authors = ["The cryptography developers "]
-edition = "2021"
-publish = false
-# This specifies the MSRV
-rust-version = "1.65.0"
-
-[dependencies]
-asn1.workspace = true
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2-py3.7-nspkg.pth b/resources/python/bin/3.7/linux/zope.interface-6.4.post2-py3.7-nspkg.pth
deleted file mode 100644
index 4fa827e25..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2-py3.7-nspkg.pth
+++ /dev/null
@@ -1 +0,0 @@
-import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('zope',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('zope', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('zope', [os.path.dirname(p)])));m = m or sys.modules.setdefault('zope', types.ModuleType('zope'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/INSTALLER b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/LICENSE.txt b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/LICENSE.txt
deleted file mode 100644
index e1f9ad7b3..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/LICENSE.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-Zope Public License (ZPL) Version 2.1
-
-A copyright notice accompanies this license document that identifies the
-copyright holders.
-
-This license has been certified as open source. It has also been designated as
-GPL compatible by the Free Software Foundation (FSF).
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions in source code must retain the accompanying copyright
-notice, this list of conditions, and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the accompanying copyright
-notice, this list of conditions, and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-3. Names of the copyright holders must not be used to endorse or promote
-products derived from this software without prior written permission from the
-copyright holders.
-
-4. The right to distribute this software or to use it for any purpose does not
-give you the right to use Servicemarks (sm) or Trademarks (tm) of the
-copyright
-holders. Use of them is covered by separate agreement with the copyright
-holders.
-
-5. If any files are modified, you must cause the modified files to carry
-prominent notices stating that you changed the files and the date of any
-change.
-
-Disclaimer
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/METADATA b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/METADATA
deleted file mode 100644
index 58a1b3d75..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/METADATA
+++ /dev/null
@@ -1,1167 +0,0 @@
-Metadata-Version: 2.1
-Name: zope.interface
-Version: 6.4.post2
-Summary: Interfaces for Python
-Home-page: https://github.com/zopefoundation/zope.interface
-Author: Zope Foundation and Contributors
-Author-email: zope-dev@zope.org
-License: ZPL 2.1
-Keywords: interface,components,plugins
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Zope Public License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Framework :: Zope :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=3.7
-License-File: LICENSE.txt
-Requires-Dist: setuptools
-Provides-Extra: docs
-Requires-Dist: Sphinx ; extra == 'docs'
-Requires-Dist: repoze.sphinx.autointerface ; extra == 'docs'
-Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
-Provides-Extra: test
-Requires-Dist: coverage >=5.0.3 ; extra == 'test'
-Requires-Dist: zope.event ; extra == 'test'
-Requires-Dist: zope.testing ; extra == 'test'
-Provides-Extra: testing
-Requires-Dist: coverage >=5.0.3 ; extra == 'testing'
-Requires-Dist: zope.event ; extra == 'testing'
-Requires-Dist: zope.testing ; extra == 'testing'
-
-====================
- ``zope.interface``
-====================
-
-.. image:: https://img.shields.io/pypi/v/zope.interface.svg
- :target: https://pypi.python.org/pypi/zope.interface/
- :alt: Latest Version
-
-.. image:: https://img.shields.io/pypi/pyversions/zope.interface.svg
- :target: https://pypi.org/project/zope.interface/
- :alt: Supported Python versions
-
-.. image:: https://github.com/zopefoundation/zope.interface/actions/workflows/tests.yml/badge.svg
- :target: https://github.com/zopefoundation/zope.interface/actions/workflows/tests.yml
-
-.. image:: https://readthedocs.org/projects/zopeinterface/badge/?version=latest
- :target: https://zopeinterface.readthedocs.io/en/latest/
- :alt: Documentation Status
-
-This package is intended to be independently reusable in any Python
-project. It is maintained by the `Zope Toolkit project
-`_.
-
-This package provides an implementation of "object interfaces" for Python.
-Interfaces are a mechanism for labeling objects as conforming to a given
-API or contract. So, this package can be considered as implementation of
-the `Design By Contract`_ methodology support in Python.
-
-.. _Design By Contract: http://en.wikipedia.org/wiki/Design_by_contract
-
-For detailed documentation, please see https://zopeinterface.readthedocs.io/en/latest/
-
-=========
- Changes
-=========
-
-6.4.post2 (unreleased)
-======================
-
-- Publish missing Windows wheels, second attempt.
- (`#295 `_)
-
-
-6.4.post1 (2024-05-23)
-======================
-
-- Publish missing Windows wheels.
- (`#295 `_)
-
-
-6.4.post0 (2024-05-22)
-======================
-
-- The sdist of version 6.4 was uploaded to PyPI as
- ``zope_interface-6.4.tar.gz`` instead of ``zope.interface-6.4-py2.tar.gz``
- which cannot be installed by ``zc.buildout``. This release is a re-release
- of version 6.4 with the correct sdist name.
- (`#298 `_)
-
-
-6.4 (2024-05-15)
-================
-
-- Adjust for incompatible changes in Python 3.13b1.
- (`#292 `_)
-
-- Build windows wheels on GHA.
-
-6.3 (2024-04-12)
-================
-
-- Add preliminary support for Python 3.13 as of 3.13a6.
-
-
-6.2 (2024-02-16)
-================
-
-- Add preliminary support for Python 3.13 as of 3.13a3.
-
-- Add support to use the pipe (``|``) syntax for ``typing.Union``.
- (`#280 `_)
-
-
-6.1 (2023-10-05)
-================
-
-- Build Linux binary wheels for Python 3.12.
-
-- Add support for Python 3.12.
-
-- Fix building of the docs for non-final versions.
-
-
-6.0 (2023-03-17)
-================
-
-- Build Linux binary wheels for Python 3.11.
-
-- Drop support for Python 2.7, 3.5, 3.6.
-
-- Fix test deprecation warning on Python 3.11.
-
-- Add preliminary support for Python 3.12 as of 3.12a5.
-
-- Drop:
-
- + `zope.interface.implements`
- + `zope.interface.implementsOnly`
- + `zope.interface.classProvides`
-
-
-5.5.2 (2022-11-17)
-==================
-
-- Add support for building arm64 wheels on macOS.
-
-
-5.5.1 (2022-11-03)
-==================
-
-- Add support for final Python 3.11 release.
-
-
-5.5.0 (2022-10-10)
-==================
-
-- Add support for Python 3.10 and 3.11 (as of 3.11.0rc2).
-
-- Add missing Trove classifier showing support for Python 3.9.
-
-- Add some more entries to ``zope.interface.interfaces.__all__``.
-
-- Disable unsafe math optimizations in C code. See `pull request 262
- `_.
-
-
-5.4.0 (2021-04-15)
-==================
-
-- Make the C implementation of the ``__providedBy__`` descriptor stop
- ignoring all errors raised when accessing the instance's
- ``__provides__``. Now it behaves like the Python version and only
- catches ``AttributeError``. The previous behaviour could lead to
- crashing the interpreter in cases of recursion and errors. See
- `issue 239 `_.
-
-- Update the ``repr()`` and ``str()`` of various objects to be shorter
- and more informative. In many cases, the ``repr()`` is now something
- that can be evaluated to produce an equal object. For example, what
- was previously printed as ```` is now
- shown as ``classImplements(list, IMutableSequence, IIterable)``. See
- `issue 236 `_.
-
-- Make ``Declaration.__add__`` (as in ``implementedBy(Cls) +
- ISomething``) try harder to preserve a consistent resolution order
- when the two arguments share overlapping pieces of the interface
- inheritance hierarchy. Previously, the right hand side was always
- put at the end of the resolution order, which could easily produce
- invalid orders. See `issue 193
- `_.
-
-5.3.0 (2020-03-21)
-==================
-
-- No changes from 5.3.0a1
-
-
-5.3.0a1 (2021-03-18)
-====================
-
-- Improve the repr of ``zope.interface.Provides`` to remove ambiguity
- about what is being provided. This is especially helpful diagnosing
- IRO issues.
-
-- Allow subclasses of ``BaseAdapterRegistry`` (including
- ``AdapterRegistry`` and ``VerifyingAdapterRegistry``) to have
- control over the data structures. This allows persistent
- implementations such as those based on ZODB to choose more scalable
- options (e.g., BTrees instead of dicts). See `issue 224
- `_.
-
-- Fix a reference counting issue in ``BaseAdapterRegistry`` that could
- lead to references to interfaces being kept around even when all
- utilities/adapters/subscribers providing that interface have been
- removed. This is mostly an issue for persistent implementations.
- Note that this only corrects the issue moving forward, it does not
- solve any already corrupted reference counts. See `issue 227
- `_.
-
-- Add the method ``BaseAdapterRegistry.rebuild()``. This can be used
- to fix the reference counting issue mentioned above, as well as to
- update the data structures when custom data types have changed.
-
-- Add the interface method ``IAdapterRegistry.subscribed()`` and
- implementation ``BaseAdapterRegistry.subscribed()`` for querying
- directly registered subscribers. See `issue 230
- `_.
-
-- Add the maintenance method
- ``Components.rebuildUtilityRegistryFromLocalCache()``. Most users
- will not need this, but it can be useful if the ``Components.utilities``
- registry is suspected to be out of sync with the ``Components``
- object itself (this might happen to persistent ``Components``
- implementations in the face of bugs).
-
-- Fix the ``Provides`` and ``ClassProvides`` descriptors to stop
- allowing redundant interfaces (those already implemented by the
- underlying class or meta class) to produce an inconsistent
- resolution order. This is similar to the change in ``@implementer``
- in 5.1.0, and resolves inconsistent resolution orders with
- ``zope.proxy`` and ``zope.location``. See `issue 207
- `_.
-
-5.2.0 (2020-11-05)
-==================
-
-- Add documentation section ``Persistency and Equality``
- (`#218 `_).
-
-- Create arm64 wheels.
-
-- Add support for Python 3.9.
-
-
-5.1.2 (2020-10-01)
-==================
-
-- Make sure to call each invariant only once when validating invariants.
- Previously, invariants could be called multiple times because when an
- invariant is defined in an interface, it's found by in all interfaces
- inheriting from that interface. See `pull request 215
- `_.
-
-5.1.1 (2020-09-30)
-==================
-
-- Fix the method definitions of ``IAdapterRegistry.subscribe``,
- ``subscriptions`` and ``subscribers``. Previously, they all were
- defined to accept a ``name`` keyword argument, but subscribers have
- no names and the implementation of that interface did not accept
- that argument. See `issue 208
- `_.
-
-- Fix a potential reference leak in the C optimizations. Previously,
- applications that dynamically created unique ``Specification``
- objects (e.g., used ``@implementer`` on dynamic classes) could
- notice a growth of small objects over time leading to increased
- garbage collection times. See `issue 216
- `_.
-
- .. caution::
-
- This leak could prevent interfaces used as the bases of
- other interfaces from being garbage collected. Those interfaces
- will now be collected.
-
- One way in which this would manifest was that ``weakref.ref``
- objects (and things built upon them, like
- ``Weak[Key|Value]Dictionary``) would continue to have access to
- the original object even if there were no other visible
- references to Python and the original object *should* have been
- collected. This could be especially problematic for the
- ``WeakKeyDictionary`` when combined with dynamic or local
- (created in the scope of a function) interfaces, since interfaces
- are hashed based just on their name and module name. See the
- linked issue for an example of a resulting ``KeyError``.
-
- Note that such potential errors are not new, they are just once
- again a possibility.
-
-5.1.0 (2020-04-08)
-==================
-
-- Make ``@implementer(*iface)`` and ``classImplements(cls, *iface)``
- ignore redundant interfaces. If the class already implements an
- interface through inheritance, it is no longer redeclared
- specifically for *cls*. This solves many instances of inconsistent
- resolution orders, while still allowing the interface to be declared
- for readability and maintenance purposes. See `issue 199
- `_.
-
-- Remove all bare ``except:`` statements. Previously, when accessing
- special attributes such as ``__provides__``, ``__providedBy__``,
- ``__class__`` and ``__conform__``, this package wrapped such access
- in a bare ``except:`` statement, meaning that many errors could pass
- silently; typically this would result in a fallback path being taken
- and sometimes (like with ``providedBy()``) the result would be
- non-sensical. This is especially true when those attributes are
- implemented with descriptors. Now, only ``AttributeError`` is
- caught. This makes errors more obvious.
-
- Obviously, this means that some exceptions will be propagated
- differently than before. In particular, ``RuntimeError`` raised by
- Acquisition in the case of circular containment will now be
- propagated. Previously, when adapting such a broken object, a
- ``TypeError`` would be the common result, but now it will be a more
- informative ``RuntimeError``.
-
- In addition, ZODB errors like ``POSKeyError`` could now be
- propagated where previously they would ignored by this package.
-
- See `issue 200 `_.
-
-- Require that the second argument (*bases*) to ``InterfaceClass`` is
- a tuple. This only matters when directly using ``InterfaceClass`` to
- create new interfaces dynamically. Previously, an individual
- interface was allowed, but did not work correctly. Now it is
- consistent with ``type`` and requires a tuple.
-
-- Let interfaces define custom ``__adapt__`` methods. This implements
- the other side of the :pep:`246` adaptation protocol: objects being
- adapted could already implement ``__conform__`` if they know about
- the interface, and now interfaces can implement ``__adapt__`` if
- they know about particular objects. There is no performance penalty
- for interfaces that do not supply custom ``__adapt__`` methods.
-
- This includes the ability to add new methods, or override existing
- interface methods using the new ``@interfacemethod`` decorator.
-
- See `issue 3 `_.
-
-- Make the internal singleton object returned by APIs like
- ``implementedBy`` and ``directlyProvidedBy`` for objects that
- implement or provide no interfaces more immutable. Previously an
- internal cache could be mutated. See `issue 204
- `_.
-
-5.0.2 (2020-03-30)
-==================
-
-- Ensure that objects that implement no interfaces (such as direct
- subclasses of ``object``) still include ``Interface`` itself in
- their ``__iro___`` and ``__sro___``. This fixes adapter registry
- lookups for such objects when the adapter is registered for
- ``Interface``. See `issue 197
- `_.
-
-
-5.0.1 (2020-03-21)
-==================
-
-- Ensure the resolution order for ``InterfaceClass`` is consistent.
- See `issue 192 `_.
-
-- Ensure the resolution order for ``collections.OrderedDict`` is
- consistent on CPython 2. (It was already consistent on Python 3 and PyPy).
-
-- Fix the handling of the ``ZOPE_INTERFACE_STRICT_IRO`` environment
- variable. Previously, ``ZOPE_INTERFACE_STRICT_RO`` was read, in
- contrast with the documentation. See `issue 194
- `_.
-
-
-5.0.0 (2020-03-19)
-==================
-
-- Make an internal singleton object returned by APIs like
- ``implementedBy`` and ``directlyProvidedBy`` immutable. Previously,
- it was fully mutable and allowed changing its ``__bases___``. That
- could potentially lead to wrong results in pathological corner
- cases. See `issue 158
- `_.
-
-- Support the ``PURE_PYTHON`` environment variable at runtime instead
- of just at wheel build time. A value of 0 forces the C extensions to
- be used (even on PyPy) failing if they aren't present. Any other
- value forces the Python implementation to be used, ignoring the C
- extensions. See `PR 151 `_.
-
-- Cache the result of ``__hash__`` method in ``InterfaceClass`` as a
- speed optimization. The method is called very often (i.e several
- hundred thousand times during Plone 5.2 startup). Because the hash value never
- changes it can be cached. This improves test performance from 0.614s
- down to 0.575s (1.07x faster). In a real world Plone case a reindex
- index came down from 402s to 320s (1.26x faster). See `PR 156
- `_.
-
-- Change the C classes ``SpecificationBase`` and its subclass
- ``ClassProvidesBase`` to store implementation attributes in their structures
- instead of their instance dictionaries. This eliminates the use of
- an undocumented private C API function, and helps make some
- instances require less memory. See `PR 154 `_.
-
-- Reduce memory usage in other ways based on observations of usage
- patterns in Zope (3) and Plone code bases.
-
- - Specifications with no dependents are common (more than 50%) so
- avoid allocating a ``WeakKeyDictionary`` unless we need it.
- - Likewise, tagged values are relatively rare, so don't allocate a
- dictionary to hold them until they are used.
- - Use ``__slots___`` or the C equivalent ``tp_members`` in more
- common places. Note that this removes the ability to set arbitrary
- instance variables on certain objects.
- See `PR 155 `_.
-
- The changes in this release resulted in a 7% memory reduction after
- loading about 6,000 modules that define about 2,200 interfaces.
-
- .. caution::
-
- Details of many private attributes have changed, and external use
- of those private attributes may break. In particular, the
- lifetime and default value of ``_v_attrs`` has changed.
-
-- Remove support for hashing uninitialized interfaces. This could only
- be done by subclassing ``InterfaceClass``. This has generated a
- warning since it was first added in 2011 (3.6.5). Please call the
- ``InterfaceClass`` constructor or otherwise set the appropriate
- fields in your subclass before attempting to hash or sort it. See
- `issue 157 `_.
-
-- Remove unneeded override of the ``__hash__`` method from
- ``zope.interface.declarations.Implements``. Watching a reindex index
- process in ZCatalog with on a Py-Spy after 10k samples the time for
- ``.adapter._lookup`` was reduced from 27.5s to 18.8s (~1.5x faster).
- Overall reindex index time shrunk from 369s to 293s (1.26x faster).
- See `PR 161
- `_.
-
-- Make the Python implementation closer to the C implementation by
- ignoring all exceptions, not just ``AttributeError``, during (parts
- of) interface adaptation. See `issue 163
- `_.
-
-- Micro-optimization in ``.adapter._lookup`` , ``.adapter._lookupAll``
- and ``.adapter._subscriptions``: By loading ``components.get`` into
- a local variable before entering the loop a bytcode "LOAD_FAST 0
- (components)" in the loop can be eliminated. In Plone, while running
- all tests, average speedup of the "owntime" of ``_lookup`` is ~5x.
- See `PR 167
- `_.
-
-- Add ``__all__`` declarations to all modules. This helps tools that
- do auto-completion and documentation and results in less cluttered
- results. Wildcard ("*") are not recommended and may be affected. See
- `issue 153
- `_.
-
-- Fix ``verifyClass`` and ``verifyObject`` for builtin types like
- ``dict`` that have methods taking an optional, unnamed argument with
- no default value like ``dict.pop``. On PyPy3, the verification is
- strict, but on PyPy2 (as on all versions of CPython) those methods
- cannot be verified and are ignored. See `issue 118
- `_.
-
-- Update the common interfaces ``IEnumerableMapping``,
- ``IExtendedReadMapping``, ``IExtendedWriteMapping``,
- ``IReadSequence`` and ``IUniqueMemberWriteSequence`` to no longer
- require methods that were removed from Python 3 on Python 3, such as
- ``__setslice___``. Now, ``dict``, ``list`` and ``tuple`` properly
- verify as ``IFullMapping``, ``ISequence`` and ``IReadSequence,``
- respectively on all versions of Python.
-
-- Add human-readable ``__str___`` and ``__repr___`` to ``Attribute``
- and ``Method``. These contain the name of the defining interface
- and the attribute. For methods, it also includes the signature.
-
-- Change the error strings raised by ``verifyObject`` and
- ``verifyClass``. They now include more human-readable information
- and exclude extraneous lines and spaces. See `issue 170
- `_.
-
- .. caution:: This will break consumers (such as doctests) that
- depended on the exact error messages.
-
-- Make ``verifyObject`` and ``verifyClass`` report all errors, if the
- candidate object has multiple detectable violations. Previously they
- reported only the first error. See `issue
- `_.
-
- Like the above, this will break consumers depending on the exact
- output of error messages if more than one error is present.
-
-- Add ``zope.interface.common.collections``,
- ``zope.interface.common.numbers``, and ``zope.interface.common.io``.
- These modules define interfaces based on the ABCs defined in the
- standard library ``collections.abc``, ``numbers`` and ``io``
- modules, respectively. Importing these modules will make the
- standard library concrete classes that are registered with those
- ABCs declare the appropriate interface. See `issue 138
- `_.
-
-- Add ``zope.interface.common.builtins``. This module defines
- interfaces of common builtin types, such as ``ITextString`` and
- ``IByteString``, ``IDict``, etc. These interfaces extend the
- appropriate interfaces from ``collections`` and ``numbers``, and the
- standard library classes implement them after importing this module.
- This is intended as a replacement for third-party packages like
- `dolmen.builtins `_.
- See `issue 138 `_.
-
-- Make ``providedBy()`` and ``implementedBy()`` respect ``super``
- objects. For instance, if class ``Derived`` implements ``IDerived``
- and extends ``Base`` which in turn implements ``IBase``, then
- ``providedBy(super(Derived, derived))`` will return ``[IBase]``.
- Previously it would have returned ``[IDerived]`` (in general, it
- would previously have returned whatever would have been returned
- without ``super``).
-
- Along with this change, adapter registries will unpack ``super``
- objects into their ``__self___`` before passing it to the factory.
- Together, this means that ``component.getAdapter(super(Derived,
- self), ITarget)`` is now meaningful.
-
- See `issue 11 `_.
-
-- Fix a potential interpreter crash in the low-level adapter
- registry lookup functions. See issue 11.
-
-- Adopt Python's standard `C3 resolution order
- `_ to compute the
- ``__iro__`` and ``__sro__`` of interfaces, with tweaks to support
- additional cases that are common in interfaces but disallowed for
- Python classes. Previously, an ad-hoc ordering that made no
- particular guarantees was used.
-
- This has many beneficial properties, including the fact that base
- interface and base classes tend to appear near the end of the
- resolution order instead of the beginning. The resolution order in
- general should be more predictable and consistent.
-
- .. caution::
- In some cases, especially with complex interface inheritance
- trees or when manually providing or implementing interfaces, the
- resulting IRO may be quite different. This may affect adapter
- lookup.
-
- The C3 order enforces some constraints in order to be able to
- guarantee a sensible ordering. Older versions of zope.interface did
- not impose similar constraints, so it was possible to create
- interfaces and declarations that are inconsistent with the C3
- constraints. In that event, zope.interface will still produce a
- resolution order equal to the old order, but it won't be guaranteed
- to be fully C3 compliant. In the future, strict enforcement of C3
- order may be the default.
-
- A set of environment variables and module constants allows
- controlling several aspects of this new behaviour. It is possible to
- request warnings about inconsistent resolution orders encountered,
- and even to forbid them. Differences between the C3 resolution order
- and the previous order can be logged, and, in extreme cases, the
- previous order can still be used (this ability will be removed in
- the future). For details, see the documentation for
- ``zope.interface.ro``.
-
-- Make inherited tagged values in interfaces respect the resolution
- order (``__iro__``), as method and attribute lookup does. Previously
- tagged values could give inconsistent results. See `issue 190
- `_.
-
-- Add ``getDirectTaggedValue`` (and related methods) to interfaces to
- allow accessing tagged values irrespective of inheritance. See
- `issue 190
- `_.
-
-- Ensure that ``Interface`` is always the last item in the ``__iro__``
- and ``__sro__``. This is usually the case, but if classes that do
- not implement any interfaces are part of a class inheritance
- hierarchy, ``Interface`` could be assigned too high a priority.
- See `issue 8 `_.
-
-- Implement sorting, equality, and hashing in C for ``Interface``
- objects. In micro benchmarks, this makes those operations 40% to 80%
- faster. This translates to a 20% speed up in querying adapters.
-
- Note that this changes certain implementation details. In
- particular, ``InterfaceClass`` now has a non-default metaclass, and
- it is enforced that ``__module__`` in instances of
- ``InterfaceClass`` is read-only.
-
- See `PR 183 `_.
-
-
-4.7.2 (2020-03-10)
-==================
-
-- Remove deprecated use of setuptools features. See `issue 30
- `_.
-
-
-4.7.1 (2019-11-11)
-==================
-
-- Use Python 3 syntax in the documentation. See `issue 119
- `_.
-
-
-4.7.0 (2019-11-11)
-==================
-
-- Drop support for Python 3.4.
-
-- Change ``queryTaggedValue``, ``getTaggedValue``,
- ``getTaggedValueTags`` in interfaces. They now include inherited
- values by following ``__bases__``. See `PR 144
- `_.
-
- .. caution:: This may be a breaking change.
-
-- Add support for Python 3.8.
-
-
-4.6.0 (2018-10-23)
-==================
-
-- Add support for Python 3.7
-
-- Fix ``verifyObject`` for class objects with staticmethods on
- Python 3. See `issue 126
- `_.
-
-
-4.5.0 (2018-04-19)
-==================
-
-- Drop support for 3.3, avoid accidental dependence breakage via setup.py.
- See `PR 110 `_.
-- Allow registering and unregistering instance methods as listeners.
- See `issue 12 `_
- and `PR 102 `_.
-- Synchronize and simplify zope/__init__.py. See `issue 114
- `_
-
-
-4.4.3 (2017-09-22)
-==================
-
-- Avoid exceptions when the ``__annotations__`` attribute is added to
- interface definitions with Python 3.x type hints. See `issue 98
- `_.
-- Fix the possibility of a rare crash in the C extension when
- deallocating items. See `issue 100
- `_.
-
-
-4.4.2 (2017-06-14)
-==================
-
-- Fix a regression storing
- ``zope.component.persistentregistry.PersistentRegistry`` instances.
- See `issue 85 `_.
-
-- Fix a regression that could lead to the utility registration cache
- of ``Components`` getting out of sync. See `issue 93
- `_.
-
-4.4.1 (2017-05-13)
-==================
-
-- Simplify the caching of utility-registration data. In addition to
- simplification, avoids spurious test failures when checking for
- leaks in tests with persistent registries. See `pull 84
- `_.
-
-- Raise ``ValueError`` when non-text names are passed to adapter registry
- methods: prevents corruption of lookup caches.
-
-4.4.0 (2017-04-21)
-==================
-
-- Avoid a warning from the C compiler.
- (https://github.com/zopefoundation/zope.interface/issues/71)
-
-- Add support for Python 3.6.
-
-4.3.3 (2016-12-13)
-==================
-
-- Correct typos and ReST formatting errors in documentation.
-
-- Add API documentation for the adapter registry.
-
-- Ensure that the ``LICENSE.txt`` file is included in built wheels.
-
-- Fix C optimizations broken on Py3k. See the Python bug at:
- http://bugs.python.org/issue15657
- (https://github.com/zopefoundation/zope.interface/issues/60)
-
-
-4.3.2 (2016-09-05)
-==================
-
-- Fix equality testing of ``implementedBy`` objects and proxies.
- (https://github.com/zopefoundation/zope.interface/issues/55)
-
-
-4.3.1 (2016-08-31)
-==================
-
-- Support Components subclasses that are not hashable.
- (https://github.com/zopefoundation/zope.interface/issues/53)
-
-
-4.3.0 (2016-08-31)
-==================
-
-- Add the ability to sort the objects returned by ``implementedBy``.
- This is compatible with the way interface classes sort so they can
- be used together in ordered containers like BTrees.
- (https://github.com/zopefoundation/zope.interface/issues/42)
-
-- Make ``setuptools`` a hard dependency of ``setup.py``.
- (https://github.com/zopefoundation/zope.interface/issues/13)
-
-- Change a linear algorithm (O(n)) in ``Components.registerUtility`` and
- ``Components.unregisterUtility`` into a dictionary lookup (O(1)) for
- hashable components. This substantially improves the time taken to
- manipulate utilities in large registries at the cost of some
- additional memory usage. (https://github.com/zopefoundation/zope.interface/issues/46)
-
-
-4.2.0 (2016-06-10)
-==================
-
-- Add support for Python 3.5
-
-- Drop support for Python 2.6 and 3.2.
-
-
-4.1.3 (2015-10-05)
-==================
-
-- Fix installation without a C compiler on Python 3.5
- (https://github.com/zopefoundation/zope.interface/issues/24).
-
-
-4.1.2 (2014-12-27)
-==================
-
-- Add support for PyPy3.
-
-- Remove unittest assertions deprecated in Python3.x.
-
-- Add ``zope.interface.document.asReStructuredText``, which formats the
- generated text for an interface using ReST double-backtick markers.
-
-
-4.1.1 (2014-03-19)
-==================
-
-- Add support for Python 3.4.
-
-
-4.1.0 (2014-02-05)
-==================
-
-- Update ``boostrap.py`` to version 2.2.
-
-- Add ``@named(name)`` declaration, that specifies the component name, so it
- does not have to be passed in during registration.
-
-
-4.0.5 (2013-02-28)
-==================
-
-- Fix a bug where a decorated method caused false positive failures on
- ``verifyClass()``.
-
-
-4.0.4 (2013-02-21)
-==================
-
-- Fix a bug that was revealed by porting zope.traversing. During a loop, the
- loop body modified a weakref dict causing a ``RuntimeError`` error.
-
-4.0.3 (2012-12-31)
-==================
-
-- Fleshed out PyPI Trove classifiers.
-
-4.0.2 (2012-11-21)
-==================
-
-- Add support for Python 3.3.
-
-- Restored ability to install the package in the absence of ``setuptools``.
-
-- LP #1055223: Fix test which depended on dictionary order and failed randomly
- in Python 3.3.
-
-4.0.1 (2012-05-22)
-==================
-
-- Drop explicit ``DeprecationWarnings`` for "class advice" APIS (these
- APIs are still deprecated under Python 2.x, and still raise an exception
- under Python 3.x, but no longer cause a warning to be emitted under
- Python 2.x).
-
-4.0.0 (2012-05-16)
-==================
-
-- Automated build of Sphinx HTML docs and running doctest snippets via tox.
-
-- Deprecate the "class advice" APIs from ``zope.interface.declarations``:
- ``implements``, ``implementsOnly``, and ``classProvides``. In their place,
- prefer the equivalent class decorators: ``@implementer``,
- ``@implementer_only``, and ``@provider``. Code which uses the deprecated
- APIs will not work as expected under Py3k.
-
-- Remove use of '2to3' and associated fixers when installing under Py3k.
- The code is now in a "compatible subset" which supports Python 2.6, 2.7,
- and 3.2, including PyPy 1.8 (the version compatible with the 2.7 language
- spec).
-
-- Drop explicit support for Python 2.4 / 2.5 / 3.1.
-
-- Add support for PyPy.
-
-- Add support for continuous integration using ``tox`` and ``jenkins``.
-
-- Add 'setup.py dev' alias (runs ``setup.py develop`` plus installs
- ``nose`` and ``coverage``).
-
-- Add 'setup.py docs' alias (installs ``Sphinx`` and dependencies).
-
-- Replace all unittest coverage previously accomplished via doctests with
- unittests. The doctests have been moved into a ``docs`` section, managed
- as a Sphinx collection.
-
-- LP #910987: Ensure that the semantics of the ``lookup`` method of
- ``zope.interface.adapter.LookupBase`` are the same in both the C and
- Python implementations.
-
-- LP #900906: Avoid exceptions due to tne new ``__qualname__`` attribute
- added in Python 3.3 (see PEP 3155 for rationale). Thanks to Antoine
- Pitrou for the patch.
-
-3.8.0 (2011-09-22)
-==================
-
-- New module ``zope.interface.registry``. This is code moved from
- ``zope.component.registry`` which implements a basic nonperistent component
- registry as ``zope.interface.registry.Components``. This class was moved
- from ``zope.component`` to make porting systems (such as Pyramid) that rely
- only on a basic component registry to Python 3 possible without needing to
- port the entirety of the ``zope.component`` package. Backwards
- compatibility import shims have been left behind in ``zope.component``, so
- this change will not break any existing code.
-
-- New ``tests_require`` dependency: ``zope.event`` to test events sent by
- Components implementation. The ``zope.interface`` package does not have a
- hard dependency on ``zope.event``, but if ``zope.event`` is importable, it
- will send component registration events when methods of an instance of
- ``zope.interface.registry.Components`` are called.
-
-- New interfaces added to support ``zope.interface.registry.Components``
- addition: ``ComponentLookupError``, ``Invalid``, ``IObjectEvent``,
- ``ObjectEvent``, ``IComponentLookup``, ``IRegistration``,
- ``IUtilityRegistration``, ``IAdapterRegistration``,
- ``ISubscriptionAdapterRegistration``, ``IHandlerRegistration``,
- ``IRegistrationEvent``, ``RegistrationEvent``, ``IRegistered``,
- ``Registered``, ``IUnregistered``, ``Unregistered``,
- ``IComponentRegistry``, and ``IComponents``.
-
-- No longer Python 2.4 compatible (tested under 2.5, 2.6, 2.7, and 3.2).
-
-3.7.0 (2011-08-13)
-==================
-
-- Move changes from 3.6.2 - 3.6.5 to a new 3.7.x release line.
-
-3.6.7 (2011-08-20)
-==================
-
-- Fix sporadic failures on x86-64 platforms in tests of rich comparisons
- of interfaces.
-
-3.6.6 (2011-08-13)
-==================
-
-- LP #570942: Now correctly compare interfaces from different modules but
- with the same names.
-
- N.B.: This is a less intrusive / destabilizing fix than the one applied in
- 3.6.3: we only fix the underlying cmp-alike function, rather than adding
- the other "rich comparison" functions.
-
-- Revert to software as released with 3.6.1 for "stable" 3.6 release branch.
-
-3.6.5 (2011-08-11)
-==================
-
-- LP #811792: work around buggy behavior in some subclasses of
- ``zope.interface.interface.InterfaceClass``, which invoke ``__hash__``
- before initializing ``__module__`` and ``__name__``. The workaround
- returns a fixed constant hash in such cases, and issues a ``UserWarning``.
-
-- LP #804832: Under PyPy, ``zope.interface`` should not build its C
- extension. Also, prevent attempting to build it under Jython.
-
-- Add a tox.ini for easier xplatform testing.
-
-- Fix testing deprecation warnings issued when tested under Py3K.
-
-3.6.4 (2011-07-04)
-==================
-
-- LP 804951: InterfaceClass instances were unhashable under Python 3.x.
-
-3.6.3 (2011-05-26)
-==================
-
-- LP #570942: Now correctly compare interfaces from different modules but
- with the same names.
-
-3.6.2 (2011-05-17)
-==================
-
-- Moved detailed documentation out-of-line from PyPI page, linking instead to
- http://docs.zope.org/zope.interface .
-
-- Fixes for small issues when running tests under Python 3.2 using
- ``zope.testrunner``.
-
-- LP # 675064: Specify return value type for C optimizations module init
- under Python 3: undeclared value caused warnings, and segfaults on some
- 64 bit architectures.
-
-- setup.py now raises RuntimeError if you don't have Distutils installed when
- running under Python 3.
-
-3.6.1 (2010-05-03)
-==================
-
-- A non-ASCII character in the changelog made 3.6.0 uninstallable on
- Python 3 systems with another default encoding than UTF-8.
-
-- Fix compiler warnings under GCC 4.3.3.
-
-3.6.0 (2010-04-29)
-==================
-
-- LP #185974: Clear the cache used by ``Specificaton.get`` inside
- ``Specification.changed``. Thanks to Jacob Holm for the patch.
-
-- Add support for Python 3.1. Contributors:
-
- Lennart Regebro
- Martin v Loewis
- Thomas Lotze
- Wolfgang Schnerring
-
- The 3.1 support is completely backwards compatible. However, the implements
- syntax used under Python 2.X does not work under 3.X, since it depends on
- how metaclasses are implemented and this has changed. Instead it now supports
- a decorator syntax (also under Python 2.X)::
-
- class Foo:
- implements(IFoo)
- ...
-
- can now also be written::
-
- @implementer(IFoo):
- class Foo:
- ...
-
- There are 2to3 fixers available to do this change automatically in the
- zope.fixers package.
-
-- Python 2.3 is no longer supported.
-
-
-3.5.4 (2009-12-23)
-==================
-
-- Use the standard Python doctest module instead of zope.testing.doctest, which
- has been deprecated.
-
-
-3.5.3 (2009-12-08)
-==================
-
-- Fix an edge case: make providedBy() work when a class has '__provides__' in
- its __slots__ (see http://thread.gmane.org/gmane.comp.web.zope.devel/22490)
-
-
-3.5.2 (2009-07-01)
-==================
-
-- BaseAdapterRegistry.unregister, unsubscribe: Remove empty portions of
- the data structures when something is removed. This avoids leaving
- references to global objects (interfaces) that may be slated for
- removal from the calling application.
-
-
-3.5.1 (2009-03-18)
-==================
-
-- verifyObject: use getattr instead of hasattr to test for object attributes
- in order to let exceptions other than AttributeError raised by properties
- propagate to the caller
-
-- Add Sphinx-based documentation building to the package buildout
- configuration. Use the ``bin/docs`` command after buildout.
-
-- Improve package description a bit. Unify changelog entries formatting.
-
-- Change package's mailing list address to zope-dev at zope.org as
- zope3-dev at zope.org is now retired.
-
-
-3.5.0 (2008-10-26)
-==================
-
-- Fix declaration of _zope_interface_coptimizations, it's not a top level
- package.
-
-- Add a DocTestSuite for odd.py module, so their tests are run.
-
-- Allow to bootstrap on Jython.
-
-- Fix https://bugs.launchpad.net/zope3/3.3/+bug/98388: ISpecification
- was missing a declaration for __iro__.
-
-- Add optional code optimizations support, which allows the building
- of C code optimizations to fail (Jython).
-
-- Replace `_flatten` with a non-recursive implementation, effectively making
- it 3x faster.
-
-
-3.4.1 (2007-10-02)
-==================
-
-- Fix a setup bug that prevented installation from source on systems
- without setuptools.
-
-
-3.4.0 (2007-07-19)
-==================
-
-- Final release for 3.4.0.
-
-
-3.4.0b3 (2007-05-22)
-====================
-
-
-- When checking whether an object is already registered, use identity
- comparison, to allow adding registering with picky custom comparison methods.
-
-
-3.3.0.1 (2007-01-03)
-====================
-
-- Made a reference to OverflowWarning, which disappeared in Python
- 2.5, conditional.
-
-
-3.3.0 (2007/01/03)
-==================
-
-New Features
-------------
-
-- Refactor the adapter-lookup algorithim to make it much simpler and faster.
-
- Also, implement more of the adapter-lookup logic in C, making
- debugging of application code easier, since there is less
- infrastructre code to step through.
-
-- Treat objects without interface declarations as if they
- declared that they provide ``zope.interface.Interface``.
-
-- Add a number of richer new adapter-registration interfaces
- that provide greater control and introspection.
-
-- Add a new interface decorator to zope.interface that allows the
- setting of tagged values on an interface at definition time (see
- zope.interface.taggedValue).
-
-Bug Fixes
----------
-
-- A bug in multi-adapter lookup sometimes caused incorrect adapters to
- be returned.
-
-
-3.2.0.2 (2006-04-15)
-====================
-
-- Fix packaging bug: 'package_dir' must be a *relative* path.
-
-
-3.2.0.1 (2006-04-14)
-====================
-
-- Packaging change: suppress inclusion of 'setup.cfg' in 'sdist' builds.
-
-
-3.2.0 (2006-01-05)
-==================
-
-- Corresponds to the version of the zope.interface package shipped as part of
- the Zope 3.2.0 release.
-
-
-3.1.0 (2005-10-03)
-==================
-
-- Corresponds to the version of the zope.interface package shipped as part of
- the Zope 3.1.0 release.
-
-- Made attribute resolution order consistent with component lookup order,
- i.e. new-style class MRO semantics.
-
-- Deprecate 'isImplementedBy' and 'isImplementedByInstancesOf' APIs in
- favor of 'implementedBy' and 'providedBy'.
-
-
-3.0.1 (2005-07-27)
-==================
-
-- Corresponds to the version of the zope.interface package shipped as part of
- the Zope X3.0.1 release.
-
-- Fix a bug reported by James Knight, which caused adapter registries
- to fail occasionally to reflect declaration changes.
-
-
-3.0.0 (2004-11-07)
-==================
-
-- Corresponds to the version of the zope.interface package shipped as part of
- the Zope X3.0.0 release.
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/RECORD b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/RECORD
deleted file mode 100644
index 6a0b72d27..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/RECORD
+++ /dev/null
@@ -1,111 +0,0 @@
-zope.interface-6.4.post2-py3.7-nspkg.pth,sha256=SWEVH-jEWsKYrL0qoC6GBJaStx_iKxGoAY9PQycFVC4,529
-zope.interface-6.4.post2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-zope.interface-6.4.post2.dist-info/LICENSE.txt,sha256=PmcdsR32h1FswdtbPWXkqjg-rKPCDOo_r1Og9zNdCjw,2070
-zope.interface-6.4.post2.dist-info/METADATA,sha256=H8Khyb9-gY_zBqe7zjdwxyXNgUbEHVfkVKEQvw_Sqg4,42932
-zope.interface-6.4.post2.dist-info/RECORD,,
-zope.interface-6.4.post2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-zope.interface-6.4.post2.dist-info/WHEEL,sha256=f2kJt0KSgFuwuHtWUSz6w6PHLbc-ZwVrVTUjwVNK4Mc,104
-zope.interface-6.4.post2.dist-info/namespace_packages.txt,sha256=QpUHvpO4wIuZDeEgKY8qZCtD-tAukB0fn_f6utzlb98,5
-zope.interface-6.4.post2.dist-info/top_level.txt,sha256=QpUHvpO4wIuZDeEgKY8qZCtD-tAukB0fn_f6utzlb98,5
-zope/interface/__init__.py,sha256=3ZfPUwE8FkswHxH57Po_PRJxyYYIYeUQ73Rexbn3KaI,3460
-zope/interface/__pycache__/__init__.cpython-37.pyc,,
-zope/interface/__pycache__/_compat.cpython-37.pyc,,
-zope/interface/__pycache__/_flatten.cpython-37.pyc,,
-zope/interface/__pycache__/adapter.cpython-37.pyc,,
-zope/interface/__pycache__/advice.cpython-37.pyc,,
-zope/interface/__pycache__/declarations.cpython-37.pyc,,
-zope/interface/__pycache__/document.cpython-37.pyc,,
-zope/interface/__pycache__/exceptions.cpython-37.pyc,,
-zope/interface/__pycache__/interface.cpython-37.pyc,,
-zope/interface/__pycache__/interfaces.cpython-37.pyc,,
-zope/interface/__pycache__/registry.cpython-37.pyc,,
-zope/interface/__pycache__/ro.cpython-37.pyc,,
-zope/interface/__pycache__/verify.cpython-37.pyc,,
-zope/interface/_compat.py,sha256=INsHdSwp4imu-1CL552I3S79YRSDCloB1J0x17PEHvw,4369
-zope/interface/_flatten.py,sha256=E4aomSQEN79yxAka9msyWOopv8i-dD4_4EfX9CXFXnI,1057
-zope/interface/_zope_interface_coptimizations.c,sha256=xq56Czru7kS4boskT3eXXxxIqlsVge87rzIR913AxW0,57205
-zope/interface/_zope_interface_coptimizations.cpython-37m-x86_64-linux-gnu.so,sha256=Vtj-b1WGGDA3n96gQlVwqgOgQyNNWzBuxUedUobSwsw,122680
-zope/interface/adapter.py,sha256=rsHrDCyZ4QpV1Fl9o31Ty4LM0qTGGqHgPyPfdMY4tBk,36218
-zope/interface/advice.py,sha256=gHc81UfU8ysiRm4I9LooYR7W16aw3Si-xTh42jineCA,3892
-zope/interface/common/__init__.py,sha256=Oip172bmZ16J8cKo5AWHsZ3l11k455zBZKzDxddOsZw,10462
-zope/interface/common/__pycache__/__init__.cpython-37.pyc,,
-zope/interface/common/__pycache__/builtins.cpython-37.pyc,,
-zope/interface/common/__pycache__/collections.cpython-37.pyc,,
-zope/interface/common/__pycache__/idatetime.cpython-37.pyc,,
-zope/interface/common/__pycache__/interfaces.cpython-37.pyc,,
-zope/interface/common/__pycache__/io.cpython-37.pyc,,
-zope/interface/common/__pycache__/mapping.cpython-37.pyc,,
-zope/interface/common/__pycache__/numbers.cpython-37.pyc,,
-zope/interface/common/__pycache__/sequence.cpython-37.pyc,,
-zope/interface/common/builtins.py,sha256=in7YN1Rl9JSJMJin0SP7BfaL61dflKepORSMsJVDtSA,3027
-zope/interface/common/collections.py,sha256=STe8TRe7qzhaLbAoZaJl8RK60x8thuBdyNJyb4P9dpQ,6792
-zope/interface/common/idatetime.py,sha256=DUN8C0PeW1O1visJ9rbgjMiN_suaFMCcclyJnUlkK1Y,20964
-zope/interface/common/interfaces.py,sha256=s_j3IaGwvWsabz5L2azjMzryDiuD2Gyi5f0L79Pov8Y,5368
-zope/interface/common/io.py,sha256=if6Yzclu_T7qeUQNsXeIqREqgVTu-rjYB_VGZfYyz3Y,1242
-zope/interface/common/mapping.py,sha256=CwSefWLXLIxQ08xAxyeB0NBTAmrVp90LjvIikwGHYoc,4678
-zope/interface/common/numbers.py,sha256=D4kUnF5OgAk6CKcxaW86VH_OPLh1OXt_cF6WaOfvjLk,1682
-zope/interface/common/sequence.py,sha256=ua0mLW_hCZmZnnhgaMYan9zoAfDjv6l5RAp_9YuZ9Uw,5526
-zope/interface/common/tests/__init__.py,sha256=xXj2X_C0xZutCAtC8bdM4i5_JeAd-1NxaK_VkJXU1Qg,5476
-zope/interface/common/tests/__pycache__/__init__.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/basemapping.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_builtins.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_collections.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_idatetime.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_import_interfaces.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_io.cpython-37.pyc,,
-zope/interface/common/tests/__pycache__/test_numbers.cpython-37.pyc,,
-zope/interface/common/tests/basemapping.py,sha256=bzeuZAg3tu-QeMHmLcgtT-fIkD3sxmk1x42YA66fwsg,3907
-zope/interface/common/tests/test_builtins.py,sha256=slmlaiZjaZJXjplCEaWXAaUFaWW6bcK3z8Je7al5mdE,1345
-zope/interface/common/tests/test_collections.py,sha256=XdaOzmt3HR5cbmwEGhENCTkhvELxkwECZH437Tthpu8,5718
-zope/interface/common/tests/test_idatetime.py,sha256=qGr8FDbiVuDZHjyDIKcz7Vz6qNfoFzd9eHejMTfIyAg,1923
-zope/interface/common/tests/test_import_interfaces.py,sha256=wCFk-2kc7r-kAeOXZn5th5Qw_6k_-pMvdguk5b4NstM,813
-zope/interface/common/tests/test_io.py,sha256=AMLOSWmV7ZKCbHzcLwNqB06_R9zifohW_0qoSmC860w,1663
-zope/interface/common/tests/test_numbers.py,sha256=xp55tY7zeP-q6D6dJmlTsWicl-3mQ8dArwdfkhQDoNA,1394
-zope/interface/declarations.py,sha256=SmAZZ0-4AoLSCSp47DPbNl1v-rdN5I0-grxBWTd2aos,43007
-zope/interface/document.py,sha256=ulz-aOQd1_4b7xUGNKz1dr1aERHGO0jLFMvNzl3h7Jg,4068
-zope/interface/exceptions.py,sha256=fSv9yI6TMqWmgjaSX8cxt0Q2cASbmzphz_noyu0NnRM,8636
-zope/interface/interface.py,sha256=33F_4-rmgww_mB1ZNt85k-Xj7YfcuP80hBGF75JFxbI,39409
-zope/interface/interfaces.py,sha256=EAkcVWOBAEJ_1uxki5paMB2iiRuenhWhH9HTmtahIZI,50126
-zope/interface/registry.py,sha256=KO-shRNDa3HV13dMfCzilMcrrO7499NnE-Y8OfBjFc0,25829
-zope/interface/ro.py,sha256=4LkztZPdF642vW6ikghU6yTmhutPJj7VoXdlV6sQU1o,24157
-zope/interface/tests/__init__.py,sha256=2sMjAaqsnDB5aCcIIkz9lXeivO1Cpbo78GeV7qYfjgY,3961
-zope/interface/tests/__pycache__/__init__.cpython-37.pyc,,
-zope/interface/tests/__pycache__/advisory_testing.cpython-37.pyc,,
-zope/interface/tests/__pycache__/dummy.cpython-37.pyc,,
-zope/interface/tests/__pycache__/idummy.cpython-37.pyc,,
-zope/interface/tests/__pycache__/m1.cpython-37.pyc,,
-zope/interface/tests/__pycache__/odd.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_adapter.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_advice.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_compile_flags.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_declarations.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_document.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_element.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_exceptions.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_interface.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_interfaces.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_odd_declarations.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_registry.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_ro.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_sorting.cpython-37.pyc,,
-zope/interface/tests/__pycache__/test_verify.cpython-37.pyc,,
-zope/interface/tests/advisory_testing.py,sha256=XlSmWBnpFUjiUSFlXcfOUjGiTxUZRdoBoUCHuNboZzQ,898
-zope/interface/tests/dummy.py,sha256=8JydLumILxdOHKaAa_IfGIvSx9a5Agz8gcRwGNx4HNA,912
-zope/interface/tests/idummy.py,sha256=ESC_l4UqjCkiCeXWfcphVGtrP7PoNwwTTGzLpp6Doo4,890
-zope/interface/tests/m1.py,sha256=JFuzE0pC2bSrXKyxm-VYYvoPt7F42wtFy-yxRPhmEdE,839
-zope/interface/tests/odd.py,sha256=DITySuFOf7f1ERI7qWGcosW98AO6-MvLoOAawsz07N8,3015
-zope/interface/tests/test_adapter.py,sha256=w8Puu63ubnOQauKLpzJUVb3t7iBI3x7bPAm_eObhTcI,79479
-zope/interface/tests/test_advice.py,sha256=K_Scp5waHBPuzYnPMn00O1Q6Ap5u6t8xdRiFmfnGMQ0,6040
-zope/interface/tests/test_compile_flags.py,sha256=wU3vtmqgzll6HMPbzFErMpORoVghrcZ5krIV4x6rfo4,1290
-zope/interface/tests/test_declarations.py,sha256=YEdPZw4XA-bCyMW1fUO43pAHiqPL3K-eSEW1jlLn91Q,82140
-zope/interface/tests/test_document.py,sha256=LE9ndrIrloJZIOxTPwj6GklGQTFW9zeRnFM5GiwvHfU,17164
-zope/interface/tests/test_element.py,sha256=z9Q2hYwPVzMX05NpA_IeiHoAb4qhTiHI57XQI38w4zQ,1120
-zope/interface/tests/test_exceptions.py,sha256=rNrW_HdJPmVbyjTN9TyO8ynZ7cxiL5c-UdZj9SNlF_4,6412
-zope/interface/tests/test_interface.py,sha256=8PnCmZdsHfxg-27nyfogCihp-o7-IFrZ_nMhg3kCoZw,92312
-zope/interface/tests/test_interfaces.py,sha256=l-V4hE52mL6DoMWJ6dAGKpJBkCiog8EBPH8oes7UCYI,4377
-zope/interface/tests/test_odd_declarations.py,sha256=WosR5hLjT8fd-S9Mu6u5xTZ55Dfee-nOvvNBF39KkXk,7566
-zope/interface/tests/test_registry.py,sha256=xHc0wGjkgy1sN_IaY-_tJ5qEHNut49UWOriRVz7v_40,112910
-zope/interface/tests/test_ro.py,sha256=XFlt5AERciPTVR0zi6zvsPDCQWsF6zc6qFT0qn2vuTM,14124
-zope/interface/tests/test_sorting.py,sha256=6yeTd66j25xPfzqvmH6lAx2KZ2iblN7eNKoI342Cnuo,1934
-zope/interface/tests/test_verify.py,sha256=7mdkuW7xCSxB8Q3w50XF7ayB-qJTIhe7wgiJ5yDbjXE,19191
-zope/interface/verify.py,sha256=-nBYCCz0fNqEIgYpzSJKljut7Yywor7QXT22hFafdcM,7226
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/REQUESTED b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/REQUESTED
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/WHEEL b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/WHEEL
deleted file mode 100644
index af8ab71b6..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.42.0)
-Root-Is-Purelib: false
-Tag: cp37-cp37m-linux_x86_64
-
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/namespace_packages.txt b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/namespace_packages.txt
deleted file mode 100644
index 66179d498..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/namespace_packages.txt
+++ /dev/null
@@ -1 +0,0 @@
-zope
diff --git a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/top_level.txt b/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/top_level.txt
deleted file mode 100644
index 66179d498..000000000
--- a/resources/python/bin/3.7/linux/zope.interface-6.4.post2.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-zope
diff --git a/resources/python/bin/3.7/linux/zope/__init__.py b/resources/python/bin/3.7/linux/zope/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/linux/zope/interface/__init__.py b/resources/python/bin/3.7/linux/zope/interface/__init__.py
deleted file mode 100644
index 8be812dd6..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/__init__.py
+++ /dev/null
@@ -1,90 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Interfaces
-
-This package implements the Python "scarecrow" proposal.
-
-The package exports two objects, `Interface` and `Attribute` directly. It also
-exports several helper methods. Interface is used to create an interface with
-a class statement, as in:
-
- class IMyInterface(Interface):
- '''Interface documentation
- '''
-
- def meth(arg1, arg2):
- '''Documentation for meth
- '''
-
- # Note that there is no self argument
-
-To find out what you can do with interfaces, see the interface
-interface, `IInterface` in the `interfaces` module.
-
-The package has several public modules:
-
- o `declarations` provides utilities to declare interfaces on objects. It
- also provides a wide range of helpful utilities that aid in managing
- declared interfaces. Most of its public names are however imported here.
-
- o `document` has a utility for documenting an interface as structured text.
-
- o `exceptions` has the interface-defined exceptions
-
- o `interfaces` contains a list of all public interfaces for this package.
-
- o `verify` has utilities for verifying implementations of interfaces.
-
-See the module doc strings for more information.
-"""
-__docformat__ = 'restructuredtext'
-# pylint:disable=wrong-import-position,unused-import
-from zope.interface.interface import Interface
-from zope.interface.interface import _wire
-
-
-# Need to actually get the interface elements to implement the right interfaces
-_wire()
-del _wire
-
-from zope.interface.declarations import Declaration
-# The following are to make spec pickles cleaner
-from zope.interface.declarations import Provides
-from zope.interface.declarations import alsoProvides
-from zope.interface.declarations import classImplements
-from zope.interface.declarations import classImplementsFirst
-from zope.interface.declarations import classImplementsOnly
-from zope.interface.declarations import directlyProvidedBy
-from zope.interface.declarations import directlyProvides
-from zope.interface.declarations import implementedBy
-from zope.interface.declarations import implementer
-from zope.interface.declarations import implementer_only
-from zope.interface.declarations import moduleProvides
-from zope.interface.declarations import named
-from zope.interface.declarations import noLongerProvides
-from zope.interface.declarations import providedBy
-from zope.interface.declarations import provider
-from zope.interface.exceptions import Invalid
-from zope.interface.interface import Attribute
-from zope.interface.interface import interfacemethod
-from zope.interface.interface import invariant
-from zope.interface.interface import taggedValue
-from zope.interface.interfaces import IInterfaceDeclaration
-
-
-moduleProvides(IInterfaceDeclaration)
-
-__all__ = ('Interface', 'Attribute') + tuple(IInterfaceDeclaration)
-
-assert all(k in globals() for k in __all__)
diff --git a/resources/python/bin/3.7/linux/zope/interface/_compat.py b/resources/python/bin/3.7/linux/zope/interface/_compat.py
deleted file mode 100644
index 2ff8d83ea..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/_compat.py
+++ /dev/null
@@ -1,135 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-Support functions for dealing with differences in platforms, including Python
-versions and implementations.
-
-This file should have no imports from the rest of zope.interface because it is
-used during early bootstrapping.
-"""
-import os
-import sys
-
-
-def _normalize_name(name):
- if isinstance(name, bytes):
- name = str(name, 'ascii')
- if isinstance(name, str):
- return name
- raise TypeError("name must be a string or ASCII-only bytes")
-
-PYPY = hasattr(sys, 'pypy_version_info')
-
-
-def _c_optimizations_required():
- """
- Return a true value if the C optimizations are required.
-
- This uses the ``PURE_PYTHON`` variable as documented in `_use_c_impl`.
- """
- pure_env = os.environ.get('PURE_PYTHON')
- require_c = pure_env == "0"
- return require_c
-
-
-def _c_optimizations_available():
- """
- Return the C optimization module, if available, otherwise
- a false value.
-
- If the optimizations are required but not available, this
- raises the ImportError.
-
- This does not say whether they should be used or not.
- """
- catch = () if _c_optimizations_required() else (ImportError,)
- try:
- from zope.interface import _zope_interface_coptimizations as c_opt
- return c_opt
- except catch: # pragma: no cover (only Jython doesn't build extensions)
- return False
-
-
-def _c_optimizations_ignored():
- """
- The opposite of `_c_optimizations_required`.
- """
- pure_env = os.environ.get('PURE_PYTHON')
- return pure_env is not None and pure_env != "0"
-
-
-def _should_attempt_c_optimizations():
- """
- Return a true value if we should attempt to use the C optimizations.
-
- This takes into account whether we're on PyPy and the value of the
- ``PURE_PYTHON`` environment variable, as defined in `_use_c_impl`.
- """
- is_pypy = hasattr(sys, 'pypy_version_info')
-
- if _c_optimizations_required():
- return True
- if is_pypy:
- return False
- return not _c_optimizations_ignored()
-
-
-def _use_c_impl(py_impl, name=None, globs=None):
- """
- Decorator. Given an object implemented in Python, with a name like
- ``Foo``, import the corresponding C implementation from
- ``zope.interface._zope_interface_coptimizations`` with the name
- ``Foo`` and use it instead.
-
- If the ``PURE_PYTHON`` environment variable is set to any value
- other than ``"0"``, or we're on PyPy, ignore the C implementation
- and return the Python version. If the C implementation cannot be
- imported, return the Python version. If ``PURE_PYTHON`` is set to
- 0, *require* the C implementation (let the ImportError propagate);
- note that PyPy can import the C implementation in this case (and all
- tests pass).
-
- In all cases, the Python version is kept available. in the module
- globals with the name ``FooPy`` and the name ``FooFallback`` (both
- conventions have been used; the C implementation of some functions
- looks for the ``Fallback`` version, as do some of the Sphinx
- documents).
-
- Example::
-
- @_use_c_impl
- class Foo(object):
- ...
- """
- name = name or py_impl.__name__
- globs = globs or sys._getframe(1).f_globals
-
- def find_impl():
- if not _should_attempt_c_optimizations():
- return py_impl
-
- c_opt = _c_optimizations_available()
- if not c_opt: # pragma: no cover (only Jython doesn't build extensions)
- return py_impl
-
- __traceback_info__ = c_opt
- return getattr(c_opt, name)
-
- c_impl = find_impl()
- # Always make available by the FooPy name and FooFallback
- # name (for testing and documentation)
- globs[name + 'Py'] = py_impl
- globs[name + 'Fallback'] = py_impl
-
- return c_impl
diff --git a/resources/python/bin/3.7/linux/zope/interface/_flatten.py b/resources/python/bin/3.7/linux/zope/interface/_flatten.py
deleted file mode 100644
index 68b490db1..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/_flatten.py
+++ /dev/null
@@ -1,36 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Adapter-style interface registry
-
-See Adapter class.
-"""
-from zope.interface import Declaration
-
-
-def _flatten(implements, include_None=0):
-
- try:
- r = implements.flattened()
- except AttributeError:
- if implements is None:
- r=()
- else:
- r = Declaration(implements).flattened()
-
- if not include_None:
- return r
-
- r = list(r)
- r.append(None)
- return r
diff --git a/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.c b/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.c
deleted file mode 100644
index 2cf453a7e..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.c
+++ /dev/null
@@ -1,2081 +0,0 @@
-/*###########################################################################
- #
- # Copyright (c) 2003 Zope Foundation and Contributors.
- # All Rights Reserved.
- #
- # This software is subject to the provisions of the Zope Public License,
- # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
- # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
- # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
- # FOR A PARTICULAR PURPOSE.
- #
- ############################################################################*/
-
-#include "Python.h"
-#include "structmember.h"
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-parameter"
-#pragma clang diagnostic ignored "-Wmissing-field-initializers"
-#endif
-
-#define TYPE(O) ((PyTypeObject*)(O))
-#define OBJECT(O) ((PyObject*)(O))
-#define CLASSIC(O) ((PyClassObject*)(O))
-#ifndef PyVarObject_HEAD_INIT
-#define PyVarObject_HEAD_INIT(a, b) PyObject_HEAD_INIT(a) b,
-#endif
-#ifndef Py_TYPE
-#define Py_TYPE(o) ((o)->ob_type)
-#endif
-
-#define PyNative_FromString PyUnicode_FromString
-
-static PyObject *str__dict__, *str__implemented__, *strextends;
-static PyObject *BuiltinImplementationSpecifications, *str__provides__;
-static PyObject *str__class__, *str__providedBy__;
-static PyObject *empty, *fallback;
-static PyObject *str__conform__, *str_call_conform, *adapter_hooks;
-static PyObject *str_uncached_lookup, *str_uncached_lookupAll;
-static PyObject *str_uncached_subscriptions;
-static PyObject *str_registry, *strro, *str_generation, *strchanged;
-static PyObject *str__self__;
-static PyObject *str__module__;
-static PyObject *str__name__;
-static PyObject *str__adapt__;
-static PyObject *str_CALL_CUSTOM_ADAPT;
-
-static PyTypeObject *Implements;
-
-static int imported_declarations = 0;
-
-static int
-import_declarations(void)
-{
- PyObject *declarations, *i;
-
- declarations = PyImport_ImportModule("zope.interface.declarations");
- if (declarations == NULL)
- return -1;
-
- BuiltinImplementationSpecifications = PyObject_GetAttrString(
- declarations, "BuiltinImplementationSpecifications");
- if (BuiltinImplementationSpecifications == NULL)
- return -1;
-
- empty = PyObject_GetAttrString(declarations, "_empty");
- if (empty == NULL)
- return -1;
-
- fallback = PyObject_GetAttrString(declarations, "implementedByFallback");
- if (fallback == NULL)
- return -1;
-
-
-
- i = PyObject_GetAttrString(declarations, "Implements");
- if (i == NULL)
- return -1;
-
- if (! PyType_Check(i))
- {
- PyErr_SetString(PyExc_TypeError,
- "zope.interface.declarations.Implements is not a type");
- return -1;
- }
-
- Implements = (PyTypeObject *)i;
-
- Py_DECREF(declarations);
-
- imported_declarations = 1;
- return 0;
-}
-
-
-static PyTypeObject SpecificationBaseType; /* Forward */
-
-static PyObject *
-implementedByFallback(PyObject *cls)
-{
- if (imported_declarations == 0 && import_declarations() < 0)
- return NULL;
-
- return PyObject_CallFunctionObjArgs(fallback, cls, NULL);
-}
-
-static PyObject *
-implementedBy(PyObject *ignored, PyObject *cls)
-{
- /* Fast retrieval of implements spec, if possible, to optimize
- common case. Use fallback code if we get stuck.
- */
-
- PyObject *dict = NULL, *spec;
-
- if (PyObject_TypeCheck(cls, &PySuper_Type))
- {
- // Let merging be handled by Python.
- return implementedByFallback(cls);
- }
-
- if (PyType_Check(cls))
- {
- dict = TYPE(cls)->tp_dict;
- Py_XINCREF(dict);
- }
-
- if (dict == NULL)
- dict = PyObject_GetAttr(cls, str__dict__);
-
- if (dict == NULL)
- {
- /* Probably a security proxied class, use more expensive fallback code */
- PyErr_Clear();
- return implementedByFallback(cls);
- }
-
- spec = PyObject_GetItem(dict, str__implemented__);
- Py_DECREF(dict);
- if (spec)
- {
- if (imported_declarations == 0 && import_declarations() < 0)
- return NULL;
-
- if (PyObject_TypeCheck(spec, Implements))
- return spec;
-
- /* Old-style declaration, use more expensive fallback code */
- Py_DECREF(spec);
- return implementedByFallback(cls);
- }
-
- PyErr_Clear();
-
- /* Maybe we have a builtin */
- if (imported_declarations == 0 && import_declarations() < 0)
- return NULL;
-
- spec = PyDict_GetItem(BuiltinImplementationSpecifications, cls);
- if (spec != NULL)
- {
- Py_INCREF(spec);
- return spec;
- }
-
- /* We're stuck, use fallback */
- return implementedByFallback(cls);
-}
-
-static PyObject *
-getObjectSpecification(PyObject *ignored, PyObject *ob)
-{
- PyObject *cls, *result;
-
- result = PyObject_GetAttr(ob, str__provides__);
- if (!result)
- {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- /* Propagate non AttributeError exceptions. */
- return NULL;
- }
- PyErr_Clear();
- }
- else
- {
- int is_instance = -1;
- is_instance = PyObject_IsInstance(result, (PyObject*)&SpecificationBaseType);
- if (is_instance < 0)
- {
- /* Propagate all errors */
- return NULL;
- }
- if (is_instance)
- {
- return result;
- }
- }
-
- /* We do a getattr here so as not to be defeated by proxies */
- cls = PyObject_GetAttr(ob, str__class__);
- if (cls == NULL)
- {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- /* Propagate non-AttributeErrors */
- return NULL;
- }
- PyErr_Clear();
- if (imported_declarations == 0 && import_declarations() < 0)
- return NULL;
-
- Py_INCREF(empty);
- return empty;
- }
- result = implementedBy(NULL, cls);
- Py_DECREF(cls);
-
- return result;
-}
-
-static PyObject *
-providedBy(PyObject *ignored, PyObject *ob)
-{
- PyObject *result, *cls, *cp;
- int is_instance = -1;
- result = NULL;
-
- is_instance = PyObject_IsInstance(ob, (PyObject*)&PySuper_Type);
- if (is_instance < 0)
- {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- /* Propagate non-AttributeErrors */
- return NULL;
- }
- PyErr_Clear();
- }
- if (is_instance)
- {
- return implementedBy(NULL, ob);
- }
-
- result = PyObject_GetAttr(ob, str__providedBy__);
-
- if (result == NULL)
- {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- return NULL;
- }
-
- PyErr_Clear();
- return getObjectSpecification(NULL, ob);
- }
-
-
- /* We want to make sure we have a spec. We can't do a type check
- because we may have a proxy, so we'll just try to get the
- only attribute.
- */
- if (PyObject_TypeCheck(result, &SpecificationBaseType)
- ||
- PyObject_HasAttr(result, strextends)
- )
- return result;
-
- /*
- The object's class doesn't understand descriptors.
- Sigh. We need to get an object descriptor, but we have to be
- careful. We want to use the instance's __provides__,l if
- there is one, but only if it didn't come from the class.
- */
- Py_DECREF(result);
-
- cls = PyObject_GetAttr(ob, str__class__);
- if (cls == NULL)
- return NULL;
-
- result = PyObject_GetAttr(ob, str__provides__);
- if (result == NULL)
- {
- /* No __provides__, so just fall back to implementedBy */
- PyErr_Clear();
- result = implementedBy(NULL, cls);
- Py_DECREF(cls);
- return result;
- }
-
- cp = PyObject_GetAttr(cls, str__provides__);
- if (cp == NULL)
- {
- /* The the class has no provides, assume we're done: */
- PyErr_Clear();
- Py_DECREF(cls);
- return result;
- }
-
- if (cp == result)
- {
- /*
- Oops, we got the provides from the class. This means
- the object doesn't have it's own. We should use implementedBy
- */
- Py_DECREF(result);
- result = implementedBy(NULL, cls);
- }
-
- Py_DECREF(cls);
- Py_DECREF(cp);
-
- return result;
-}
-
-typedef struct {
- PyObject_HEAD
- PyObject* weakreflist;
- /*
- In the past, these fields were stored in the __dict__
- and were technically allowed to contain any Python object, though
- other type checks would fail or fall back to generic code paths if
- they didn't have the expected type. We preserve that behaviour and don't
- make any assumptions about contents.
- */
- PyObject* _implied;
- /*
- The remainder aren't used in C code but must be stored here
- to prevent instance layout conflicts.
- */
- PyObject* _dependents;
- PyObject* _bases;
- PyObject* _v_attrs;
- PyObject* __iro__;
- PyObject* __sro__;
-} Spec;
-
-/*
- We know what the fields are *supposed* to define, but
- they could have anything, so we need to traverse them.
-*/
-static int
-Spec_traverse(Spec* self, visitproc visit, void* arg)
-{
- Py_VISIT(self->_implied);
- Py_VISIT(self->_dependents);
- Py_VISIT(self->_bases);
- Py_VISIT(self->_v_attrs);
- Py_VISIT(self->__iro__);
- Py_VISIT(self->__sro__);
- return 0;
-}
-
-static int
-Spec_clear(Spec* self)
-{
- Py_CLEAR(self->_implied);
- Py_CLEAR(self->_dependents);
- Py_CLEAR(self->_bases);
- Py_CLEAR(self->_v_attrs);
- Py_CLEAR(self->__iro__);
- Py_CLEAR(self->__sro__);
- return 0;
-}
-
-static void
-Spec_dealloc(Spec* self)
-{
- /* PyType_GenericAlloc that you get when you don't
- specify a tp_alloc always tracks the object. */
- PyObject_GC_UnTrack((PyObject *)self);
- if (self->weakreflist != NULL) {
- PyObject_ClearWeakRefs(OBJECT(self));
- }
- Spec_clear(self);
- Py_TYPE(self)->tp_free(OBJECT(self));
-}
-
-static PyObject *
-Spec_extends(Spec *self, PyObject *other)
-{
- PyObject *implied;
-
- implied = self->_implied;
- if (implied == NULL) {
- return NULL;
- }
-
- if (PyDict_GetItem(implied, other) != NULL)
- Py_RETURN_TRUE;
- Py_RETURN_FALSE;
-}
-
-static char Spec_extends__doc__[] =
-"Test whether a specification is or extends another"
-;
-
-static char Spec_providedBy__doc__[] =
-"Test whether an interface is implemented by the specification"
-;
-
-static PyObject *
-Spec_call(Spec *self, PyObject *args, PyObject *kw)
-{
- PyObject *spec;
-
- if (! PyArg_ParseTuple(args, "O", &spec))
- return NULL;
- return Spec_extends(self, spec);
-}
-
-static PyObject *
-Spec_providedBy(PyObject *self, PyObject *ob)
-{
- PyObject *decl, *item;
-
- decl = providedBy(NULL, ob);
- if (decl == NULL)
- return NULL;
-
- if (PyObject_TypeCheck(decl, &SpecificationBaseType))
- item = Spec_extends((Spec*)decl, self);
- else
- /* decl is probably a security proxy. We have to go the long way
- around.
- */
- item = PyObject_CallFunctionObjArgs(decl, self, NULL);
-
- Py_DECREF(decl);
- return item;
-}
-
-
-static char Spec_implementedBy__doc__[] =
-"Test whether the specification is implemented by a class or factory.\n"
-"Raise TypeError if argument is neither a class nor a callable."
-;
-
-static PyObject *
-Spec_implementedBy(PyObject *self, PyObject *cls)
-{
- PyObject *decl, *item;
-
- decl = implementedBy(NULL, cls);
- if (decl == NULL)
- return NULL;
-
- if (PyObject_TypeCheck(decl, &SpecificationBaseType))
- item = Spec_extends((Spec*)decl, self);
- else
- item = PyObject_CallFunctionObjArgs(decl, self, NULL);
-
- Py_DECREF(decl);
- return item;
-}
-
-static struct PyMethodDef Spec_methods[] = {
- {"providedBy",
- (PyCFunction)Spec_providedBy, METH_O,
- Spec_providedBy__doc__},
- {"implementedBy",
- (PyCFunction)Spec_implementedBy, METH_O,
- Spec_implementedBy__doc__},
- {"isOrExtends", (PyCFunction)Spec_extends, METH_O,
- Spec_extends__doc__},
-
- {NULL, NULL} /* sentinel */
-};
-
-static PyMemberDef Spec_members[] = {
- {"_implied", T_OBJECT_EX, offsetof(Spec, _implied), 0, ""},
- {"_dependents", T_OBJECT_EX, offsetof(Spec, _dependents), 0, ""},
- {"_bases", T_OBJECT_EX, offsetof(Spec, _bases), 0, ""},
- {"_v_attrs", T_OBJECT_EX, offsetof(Spec, _v_attrs), 0, ""},
- {"__iro__", T_OBJECT_EX, offsetof(Spec, __iro__), 0, ""},
- {"__sro__", T_OBJECT_EX, offsetof(Spec, __sro__), 0, ""},
- {NULL},
-};
-
-
-static PyTypeObject SpecificationBaseType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_interface_coptimizations."
- "SpecificationBase",
- /* tp_basicsize */ sizeof(Spec),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)Spec_dealloc,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)0,
- /* tp_call */ (ternaryfunc)Spec_call,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
- "Base type for Specification objects",
- /* tp_traverse */ (traverseproc)Spec_traverse,
- /* tp_clear */ (inquiry)Spec_clear,
- /* tp_richcompare */ (richcmpfunc)0,
- /* tp_weaklistoffset */ offsetof(Spec, weakreflist),
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ Spec_methods,
- /* tp_members */ Spec_members,
-};
-
-static PyObject *
-OSD_descr_get(PyObject *self, PyObject *inst, PyObject *cls)
-{
- PyObject *provides;
-
- if (inst == NULL)
- return getObjectSpecification(NULL, cls);
-
- provides = PyObject_GetAttr(inst, str__provides__);
- /* Return __provides__ if we got it, or return NULL and propagate non-AttributeError. */
- if (provides != NULL || !PyErr_ExceptionMatches(PyExc_AttributeError))
- return provides;
-
- PyErr_Clear();
- return implementedBy(NULL, cls);
-}
-
-static PyTypeObject OSDType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_interface_coptimizations."
- "ObjectSpecificationDescriptor",
- /* tp_basicsize */ 0,
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)0,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)0,
- /* tp_call */ (ternaryfunc)0,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE ,
- "Object Specification Descriptor",
- /* tp_traverse */ (traverseproc)0,
- /* tp_clear */ (inquiry)0,
- /* tp_richcompare */ (richcmpfunc)0,
- /* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ 0,
- /* tp_members */ 0,
- /* tp_getset */ 0,
- /* tp_base */ 0,
- /* tp_dict */ 0, /* internal use */
- /* tp_descr_get */ (descrgetfunc)OSD_descr_get,
-};
-
-typedef struct {
- Spec spec;
- /* These members are handled generically, as for Spec members. */
- PyObject* _cls;
- PyObject* _implements;
-} CPB;
-
-static PyObject *
-CPB_descr_get(CPB *self, PyObject *inst, PyObject *cls)
-{
- PyObject *implements;
-
- if (self->_cls == NULL)
- return NULL;
-
- if (cls == self->_cls)
- {
- if (inst == NULL)
- {
- Py_INCREF(self);
- return OBJECT(self);
- }
-
- implements = self->_implements;
- Py_XINCREF(implements);
- return implements;
- }
-
- PyErr_SetObject(PyExc_AttributeError, str__provides__);
- return NULL;
-}
-
-static int
-CPB_traverse(CPB* self, visitproc visit, void* arg)
-{
- Py_VISIT(self->_cls);
- Py_VISIT(self->_implements);
- return Spec_traverse((Spec*)self, visit, arg);
-}
-
-static int
-CPB_clear(CPB* self)
-{
- Py_CLEAR(self->_cls);
- Py_CLEAR(self->_implements);
- Spec_clear((Spec*)self);
- return 0;
-}
-
-static void
-CPB_dealloc(CPB* self)
-{
- PyObject_GC_UnTrack((PyObject *)self);
- CPB_clear(self);
- Spec_dealloc((Spec*)self);
-}
-
-static PyMemberDef CPB_members[] = {
- {"_cls", T_OBJECT_EX, offsetof(CPB, _cls), 0, "Defining class."},
- {"_implements", T_OBJECT_EX, offsetof(CPB, _implements), 0, "Result of implementedBy."},
- {NULL}
-};
-
-static PyTypeObject CPBType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_interface_coptimizations."
- "ClassProvidesBase",
- /* tp_basicsize */ sizeof(CPB),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)CPB_dealloc,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)0,
- /* tp_call */ (ternaryfunc)0,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
- "C Base class for ClassProvides",
- /* tp_traverse */ (traverseproc)CPB_traverse,
- /* tp_clear */ (inquiry)CPB_clear,
- /* tp_richcompare */ (richcmpfunc)0,
- /* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ 0,
- /* tp_members */ CPB_members,
- /* tp_getset */ 0,
- /* tp_base */ &SpecificationBaseType,
- /* tp_dict */ 0, /* internal use */
- /* tp_descr_get */ (descrgetfunc)CPB_descr_get,
- /* tp_descr_set */ 0,
- /* tp_dictoffset */ 0,
- /* tp_init */ 0,
- /* tp_alloc */ 0,
- /* tp_new */ 0,
-};
-
-/* ==================================================================== */
-/* ========== Begin: __call__ and __adapt__ =========================== */
-
-/*
- def __adapt__(self, obj):
- """Adapt an object to the receiver
- """
- if self.providedBy(obj):
- return obj
-
- for hook in adapter_hooks:
- adapter = hook(self, obj)
- if adapter is not None:
- return adapter
-
-
-*/
-static PyObject *
-__adapt__(PyObject *self, PyObject *obj)
-{
- PyObject *decl, *args, *adapter;
- int implements, i, l;
-
- decl = providedBy(NULL, obj);
- if (decl == NULL)
- return NULL;
-
- if (PyObject_TypeCheck(decl, &SpecificationBaseType))
- {
- PyObject *implied;
-
- implied = ((Spec*)decl)->_implied;
- if (implied == NULL)
- {
- Py_DECREF(decl);
- return NULL;
- }
-
- implements = PyDict_GetItem(implied, self) != NULL;
- Py_DECREF(decl);
- }
- else
- {
- /* decl is probably a security proxy. We have to go the long way
- around.
- */
- PyObject *r;
- r = PyObject_CallFunctionObjArgs(decl, self, NULL);
- Py_DECREF(decl);
- if (r == NULL)
- return NULL;
- implements = PyObject_IsTrue(r);
- Py_DECREF(r);
- }
-
- if (implements)
- {
- Py_INCREF(obj);
- return obj;
- }
-
- l = PyList_GET_SIZE(adapter_hooks);
- args = PyTuple_New(2);
- if (args == NULL)
- return NULL;
- Py_INCREF(self);
- PyTuple_SET_ITEM(args, 0, self);
- Py_INCREF(obj);
- PyTuple_SET_ITEM(args, 1, obj);
- for (i = 0; i < l; i++)
- {
- adapter = PyObject_CallObject(PyList_GET_ITEM(adapter_hooks, i), args);
- if (adapter == NULL || adapter != Py_None)
- {
- Py_DECREF(args);
- return adapter;
- }
- Py_DECREF(adapter);
- }
-
- Py_DECREF(args);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-typedef struct {
- Spec spec;
- PyObject* __name__;
- PyObject* __module__;
- Py_hash_t _v_cached_hash;
-} IB;
-
-static struct PyMethodDef ib_methods[] = {
- {"__adapt__", (PyCFunction)__adapt__, METH_O,
- "Adapt an object to the receiver"},
- {NULL, NULL} /* sentinel */
-};
-
-/*
- def __call__(self, obj, alternate=_marker):
- try:
- conform = obj.__conform__
- except AttributeError: # pylint:disable=bare-except
- conform = None
-
- if conform is not None:
- adapter = self._call_conform(conform)
- if adapter is not None:
- return adapter
-
- adapter = self.__adapt__(obj)
-
- if adapter is not None:
- return adapter
- if alternate is not _marker:
- return alternate
- raise TypeError("Could not adapt", obj, self)
-
-*/
-static PyObject *
-IB_call(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *conform, *obj, *alternate, *adapter;
- static char *kwlist[] = {"obj", "alternate", NULL};
- conform = obj = alternate = adapter = NULL;
-
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist,
- &obj, &alternate))
- return NULL;
-
- conform = PyObject_GetAttr(obj, str__conform__);
- if (conform == NULL)
- {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- /* Propagate non-AttributeErrors */
- return NULL;
- }
- PyErr_Clear();
-
- Py_INCREF(Py_None);
- conform = Py_None;
- }
-
- if (conform != Py_None)
- {
- adapter = PyObject_CallMethodObjArgs(self, str_call_conform,
- conform, NULL);
- Py_DECREF(conform);
- if (adapter == NULL || adapter != Py_None)
- return adapter;
- Py_DECREF(adapter);
- }
- else
- {
- Py_DECREF(conform);
- }
-
- /* We differ from the Python code here. For speed, instead of always calling
- self.__adapt__(), we check to see if the type has defined it. Checking in
- the dict for __adapt__ isn't sufficient because there's no cheap way to
- tell if it's the __adapt__ that InterfaceBase itself defines (our type
- will *never* be InterfaceBase, we're always subclassed by
- InterfaceClass). Instead, we cooperate with InterfaceClass in Python to
- set a flag in a new subclass when this is necessary. */
- if (PyDict_GetItem(self->ob_type->tp_dict, str_CALL_CUSTOM_ADAPT))
- {
- /* Doesn't matter what the value is. Simply being present is enough. */
- adapter = PyObject_CallMethodObjArgs(self, str__adapt__, obj, NULL);
- }
- else
- {
- adapter = __adapt__(self, obj);
- }
-
- if (adapter == NULL || adapter != Py_None)
- {
- return adapter;
- }
- Py_DECREF(adapter);
-
- if (alternate != NULL)
- {
- Py_INCREF(alternate);
- return alternate;
- }
-
- adapter = Py_BuildValue("sOO", "Could not adapt", obj, self);
- if (adapter != NULL)
- {
- PyErr_SetObject(PyExc_TypeError, adapter);
- Py_DECREF(adapter);
- }
- return NULL;
-}
-
-
-static int
-IB_traverse(IB* self, visitproc visit, void* arg)
-{
- Py_VISIT(self->__name__);
- Py_VISIT(self->__module__);
- return Spec_traverse((Spec*)self, visit, arg);
-}
-
-static int
-IB_clear(IB* self)
-{
- Py_CLEAR(self->__name__);
- Py_CLEAR(self->__module__);
- return Spec_clear((Spec*)self);
-}
-
-static void
-IB_dealloc(IB* self)
-{
- PyObject_GC_UnTrack((PyObject *)self);
- IB_clear(self);
- Spec_dealloc((Spec*)self);
-}
-
-static PyMemberDef IB_members[] = {
- {"__name__", T_OBJECT_EX, offsetof(IB, __name__), 0, ""},
- // The redundancy between __module__ and __ibmodule__ is because
- // __module__ is often shadowed by subclasses.
- {"__module__", T_OBJECT_EX, offsetof(IB, __module__), READONLY, ""},
- {"__ibmodule__", T_OBJECT_EX, offsetof(IB, __module__), 0, ""},
- {NULL}
-};
-
-static Py_hash_t
-IB_hash(IB* self)
-{
- PyObject* tuple;
- if (!self->__module__) {
- PyErr_SetString(PyExc_AttributeError, "__module__");
- return -1;
- }
- if (!self->__name__) {
- PyErr_SetString(PyExc_AttributeError, "__name__");
- return -1;
- }
-
- if (self->_v_cached_hash) {
- return self->_v_cached_hash;
- }
-
- tuple = PyTuple_Pack(2, self->__name__, self->__module__);
- if (!tuple) {
- return -1;
- }
- self->_v_cached_hash = PyObject_Hash(tuple);
- Py_CLEAR(tuple);
- return self->_v_cached_hash;
-}
-
-static PyTypeObject InterfaceBaseType;
-
-static PyObject*
-IB_richcompare(IB* self, PyObject* other, int op)
-{
- PyObject* othername;
- PyObject* othermod;
- PyObject* oresult;
- IB* otherib;
- int result;
-
- otherib = NULL;
- oresult = othername = othermod = NULL;
-
- if (OBJECT(self) == other) {
- switch(op) {
- case Py_EQ:
- case Py_LE:
- case Py_GE:
- Py_RETURN_TRUE;
- break;
- case Py_NE:
- Py_RETURN_FALSE;
- }
- }
-
- if (other == Py_None) {
- switch(op) {
- case Py_LT:
- case Py_LE:
- case Py_NE:
- Py_RETURN_TRUE;
- default:
- Py_RETURN_FALSE;
- }
- }
-
- if (PyObject_TypeCheck(other, &InterfaceBaseType)) {
- // This branch borrows references. No need to clean
- // up if otherib is not null.
- otherib = (IB*)other;
- othername = otherib->__name__;
- othermod = otherib->__module__;
- }
- else {
- othername = PyObject_GetAttrString(other, "__name__");
- if (othername) {
- othermod = PyObject_GetAttrString(other, "__module__");
- }
- if (!othername || !othermod) {
- if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- oresult = Py_NotImplemented;
- }
- goto cleanup;
- }
- }
-#if 0
-// This is the simple, straightforward version of what Python does.
- PyObject* pt1 = PyTuple_Pack(2, self->__name__, self->__module__);
- PyObject* pt2 = PyTuple_Pack(2, othername, othermod);
- oresult = PyObject_RichCompare(pt1, pt2, op);
-#endif
-
- // tuple comparison is decided by the first non-equal element.
- result = PyObject_RichCompareBool(self->__name__, othername, Py_EQ);
- if (result == 0) {
- result = PyObject_RichCompareBool(self->__name__, othername, op);
- }
- else if (result == 1) {
- result = PyObject_RichCompareBool(self->__module__, othermod, op);
- }
- // If either comparison failed, we have an error set.
- // Leave oresult NULL so we raise it.
- if (result == -1) {
- goto cleanup;
- }
-
- oresult = result ? Py_True : Py_False;
-
-
-cleanup:
- Py_XINCREF(oresult);
-
- if (!otherib) {
- Py_XDECREF(othername);
- Py_XDECREF(othermod);
- }
- return oresult;
-
-}
-
-static int
-IB_init(IB* self, PyObject* args, PyObject* kwargs)
-{
- static char *kwlist[] = {"__name__", "__module__", NULL};
- PyObject* module = NULL;
- PyObject* name = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO:InterfaceBase.__init__", kwlist,
- &name, &module)) {
- return -1;
- }
- IB_clear(self);
- self->__module__ = module ? module : Py_None;
- Py_INCREF(self->__module__);
- self->__name__ = name ? name : Py_None;
- Py_INCREF(self->__name__);
- return 0;
-}
-
-
-static PyTypeObject InterfaceBaseType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_zope_interface_coptimizations."
- "InterfaceBase",
- /* tp_basicsize */ sizeof(IB),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)IB_dealloc,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)IB_hash,
- /* tp_call */ (ternaryfunc)IB_call,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
- /* tp_doc */ "Interface base type providing __call__ and __adapt__",
- /* tp_traverse */ (traverseproc)IB_traverse,
- /* tp_clear */ (inquiry)IB_clear,
- /* tp_richcompare */ (richcmpfunc)IB_richcompare,
- /* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ ib_methods,
- /* tp_members */ IB_members,
- /* tp_getset */ 0,
- /* tp_base */ &SpecificationBaseType,
- /* tp_dict */ 0,
- /* tp_descr_get */ 0,
- /* tp_descr_set */ 0,
- /* tp_dictoffset */ 0,
- /* tp_init */ (initproc)IB_init,
-};
-
-/* =================== End: __call__ and __adapt__ ==================== */
-/* ==================================================================== */
-
-/* ==================================================================== */
-/* ========================== Begin: Lookup Bases ===================== */
-
-typedef struct {
- PyObject_HEAD
- PyObject *_cache;
- PyObject *_mcache;
- PyObject *_scache;
-} lookup;
-
-typedef struct {
- PyObject_HEAD
- PyObject *_cache;
- PyObject *_mcache;
- PyObject *_scache;
- PyObject *_verify_ro;
- PyObject *_verify_generations;
-} verify;
-
-static int
-lookup_traverse(lookup *self, visitproc visit, void *arg)
-{
- int vret;
-
- if (self->_cache) {
- vret = visit(self->_cache, arg);
- if (vret != 0)
- return vret;
- }
-
- if (self->_mcache) {
- vret = visit(self->_mcache, arg);
- if (vret != 0)
- return vret;
- }
-
- if (self->_scache) {
- vret = visit(self->_scache, arg);
- if (vret != 0)
- return vret;
- }
-
- return 0;
-}
-
-static int
-lookup_clear(lookup *self)
-{
- Py_CLEAR(self->_cache);
- Py_CLEAR(self->_mcache);
- Py_CLEAR(self->_scache);
- return 0;
-}
-
-static void
-lookup_dealloc(lookup *self)
-{
- PyObject_GC_UnTrack((PyObject *)self);
- lookup_clear(self);
- Py_TYPE(self)->tp_free((PyObject*)self);
-}
-
-/*
- def changed(self, ignored=None):
- self._cache.clear()
- self._mcache.clear()
- self._scache.clear()
-*/
-static PyObject *
-lookup_changed(lookup *self, PyObject *ignored)
-{
- lookup_clear(self);
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-#define ASSURE_DICT(N) if (N == NULL) { N = PyDict_New(); \
- if (N == NULL) return NULL; \
- }
-
-/*
- def _getcache(self, provided, name):
- cache = self._cache.get(provided)
- if cache is None:
- cache = {}
- self._cache[provided] = cache
- if name:
- c = cache.get(name)
- if c is None:
- c = {}
- cache[name] = c
- cache = c
- return cache
-*/
-static PyObject *
-_subcache(PyObject *cache, PyObject *key)
-{
- PyObject *subcache;
-
- subcache = PyDict_GetItem(cache, key);
- if (subcache == NULL)
- {
- int status;
-
- subcache = PyDict_New();
- if (subcache == NULL)
- return NULL;
- status = PyDict_SetItem(cache, key, subcache);
- Py_DECREF(subcache);
- if (status < 0)
- return NULL;
- }
-
- return subcache;
-}
-static PyObject *
-_getcache(lookup *self, PyObject *provided, PyObject *name)
-{
- PyObject *cache;
-
- ASSURE_DICT(self->_cache);
- cache = _subcache(self->_cache, provided);
- if (cache == NULL)
- return NULL;
-
- if (name != NULL && PyObject_IsTrue(name))
- cache = _subcache(cache, name);
-
- return cache;
-}
-
-
-/*
- def lookup(self, required, provided, name=u'', default=None):
- cache = self._getcache(provided, name)
- if len(required) == 1:
- result = cache.get(required[0], _not_in_mapping)
- else:
- result = cache.get(tuple(required), _not_in_mapping)
-
- if result is _not_in_mapping:
- result = self._uncached_lookup(required, provided, name)
- if len(required) == 1:
- cache[required[0]] = result
- else:
- cache[tuple(required)] = result
-
- if result is None:
- return default
-
- return result
-*/
-
-static PyObject *
-_lookup(lookup *self,
- PyObject *required, PyObject *provided, PyObject *name,
- PyObject *default_)
-{
- PyObject *result, *key, *cache;
- result = key = cache = NULL;
- if ( name && !PyUnicode_Check(name) )
- {
- PyErr_SetString(PyExc_ValueError,
- "name is not a string or unicode");
- return NULL;
- }
-
- /* If `required` is a lazy sequence, it could have arbitrary side-effects,
- such as clearing our caches. So we must not retrieve the cache until
- after resolving it. */
- required = PySequence_Tuple(required);
- if (required == NULL)
- return NULL;
-
-
- cache = _getcache(self, provided, name);
- if (cache == NULL)
- return NULL;
-
- if (PyTuple_GET_SIZE(required) == 1)
- key = PyTuple_GET_ITEM(required, 0);
- else
- key = required;
-
- result = PyDict_GetItem(cache, key);
- if (result == NULL)
- {
- int status;
-
- result = PyObject_CallMethodObjArgs(OBJECT(self), str_uncached_lookup,
- required, provided, name, NULL);
- if (result == NULL)
- {
- Py_DECREF(required);
- return NULL;
- }
- status = PyDict_SetItem(cache, key, result);
- Py_DECREF(required);
- if (status < 0)
- {
- Py_DECREF(result);
- return NULL;
- }
- }
- else
- {
- Py_INCREF(result);
- Py_DECREF(required);
- }
-
- if (result == Py_None && default_ != NULL)
- {
- Py_DECREF(Py_None);
- Py_INCREF(default_);
- return default_;
- }
-
- return result;
-}
-static PyObject *
-lookup_lookup(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", "name", "default", NULL};
- PyObject *required, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.lookup", kwlist,
- &required, &provided, &name, &default_))
- return NULL;
-
- return _lookup(self, required, provided, name, default_);
-}
-
-
-/*
- def lookup1(self, required, provided, name=u'', default=None):
- cache = self._getcache(provided, name)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- return self.lookup((required, ), provided, name, default)
-
- if result is None:
- return default
-
- return result
-*/
-static PyObject *
-_lookup1(lookup *self,
- PyObject *required, PyObject *provided, PyObject *name,
- PyObject *default_)
-{
- PyObject *result, *cache;
-
- if ( name && !PyUnicode_Check(name) )
- {
- PyErr_SetString(PyExc_ValueError,
- "name is not a string or unicode");
- return NULL;
- }
-
- cache = _getcache(self, provided, name);
- if (cache == NULL)
- return NULL;
-
- result = PyDict_GetItem(cache, required);
- if (result == NULL)
- {
- PyObject *tup;
-
- tup = PyTuple_New(1);
- if (tup == NULL)
- return NULL;
- Py_INCREF(required);
- PyTuple_SET_ITEM(tup, 0, required);
- result = _lookup(self, tup, provided, name, default_);
- Py_DECREF(tup);
- }
- else
- {
- if (result == Py_None && default_ != NULL)
- {
- result = default_;
- }
- Py_INCREF(result);
- }
-
- return result;
-}
-static PyObject *
-lookup_lookup1(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", "name", "default", NULL};
- PyObject *required, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.lookup1", kwlist,
- &required, &provided, &name, &default_))
- return NULL;
-
- return _lookup1(self, required, provided, name, default_);
-}
-
-/*
- def adapter_hook(self, provided, object, name=u'', default=None):
- required = providedBy(object)
- cache = self._getcache(provided, name)
- factory = cache.get(required, _not_in_mapping)
- if factory is _not_in_mapping:
- factory = self.lookup((required, ), provided, name)
-
- if factory is not None:
- if isinstance(object, super):
- object = object.__self__
- result = factory(object)
- if result is not None:
- return result
-
- return default
-*/
-static PyObject *
-_adapter_hook(lookup *self,
- PyObject *provided, PyObject *object, PyObject *name,
- PyObject *default_)
-{
- PyObject *required, *factory, *result;
-
- if ( name && !PyUnicode_Check(name) )
- {
- PyErr_SetString(PyExc_ValueError,
- "name is not a string or unicode");
- return NULL;
- }
-
- required = providedBy(NULL, object);
- if (required == NULL)
- return NULL;
-
- factory = _lookup1(self, required, provided, name, Py_None);
- Py_DECREF(required);
- if (factory == NULL)
- return NULL;
-
- if (factory != Py_None)
- {
- if (PyObject_TypeCheck(object, &PySuper_Type)) {
- PyObject* self = PyObject_GetAttr(object, str__self__);
- if (self == NULL)
- {
- Py_DECREF(factory);
- return NULL;
- }
- // Borrow the reference to self
- Py_DECREF(self);
- object = self;
- }
- result = PyObject_CallFunctionObjArgs(factory, object, NULL);
- Py_DECREF(factory);
- if (result == NULL || result != Py_None)
- return result;
- }
- else
- result = factory; /* None */
-
- if (default_ == NULL || default_ == result) /* No default specified, */
- return result; /* Return None. result is owned None */
-
- Py_DECREF(result);
- Py_INCREF(default_);
-
- return default_;
-}
-static PyObject *
-lookup_adapter_hook(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"provided", "object", "name", "default", NULL};
- PyObject *object, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.adapter_hook", kwlist,
- &provided, &object, &name, &default_))
- return NULL;
-
- return _adapter_hook(self, provided, object, name, default_);
-}
-
-static PyObject *
-lookup_queryAdapter(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"object", "provided", "name", "default", NULL};
- PyObject *object, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.queryAdapter", kwlist,
- &object, &provided, &name, &default_))
- return NULL;
-
- return _adapter_hook(self, provided, object, name, default_);
-}
-
-/*
- def lookupAll(self, required, provided):
- cache = self._mcache.get(provided)
- if cache is None:
- cache = {}
- self._mcache[provided] = cache
-
- required = tuple(required)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- result = self._uncached_lookupAll(required, provided)
- cache[required] = result
-
- return result
-*/
-static PyObject *
-_lookupAll(lookup *self, PyObject *required, PyObject *provided)
-{
- PyObject *cache, *result;
-
- /* resolve before getting cache. See note in _lookup. */
- required = PySequence_Tuple(required);
- if (required == NULL)
- return NULL;
-
- ASSURE_DICT(self->_mcache);
- cache = _subcache(self->_mcache, provided);
- if (cache == NULL)
- return NULL;
-
- result = PyDict_GetItem(cache, required);
- if (result == NULL)
- {
- int status;
-
- result = PyObject_CallMethodObjArgs(OBJECT(self), str_uncached_lookupAll,
- required, provided, NULL);
- if (result == NULL)
- {
- Py_DECREF(required);
- return NULL;
- }
- status = PyDict_SetItem(cache, required, result);
- Py_DECREF(required);
- if (status < 0)
- {
- Py_DECREF(result);
- return NULL;
- }
- }
- else
- {
- Py_INCREF(result);
- Py_DECREF(required);
- }
-
- return result;
-}
-static PyObject *
-lookup_lookupAll(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", NULL};
- PyObject *required, *provided;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO:LookupBase.lookupAll", kwlist,
- &required, &provided))
- return NULL;
-
- return _lookupAll(self, required, provided);
-}
-
-/*
- def subscriptions(self, required, provided):
- cache = self._scache.get(provided)
- if cache is None:
- cache = {}
- self._scache[provided] = cache
-
- required = tuple(required)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- result = self._uncached_subscriptions(required, provided)
- cache[required] = result
-
- return result
-*/
-static PyObject *
-_subscriptions(lookup *self, PyObject *required, PyObject *provided)
-{
- PyObject *cache, *result;
-
- /* resolve before getting cache. See note in _lookup. */
- required = PySequence_Tuple(required);
- if (required == NULL)
- return NULL;
-
- ASSURE_DICT(self->_scache);
- cache = _subcache(self->_scache, provided);
- if (cache == NULL)
- return NULL;
-
- result = PyDict_GetItem(cache, required);
- if (result == NULL)
- {
- int status;
-
- result = PyObject_CallMethodObjArgs(
- OBJECT(self), str_uncached_subscriptions,
- required, provided, NULL);
- if (result == NULL)
- {
- Py_DECREF(required);
- return NULL;
- }
- status = PyDict_SetItem(cache, required, result);
- Py_DECREF(required);
- if (status < 0)
- {
- Py_DECREF(result);
- return NULL;
- }
- }
- else
- {
- Py_INCREF(result);
- Py_DECREF(required);
- }
-
- return result;
-}
-static PyObject *
-lookup_subscriptions(lookup *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", NULL};
- PyObject *required, *provided;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist,
- &required, &provided))
- return NULL;
-
- return _subscriptions(self, required, provided);
-}
-
-static struct PyMethodDef lookup_methods[] = {
- {"changed", (PyCFunction)lookup_changed, METH_O, ""},
- {"lookup", (PyCFunction)lookup_lookup, METH_KEYWORDS | METH_VARARGS, ""},
- {"lookup1", (PyCFunction)lookup_lookup1, METH_KEYWORDS | METH_VARARGS, ""},
- {"queryAdapter", (PyCFunction)lookup_queryAdapter, METH_KEYWORDS | METH_VARARGS, ""},
- {"adapter_hook", (PyCFunction)lookup_adapter_hook, METH_KEYWORDS | METH_VARARGS, ""},
- {"lookupAll", (PyCFunction)lookup_lookupAll, METH_KEYWORDS | METH_VARARGS, ""},
- {"subscriptions", (PyCFunction)lookup_subscriptions, METH_KEYWORDS | METH_VARARGS, ""},
- {NULL, NULL} /* sentinel */
-};
-
-static PyTypeObject LookupBase = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_zope_interface_coptimizations."
- "LookupBase",
- /* tp_basicsize */ sizeof(lookup),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)&lookup_dealloc,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)0,
- /* tp_call */ (ternaryfunc)0,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC,
- /* tp_doc */ "",
- /* tp_traverse */ (traverseproc)lookup_traverse,
- /* tp_clear */ (inquiry)lookup_clear,
- /* tp_richcompare */ (richcmpfunc)0,
- /* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ lookup_methods,
-};
-
-static int
-verifying_traverse(verify *self, visitproc visit, void *arg)
-{
- int vret;
-
- vret = lookup_traverse((lookup *)self, visit, arg);
- if (vret != 0)
- return vret;
-
- if (self->_verify_ro) {
- vret = visit(self->_verify_ro, arg);
- if (vret != 0)
- return vret;
- }
- if (self->_verify_generations) {
- vret = visit(self->_verify_generations, arg);
- if (vret != 0)
- return vret;
- }
-
- return 0;
-}
-
-static int
-verifying_clear(verify *self)
-{
- lookup_clear((lookup *)self);
- Py_CLEAR(self->_verify_generations);
- Py_CLEAR(self->_verify_ro);
- return 0;
-}
-
-
-static void
-verifying_dealloc(verify *self)
-{
- PyObject_GC_UnTrack((PyObject *)self);
- verifying_clear(self);
- Py_TYPE(self)->tp_free((PyObject*)self);
-}
-
-/*
- def changed(self, originally_changed):
- super(VerifyingBasePy, self).changed(originally_changed)
- self._verify_ro = self._registry.ro[1:]
- self._verify_generations = [r._generation for r in self._verify_ro]
-*/
-static PyObject *
-_generations_tuple(PyObject *ro)
-{
- int i, l;
- PyObject *generations;
-
- l = PyTuple_GET_SIZE(ro);
- generations = PyTuple_New(l);
- for (i=0; i < l; i++)
- {
- PyObject *generation;
-
- generation = PyObject_GetAttr(PyTuple_GET_ITEM(ro, i), str_generation);
- if (generation == NULL)
- {
- Py_DECREF(generations);
- return NULL;
- }
- PyTuple_SET_ITEM(generations, i, generation);
- }
-
- return generations;
-}
-static PyObject *
-verifying_changed(verify *self, PyObject *ignored)
-{
- PyObject *t, *ro;
-
- verifying_clear(self);
-
- t = PyObject_GetAttr(OBJECT(self), str_registry);
- if (t == NULL)
- return NULL;
- ro = PyObject_GetAttr(t, strro);
- Py_DECREF(t);
- if (ro == NULL)
- return NULL;
-
- t = PyObject_CallFunctionObjArgs(OBJECT(&PyTuple_Type), ro, NULL);
- Py_DECREF(ro);
- if (t == NULL)
- return NULL;
-
- ro = PyTuple_GetSlice(t, 1, PyTuple_GET_SIZE(t));
- Py_DECREF(t);
- if (ro == NULL)
- return NULL;
-
- self->_verify_generations = _generations_tuple(ro);
- if (self->_verify_generations == NULL)
- {
- Py_DECREF(ro);
- return NULL;
- }
-
- self->_verify_ro = ro;
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-/*
- def _verify(self):
- if ([r._generation for r in self._verify_ro]
- != self._verify_generations):
- self.changed(None)
-*/
-static int
-_verify(verify *self)
-{
- PyObject *changed_result;
-
- if (self->_verify_ro != NULL && self->_verify_generations != NULL)
- {
- PyObject *generations;
- int changed;
-
- generations = _generations_tuple(self->_verify_ro);
- if (generations == NULL)
- return -1;
-
- changed = PyObject_RichCompareBool(self->_verify_generations,
- generations, Py_NE);
- Py_DECREF(generations);
- if (changed == -1)
- return -1;
-
- if (changed == 0)
- return 0;
- }
-
- changed_result = PyObject_CallMethodObjArgs(OBJECT(self), strchanged,
- Py_None, NULL);
- if (changed_result == NULL)
- return -1;
-
- Py_DECREF(changed_result);
- return 0;
-}
-
-static PyObject *
-verifying_lookup(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", "name", "default", NULL};
- PyObject *required, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
- &required, &provided, &name, &default_))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _lookup((lookup *)self, required, provided, name, default_);
-}
-
-static PyObject *
-verifying_lookup1(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", "name", "default", NULL};
- PyObject *required, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
- &required, &provided, &name, &default_))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _lookup1((lookup *)self, required, provided, name, default_);
-}
-
-static PyObject *
-verifying_adapter_hook(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"provided", "object", "name", "default", NULL};
- PyObject *object, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
- &provided, &object, &name, &default_))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _adapter_hook((lookup *)self, provided, object, name, default_);
-}
-
-static PyObject *
-verifying_queryAdapter(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"object", "provided", "name", "default", NULL};
- PyObject *object, *provided, *name=NULL, *default_=NULL;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
- &object, &provided, &name, &default_))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _adapter_hook((lookup *)self, provided, object, name, default_);
-}
-
-static PyObject *
-verifying_lookupAll(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", NULL};
- PyObject *required, *provided;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist,
- &required, &provided))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _lookupAll((lookup *)self, required, provided);
-}
-
-static PyObject *
-verifying_subscriptions(verify *self, PyObject *args, PyObject *kwds)
-{
- static char *kwlist[] = {"required", "provided", NULL};
- PyObject *required, *provided;
-
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist,
- &required, &provided))
- return NULL;
-
- if (_verify(self) < 0)
- return NULL;
-
- return _subscriptions((lookup *)self, required, provided);
-}
-
-static struct PyMethodDef verifying_methods[] = {
- {"changed", (PyCFunction)verifying_changed, METH_O, ""},
- {"lookup", (PyCFunction)verifying_lookup, METH_KEYWORDS | METH_VARARGS, ""},
- {"lookup1", (PyCFunction)verifying_lookup1, METH_KEYWORDS | METH_VARARGS, ""},
- {"queryAdapter", (PyCFunction)verifying_queryAdapter, METH_KEYWORDS | METH_VARARGS, ""},
- {"adapter_hook", (PyCFunction)verifying_adapter_hook, METH_KEYWORDS | METH_VARARGS, ""},
- {"lookupAll", (PyCFunction)verifying_lookupAll, METH_KEYWORDS | METH_VARARGS, ""},
- {"subscriptions", (PyCFunction)verifying_subscriptions, METH_KEYWORDS | METH_VARARGS, ""},
- {NULL, NULL} /* sentinel */
-};
-
-static PyTypeObject VerifyingBase = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_zope_interface_coptimizations."
- "VerifyingBase",
- /* tp_basicsize */ sizeof(verify),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)&verifying_dealloc,
- /* tp_print */ (printfunc)0,
- /* tp_getattr */ (getattrfunc)0,
- /* tp_setattr */ (setattrfunc)0,
- /* tp_compare */ 0,
- /* tp_repr */ (reprfunc)0,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ (hashfunc)0,
- /* tp_call */ (ternaryfunc)0,
- /* tp_str */ (reprfunc)0,
- /* tp_getattro */ (getattrofunc)0,
- /* tp_setattro */ (setattrofunc)0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC,
- /* tp_doc */ "",
- /* tp_traverse */ (traverseproc)verifying_traverse,
- /* tp_clear */ (inquiry)verifying_clear,
- /* tp_richcompare */ (richcmpfunc)0,
- /* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
- /* tp_iternext */ (iternextfunc)0,
- /* tp_methods */ verifying_methods,
- /* tp_members */ 0,
- /* tp_getset */ 0,
- /* tp_base */ &LookupBase,
-};
-
-/* ========================== End: Lookup Bases ======================= */
-/* ==================================================================== */
-
-
-
-static struct PyMethodDef m_methods[] = {
- {"implementedBy", (PyCFunction)implementedBy, METH_O,
- "Interfaces implemented by a class or factory.\n"
- "Raises TypeError if argument is neither a class nor a callable."},
- {"getObjectSpecification", (PyCFunction)getObjectSpecification, METH_O,
- "Get an object's interfaces (internal api)"},
- {"providedBy", (PyCFunction)providedBy, METH_O,
- "Get an object's interfaces"},
-
- {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
-};
-
-static char module_doc[] = "C optimizations for zope.interface\n\n";
-
-static struct PyModuleDef _zic_module = {
- PyModuleDef_HEAD_INIT,
- "_zope_interface_coptimizations",
- module_doc,
- -1,
- m_methods,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-static PyObject *
-init(void)
-{
- PyObject *m;
-
-#define DEFINE_STRING(S) \
- if(! (str ## S = PyUnicode_FromString(# S))) return NULL
-
- DEFINE_STRING(__dict__);
- DEFINE_STRING(__implemented__);
- DEFINE_STRING(__provides__);
- DEFINE_STRING(__class__);
- DEFINE_STRING(__providedBy__);
- DEFINE_STRING(extends);
- DEFINE_STRING(__conform__);
- DEFINE_STRING(_call_conform);
- DEFINE_STRING(_uncached_lookup);
- DEFINE_STRING(_uncached_lookupAll);
- DEFINE_STRING(_uncached_subscriptions);
- DEFINE_STRING(_registry);
- DEFINE_STRING(_generation);
- DEFINE_STRING(ro);
- DEFINE_STRING(changed);
- DEFINE_STRING(__self__);
- DEFINE_STRING(__name__);
- DEFINE_STRING(__module__);
- DEFINE_STRING(__adapt__);
- DEFINE_STRING(_CALL_CUSTOM_ADAPT);
-#undef DEFINE_STRING
- adapter_hooks = PyList_New(0);
- if (adapter_hooks == NULL)
- return NULL;
-
- /* Initialize types: */
- SpecificationBaseType.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&SpecificationBaseType) < 0)
- return NULL;
- OSDType.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&OSDType) < 0)
- return NULL;
- CPBType.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&CPBType) < 0)
- return NULL;
-
- InterfaceBaseType.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&InterfaceBaseType) < 0)
- return NULL;
-
- LookupBase.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&LookupBase) < 0)
- return NULL;
-
- VerifyingBase.tp_new = PyBaseObject_Type.tp_new;
- if (PyType_Ready(&VerifyingBase) < 0)
- return NULL;
-
- m = PyModule_Create(&_zic_module);
- if (m == NULL)
- return NULL;
-
- /* Add types: */
- if (PyModule_AddObject(m, "SpecificationBase", OBJECT(&SpecificationBaseType)) < 0)
- return NULL;
- if (PyModule_AddObject(m, "ObjectSpecificationDescriptor",
- (PyObject *)&OSDType) < 0)
- return NULL;
- if (PyModule_AddObject(m, "ClassProvidesBase", OBJECT(&CPBType)) < 0)
- return NULL;
- if (PyModule_AddObject(m, "InterfaceBase", OBJECT(&InterfaceBaseType)) < 0)
- return NULL;
- if (PyModule_AddObject(m, "LookupBase", OBJECT(&LookupBase)) < 0)
- return NULL;
- if (PyModule_AddObject(m, "VerifyingBase", OBJECT(&VerifyingBase)) < 0)
- return NULL;
- if (PyModule_AddObject(m, "adapter_hooks", adapter_hooks) < 0)
- return NULL;
- return m;
-}
-
-PyMODINIT_FUNC
-PyInit__zope_interface_coptimizations(void)
-{
- return init();
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
diff --git a/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.cpython-37m-x86_64-linux-gnu.so b/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.cpython-37m-x86_64-linux-gnu.so
deleted file mode 100755
index a2f656325..000000000
Binary files a/resources/python/bin/3.7/linux/zope/interface/_zope_interface_coptimizations.cpython-37m-x86_64-linux-gnu.so and /dev/null differ
diff --git a/resources/python/bin/3.7/linux/zope/interface/adapter.py b/resources/python/bin/3.7/linux/zope/interface/adapter.py
deleted file mode 100644
index b02f19d56..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/adapter.py
+++ /dev/null
@@ -1,1015 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Adapter management
-"""
-import itertools
-import weakref
-
-from zope.interface import Interface
-from zope.interface import implementer
-from zope.interface import providedBy
-from zope.interface import ro
-from zope.interface._compat import _normalize_name
-from zope.interface._compat import _use_c_impl
-from zope.interface.interfaces import IAdapterRegistry
-
-
-__all__ = [
- 'AdapterRegistry',
- 'VerifyingAdapterRegistry',
-]
-
-# In the CPython implementation,
-# ``tuple`` and ``list`` cooperate so that ``tuple([some list])``
-# directly allocates and iterates at the C level without using a
-# Python iterator. That's not the case for
-# ``tuple(generator_expression)`` or ``tuple(map(func, it))``.
-##
-# 3.8
-# ``tuple([t for t in range(10)])`` -> 610ns
-# ``tuple(t for t in range(10))`` -> 696ns
-# ``tuple(map(lambda t: t, range(10)))`` -> 881ns
-##
-# 2.7
-# ``tuple([t fon t in range(10)])`` -> 625ns
-# ``tuple(t for t in range(10))`` -> 665ns
-# ``tuple(map(lambda t: t, range(10)))`` -> 958ns
-#
-# All three have substantial variance.
-##
-# On PyPy, this is also the best option.
-##
-# PyPy 2.7.18-7.3.3
-# ``tuple([t fon t in range(10)])`` -> 128ns
-# ``tuple(t for t in range(10))`` -> 175ns
-# ``tuple(map(lambda t: t, range(10)))`` -> 153ns
-##
-# PyPy 3.7.9 7.3.3-beta
-# ``tuple([t fon t in range(10)])`` -> 82ns
-# ``tuple(t for t in range(10))`` -> 177ns
-# ``tuple(map(lambda t: t, range(10)))`` -> 168ns
-#
-
-class BaseAdapterRegistry:
- """
- A basic implementation of the data storage and algorithms required
- for a :class:`zope.interface.interfaces.IAdapterRegistry`.
-
- Subclasses can set the following attributes to control how the data
- is stored; in particular, these hooks can be helpful for ZODB
- persistence. They can be class attributes that are the named (or similar) type, or
- they can be methods that act as a constructor for an object that behaves
- like the types defined here; this object will not assume that they are type
- objects, but subclasses are free to do so:
-
- _sequenceType = list
- This is the type used for our two mutable top-level "byorder" sequences.
- Must support mutation operations like ``append()`` and ``del seq[index]``.
- These are usually small (< 10). Although at least one of them is
- accessed when performing lookups or queries on this object, the other
- is untouched. In many common scenarios, both are only required when
- mutating registrations and subscriptions (like what
- :meth:`zope.interface.interfaces.IComponents.registerUtility` does).
- This use pattern makes it an ideal candidate to be a
- :class:`~persistent.list.PersistentList`.
- _leafSequenceType = tuple
- This is the type used for the leaf sequences of subscribers.
- It could be set to a ``PersistentList`` to avoid many unnecessary data
- loads when subscribers aren't being used. Mutation operations are directed
- through :meth:`_addValueToLeaf` and :meth:`_removeValueFromLeaf`; if you use
- a mutable type, you'll need to override those.
- _mappingType = dict
- This is the mutable mapping type used for the keyed mappings.
- A :class:`~persistent.mapping.PersistentMapping`
- could be used to help reduce the number of data loads when the registry is large
- and parts of it are rarely used. Further reductions in data loads can come from
- using a :class:`~BTrees.OOBTree.OOBTree`, but care is required
- to be sure that all required/provided
- values are fully ordered (e.g., no required or provided values that are classes
- can be used).
- _providedType = dict
- This is the mutable mapping type used for the ``_provided`` mapping.
- This is separate from the generic mapping type because the values
- are always integers, so one might choose to use a more optimized data
- structure such as a :class:`~BTrees.OIBTree.OIBTree`.
- The same caveats regarding key types
- apply as for ``_mappingType``.
-
- It is possible to also set these on an instance, but because of the need to
- potentially also override :meth:`_addValueToLeaf` and :meth:`_removeValueFromLeaf`,
- this may be less useful in a persistent scenario; using a subclass is recommended.
-
- .. versionchanged:: 5.3.0
- Add support for customizing the way internal data
- structures are created.
- .. versionchanged:: 5.3.0
- Add methods :meth:`rebuild`, :meth:`allRegistrations`
- and :meth:`allSubscriptions`.
- """
-
- # List of methods copied from lookup sub-objects:
- _delegated = ('lookup', 'queryMultiAdapter', 'lookup1', 'queryAdapter',
- 'adapter_hook', 'lookupAll', 'names',
- 'subscriptions', 'subscribers')
-
- # All registries maintain a generation that can be used by verifying
- # registries
- _generation = 0
-
- def __init__(self, bases=()):
-
- # The comments here could be improved. Possibly this bit needs
- # explaining in a separate document, as the comments here can
- # be quite confusing. /regebro
-
- # {order -> {required -> {provided -> {name -> value}}}}
- # Here "order" is actually an index in a list, "required" and
- # "provided" are interfaces, and "required" is really a nested
- # key. So, for example:
- # for order == 0 (that is, self._adapters[0]), we have:
- # {provided -> {name -> value}}
- # but for order == 2 (that is, self._adapters[2]), we have:
- # {r1 -> {r2 -> {provided -> {name -> value}}}}
- #
- self._adapters = self._sequenceType()
-
- # {order -> {required -> {provided -> {name -> [value]}}}}
- # where the remarks about adapters above apply
- self._subscribers = self._sequenceType()
-
- # Set, with a reference count, keeping track of the interfaces
- # for which we have provided components:
- self._provided = self._providedType()
-
- # Create ``_v_lookup`` object to perform lookup. We make this a
- # separate object to to make it easier to implement just the
- # lookup functionality in C. This object keeps track of cache
- # invalidation data in two kinds of registries.
-
- # Invalidating registries have caches that are invalidated
- # when they or their base registies change. An invalidating
- # registry can only have invalidating registries as bases.
- # See LookupBaseFallback below for the pertinent logic.
-
- # Verifying registies can't rely on getting invalidation messages,
- # so have to check the generations of base registries to determine
- # if their cache data are current. See VerifyingBasePy below
- # for the pertinent object.
- self._createLookup()
-
- # Setting the bases causes the registries described above
- # to be initialized (self._setBases -> self.changed ->
- # self._v_lookup.changed).
-
- self.__bases__ = bases
-
- def _setBases(self, bases):
- """
- If subclasses need to track when ``__bases__`` changes, they
- can override this method.
-
- Subclasses must still call this method.
- """
- self.__dict__['__bases__'] = bases
- self.ro = ro.ro(self)
- self.changed(self)
-
- __bases__ = property(lambda self: self.__dict__['__bases__'],
- lambda self, bases: self._setBases(bases),
- )
-
- def _createLookup(self):
- self._v_lookup = self.LookupClass(self)
- for name in self._delegated:
- self.__dict__[name] = getattr(self._v_lookup, name)
-
- # Hooks for subclasses to define the types of objects used in
- # our data structures.
- # These have to be documented in the docstring, instead of local
- # comments, because Sphinx autodoc ignores the comment and just writes
- # "alias of list"
- _sequenceType = list
- _leafSequenceType = tuple
- _mappingType = dict
- _providedType = dict
-
- def _addValueToLeaf(self, existing_leaf_sequence, new_item):
- """
- Add the value *new_item* to the *existing_leaf_sequence*, which may
- be ``None``.
-
- Subclasses that redefine `_leafSequenceType` should override this method.
-
- :param existing_leaf_sequence:
- If *existing_leaf_sequence* is not *None*, it will be an instance
- of `_leafSequenceType`. (Unless the object has been unpickled
- from an old pickle and the class definition has changed, in which case
- it may be an instance of a previous definition, commonly a `tuple`.)
-
- :return:
- This method returns the new value to be stored. It may mutate the
- sequence in place if it was not ``None`` and the type is mutable, but
- it must also return it.
-
- .. versionadded:: 5.3.0
- """
- if existing_leaf_sequence is None:
- return (new_item,)
- return existing_leaf_sequence + (new_item,)
-
- def _removeValueFromLeaf(self, existing_leaf_sequence, to_remove):
- """
- Remove the item *to_remove* from the (non-``None``, non-empty)
- *existing_leaf_sequence* and return the mutated sequence.
-
- If there is more than one item that is equal to *to_remove*
- they must all be removed.
-
- Subclasses that redefine `_leafSequenceType` should override
- this method. Note that they can call this method to help
- in their implementation; this implementation will always
- return a new tuple constructed by iterating across
- the *existing_leaf_sequence* and omitting items equal to *to_remove*.
-
- :param existing_leaf_sequence:
- As for `_addValueToLeaf`, probably an instance of
- `_leafSequenceType` but possibly an older type; never `None`.
- :return:
- A version of *existing_leaf_sequence* with all items equal to
- *to_remove* removed. Must not return `None`. However,
- returning an empty
- object, even of another type such as the empty tuple, ``()`` is
- explicitly allowed; such an object will never be stored.
-
- .. versionadded:: 5.3.0
- """
- return tuple([v for v in existing_leaf_sequence if v != to_remove])
-
- def changed(self, originally_changed):
- self._generation += 1
- self._v_lookup.changed(originally_changed)
-
- def register(self, required, provided, name, value):
- if not isinstance(name, str):
- raise ValueError('name is not a string')
- if value is None:
- self.unregister(required, provided, name, value)
- return
-
- required = tuple([_convert_None_to_Interface(r) for r in required])
- name = _normalize_name(name)
- order = len(required)
- byorder = self._adapters
- while len(byorder) <= order:
- byorder.append(self._mappingType())
- components = byorder[order]
- key = required + (provided,)
-
- for k in key:
- d = components.get(k)
- if d is None:
- d = self._mappingType()
- components[k] = d
- components = d
-
- if components.get(name) is value:
- return
-
- components[name] = value
-
- n = self._provided.get(provided, 0) + 1
- self._provided[provided] = n
- if n == 1:
- self._v_lookup.add_extendor(provided)
-
- self.changed(self)
-
- def _find_leaf(self, byorder, required, provided, name):
- # Find the leaf value, if any, in the *byorder* list
- # for the interface sequence *required* and the interface
- # *provided*, given the already normalized *name*.
- #
- # If no such leaf value exists, returns ``None``
- required = tuple([_convert_None_to_Interface(r) for r in required])
- order = len(required)
- if len(byorder) <= order:
- return None
-
- components = byorder[order]
- key = required + (provided,)
-
- for k in key:
- d = components.get(k)
- if d is None:
- return None
- components = d
-
- return components.get(name)
-
- def registered(self, required, provided, name=''):
- return self._find_leaf(
- self._adapters,
- required,
- provided,
- _normalize_name(name)
- )
-
- @classmethod
- def _allKeys(cls, components, i, parent_k=()):
- if i == 0:
- for k, v in components.items():
- yield parent_k + (k,), v
- else:
- for k, v in components.items():
- new_parent_k = parent_k + (k,)
- yield from cls._allKeys(v, i - 1, new_parent_k)
-
- def _all_entries(self, byorder):
- # Recurse through the mapping levels of the `byorder` sequence,
- # reconstructing a flattened sequence of ``(required, provided, name, value)``
- # tuples that can be used to reconstruct the sequence with the appropriate
- # registration methods.
- #
- # Locally reference the `byorder` data; it might be replaced while
- # this method is running (see ``rebuild``).
- for i, components in enumerate(byorder):
- # We will have *i* levels of dictionaries to go before
- # we get to the leaf.
- for key, value in self._allKeys(components, i + 1):
- assert len(key) == i + 2
- required = key[:i]
- provided = key[-2]
- name = key[-1]
- yield (required, provided, name, value)
-
- def allRegistrations(self):
- """
- Yields tuples ``(required, provided, name, value)`` for all
- the registrations that this object holds.
-
- These tuples could be passed as the arguments to the
- :meth:`register` method on another adapter registry to
- duplicate the registrations this object holds.
-
- .. versionadded:: 5.3.0
- """
- yield from self._all_entries(self._adapters)
-
- def unregister(self, required, provided, name, value=None):
- required = tuple([_convert_None_to_Interface(r) for r in required])
- order = len(required)
- byorder = self._adapters
- if order >= len(byorder):
- return False
- components = byorder[order]
- key = required + (provided,)
-
- # Keep track of how we got to `components`:
- lookups = []
- for k in key:
- d = components.get(k)
- if d is None:
- return
- lookups.append((components, k))
- components = d
-
- old = components.get(name)
- if old is None:
- return
- if (value is not None) and (old is not value):
- return
-
- del components[name]
- if not components:
- # Clean out empty containers, since we don't want our keys
- # to reference global objects (interfaces) unnecessarily.
- # This is often a problem when an interface is slated for
- # removal; a hold-over entry in the registry can make it
- # difficult to remove such interfaces.
- for comp, k in reversed(lookups):
- d = comp[k]
- if d:
- break
- else:
- del comp[k]
- while byorder and not byorder[-1]:
- del byorder[-1]
- n = self._provided[provided] - 1
- if n == 0:
- del self._provided[provided]
- self._v_lookup.remove_extendor(provided)
- else:
- self._provided[provided] = n
-
- self.changed(self)
-
- def subscribe(self, required, provided, value):
- required = tuple([_convert_None_to_Interface(r) for r in required])
- name = ''
- order = len(required)
- byorder = self._subscribers
- while len(byorder) <= order:
- byorder.append(self._mappingType())
- components = byorder[order]
- key = required + (provided,)
-
- for k in key:
- d = components.get(k)
- if d is None:
- d = self._mappingType()
- components[k] = d
- components = d
-
- components[name] = self._addValueToLeaf(components.get(name), value)
-
- if provided is not None:
- n = self._provided.get(provided, 0) + 1
- self._provided[provided] = n
- if n == 1:
- self._v_lookup.add_extendor(provided)
-
- self.changed(self)
-
- def subscribed(self, required, provided, subscriber):
- subscribers = self._find_leaf(
- self._subscribers,
- required,
- provided,
- ''
- ) or ()
- return subscriber if subscriber in subscribers else None
-
- def allSubscriptions(self):
- """
- Yields tuples ``(required, provided, value)`` for all the
- subscribers that this object holds.
-
- These tuples could be passed as the arguments to the
- :meth:`subscribe` method on another adapter registry to
- duplicate the registrations this object holds.
-
- .. versionadded:: 5.3.0
- """
- for required, provided, _name, value in self._all_entries(self._subscribers):
- for v in value:
- yield (required, provided, v)
-
- def unsubscribe(self, required, provided, value=None):
- required = tuple([_convert_None_to_Interface(r) for r in required])
- order = len(required)
- byorder = self._subscribers
- if order >= len(byorder):
- return
- components = byorder[order]
- key = required + (provided,)
-
- # Keep track of how we got to `components`:
- lookups = []
- for k in key:
- d = components.get(k)
- if d is None:
- return
- lookups.append((components, k))
- components = d
-
- old = components.get('')
- if not old:
- # this is belt-and-suspenders against the failure of cleanup below
- return # pragma: no cover
- len_old = len(old)
- if value is None:
- # Removing everything; note that the type of ``new`` won't
- # necessarily match the ``_leafSequenceType``, but that's
- # OK because we're about to delete the entire entry
- # anyway.
- new = ()
- else:
- new = self._removeValueFromLeaf(old, value)
- # ``new`` may be the same object as ``old``, just mutated in place,
- # so we cannot compare it to ``old`` to check for changes. Remove
- # our reference to it now to avoid trying to do so below.
- del old
-
- if len(new) == len_old:
- # No changes, so nothing could have been removed.
- return
-
- if new:
- components[''] = new
- else:
- # Instead of setting components[u''] = new, we clean out
- # empty containers, since we don't want our keys to
- # reference global objects (interfaces) unnecessarily. This
- # is often a problem when an interface is slated for
- # removal; a hold-over entry in the registry can make it
- # difficult to remove such interfaces.
- del components['']
- for comp, k in reversed(lookups):
- d = comp[k]
- if d:
- break
- else:
- del comp[k]
- while byorder and not byorder[-1]:
- del byorder[-1]
-
- if provided is not None:
- n = self._provided[provided] + len(new) - len_old
- if n == 0:
- del self._provided[provided]
- self._v_lookup.remove_extendor(provided)
- else:
- self._provided[provided] = n
-
- self.changed(self)
-
- def rebuild(self):
- """
- Rebuild (and replace) all the internal data structures of this
- object.
-
- This is useful, especially for persistent implementations, if
- you suspect an issue with reference counts keeping interfaces
- alive even though they are no longer used.
-
- It is also useful if you or a subclass change the data types
- (``_mappingType`` and friends) that are to be used.
-
- This method replaces all internal data structures with new objects;
- it specifically does not re-use any storage.
-
- .. versionadded:: 5.3.0
- """
-
- # Grab the iterators, we're about to discard their data.
- registrations = self.allRegistrations()
- subscriptions = self.allSubscriptions()
-
- def buffer(it):
- # The generator doesn't actually start running until we
- # ask for its next(), by which time the attributes will change
- # unless we do so before calling __init__.
- try:
- first = next(it)
- except StopIteration:
- return iter(())
-
- return itertools.chain((first,), it)
-
- registrations = buffer(registrations)
- subscriptions = buffer(subscriptions)
-
-
- # Replace the base data structures as well as _v_lookup.
- self.__init__(self.__bases__)
- # Re-register everything previously registered and subscribed.
- #
- # XXX: This is going to call ``self.changed()`` a lot, all of
- # which is unnecessary (because ``self.__init__`` just
- # re-created those dependent objects and also called
- # ``self.changed()``). Is this a bottleneck that needs fixed?
- # (We could do ``self.changed = lambda _: None`` before
- # beginning and remove it after to disable the presumably expensive
- # part of passing that notification to the change of objects.)
- for args in registrations:
- self.register(*args)
- for args in subscriptions:
- self.subscribe(*args)
-
- # XXX hack to fake out twisted's use of a private api. We need to get them
- # to use the new registered method.
- def get(self, _): # pragma: no cover
- class XXXTwistedFakeOut:
- selfImplied = {}
- return XXXTwistedFakeOut
-
-
-_not_in_mapping = object()
-
-@_use_c_impl
-class LookupBase:
-
- def __init__(self):
- self._cache = {}
- self._mcache = {}
- self._scache = {}
-
- def changed(self, ignored=None):
- self._cache.clear()
- self._mcache.clear()
- self._scache.clear()
-
- def _getcache(self, provided, name):
- cache = self._cache.get(provided)
- if cache is None:
- cache = {}
- self._cache[provided] = cache
- if name:
- c = cache.get(name)
- if c is None:
- c = {}
- cache[name] = c
- cache = c
- return cache
-
- def lookup(self, required, provided, name='', default=None):
- if not isinstance(name, str):
- raise ValueError('name is not a string')
- cache = self._getcache(provided, name)
- required = tuple(required)
- if len(required) == 1:
- result = cache.get(required[0], _not_in_mapping)
- else:
- result = cache.get(tuple(required), _not_in_mapping)
-
- if result is _not_in_mapping:
- result = self._uncached_lookup(required, provided, name)
- if len(required) == 1:
- cache[required[0]] = result
- else:
- cache[tuple(required)] = result
-
- if result is None:
- return default
-
- return result
-
- def lookup1(self, required, provided, name='', default=None):
- if not isinstance(name, str):
- raise ValueError('name is not a string')
- cache = self._getcache(provided, name)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- return self.lookup((required, ), provided, name, default)
-
- if result is None:
- return default
-
- return result
-
- def queryAdapter(self, object, provided, name='', default=None):
- return self.adapter_hook(provided, object, name, default)
-
- def adapter_hook(self, provided, object, name='', default=None):
- if not isinstance(name, str):
- raise ValueError('name is not a string')
- required = providedBy(object)
- cache = self._getcache(provided, name)
- factory = cache.get(required, _not_in_mapping)
- if factory is _not_in_mapping:
- factory = self.lookup((required, ), provided, name)
-
- if factory is not None:
- if isinstance(object, super):
- object = object.__self__
- result = factory(object)
- if result is not None:
- return result
-
- return default
-
- def lookupAll(self, required, provided):
- cache = self._mcache.get(provided)
- if cache is None:
- cache = {}
- self._mcache[provided] = cache
-
- required = tuple(required)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- result = self._uncached_lookupAll(required, provided)
- cache[required] = result
-
- return result
-
-
- def subscriptions(self, required, provided):
- cache = self._scache.get(provided)
- if cache is None:
- cache = {}
- self._scache[provided] = cache
-
- required = tuple(required)
- result = cache.get(required, _not_in_mapping)
- if result is _not_in_mapping:
- result = self._uncached_subscriptions(required, provided)
- cache[required] = result
-
- return result
-
-
-@_use_c_impl
-class VerifyingBase(LookupBaseFallback):
- # Mixin for lookups against registries which "chain" upwards, and
- # whose lookups invalidate their own caches whenever a parent registry
- # bumps its own '_generation' counter. E.g., used by
- # zope.component.persistentregistry
-
- def changed(self, originally_changed):
- LookupBaseFallback.changed(self, originally_changed)
- self._verify_ro = self._registry.ro[1:]
- self._verify_generations = [r._generation for r in self._verify_ro]
-
- def _verify(self):
- if ([r._generation for r in self._verify_ro]
- != self._verify_generations):
- self.changed(None)
-
- def _getcache(self, provided, name):
- self._verify()
- return LookupBaseFallback._getcache(self, provided, name)
-
- def lookupAll(self, required, provided):
- self._verify()
- return LookupBaseFallback.lookupAll(self, required, provided)
-
- def subscriptions(self, required, provided):
- self._verify()
- return LookupBaseFallback.subscriptions(self, required, provided)
-
-
-class AdapterLookupBase:
-
- def __init__(self, registry):
- self._registry = registry
- self._required = {}
- self.init_extendors()
- super().__init__()
-
- def changed(self, ignored=None):
- super().changed(None)
- for r in self._required.keys():
- r = r()
- if r is not None:
- r.unsubscribe(self)
- self._required.clear()
-
-
- # Extendors
- # ---------
-
- # When given an target interface for an adapter lookup, we need to consider
- # adapters for interfaces that extend the target interface. This is
- # what the extendors dictionary is about. It tells us all of the
- # interfaces that extend an interface for which there are adapters
- # registered.
-
- # We could separate this by order and name, thus reducing the
- # number of provided interfaces to search at run time. The tradeoff,
- # however, is that we have to store more information. For example,
- # if the same interface is provided for multiple names and if the
- # interface extends many interfaces, we'll have to keep track of
- # a fair bit of information for each name. It's better to
- # be space efficient here and be time efficient in the cache
- # implementation.
-
- # TODO: add invalidation when a provided interface changes, in case
- # the interface's __iro__ has changed. This is unlikely enough that
- # we'll take our chances for now.
-
- def init_extendors(self):
- self._extendors = {}
- for p in self._registry._provided:
- self.add_extendor(p)
-
- def add_extendor(self, provided):
- _extendors = self._extendors
- for i in provided.__iro__:
- extendors = _extendors.get(i, ())
- _extendors[i] = (
- [e for e in extendors if provided.isOrExtends(e)]
- +
- [provided]
- +
- [e for e in extendors if not provided.isOrExtends(e)]
- )
-
- def remove_extendor(self, provided):
- _extendors = self._extendors
- for i in provided.__iro__:
- _extendors[i] = [e for e in _extendors.get(i, ())
- if e != provided]
-
-
- def _subscribe(self, *required):
- _refs = self._required
- for r in required:
- ref = r.weakref()
- if ref not in _refs:
- r.subscribe(self)
- _refs[ref] = 1
-
- def _uncached_lookup(self, required, provided, name=''):
- required = tuple(required)
- result = None
- order = len(required)
- for registry in self._registry.ro:
- byorder = registry._adapters
- if order >= len(byorder):
- continue
-
- extendors = registry._v_lookup._extendors.get(provided)
- if not extendors:
- continue
-
- components = byorder[order]
- result = _lookup(components, required, extendors, name, 0,
- order)
- if result is not None:
- break
-
- self._subscribe(*required)
-
- return result
-
- def queryMultiAdapter(self, objects, provided, name='', default=None):
- factory = self.lookup([providedBy(o) for o in objects], provided, name)
- if factory is None:
- return default
-
- result = factory(*[o.__self__ if isinstance(o, super) else o for o in objects])
- if result is None:
- return default
-
- return result
-
- def _uncached_lookupAll(self, required, provided):
- required = tuple(required)
- order = len(required)
- result = {}
- for registry in reversed(self._registry.ro):
- byorder = registry._adapters
- if order >= len(byorder):
- continue
- extendors = registry._v_lookup._extendors.get(provided)
- if not extendors:
- continue
- components = byorder[order]
- _lookupAll(components, required, extendors, result, 0, order)
-
- self._subscribe(*required)
-
- return tuple(result.items())
-
- def names(self, required, provided):
- return [c[0] for c in self.lookupAll(required, provided)]
-
- def _uncached_subscriptions(self, required, provided):
- required = tuple(required)
- order = len(required)
- result = []
- for registry in reversed(self._registry.ro):
- byorder = registry._subscribers
- if order >= len(byorder):
- continue
-
- if provided is None:
- extendors = (provided, )
- else:
- extendors = registry._v_lookup._extendors.get(provided)
- if extendors is None:
- continue
-
- _subscriptions(byorder[order], required, extendors, '',
- result, 0, order)
-
- self._subscribe(*required)
-
- return result
-
- def subscribers(self, objects, provided):
- subscriptions = self.subscriptions([providedBy(o) for o in objects], provided)
- if provided is None:
- result = ()
- for subscription in subscriptions:
- subscription(*objects)
- else:
- result = []
- for subscription in subscriptions:
- subscriber = subscription(*objects)
- if subscriber is not None:
- result.append(subscriber)
- return result
-
-class AdapterLookup(AdapterLookupBase, LookupBase):
- pass
-
-@implementer(IAdapterRegistry)
-class AdapterRegistry(BaseAdapterRegistry):
- """
- A full implementation of ``IAdapterRegistry`` that adds support for
- sub-registries.
- """
-
- LookupClass = AdapterLookup
-
- def __init__(self, bases=()):
- # AdapterRegisties are invalidating registries, so
- # we need to keep track of our invalidating subregistries.
- self._v_subregistries = weakref.WeakKeyDictionary()
-
- super().__init__(bases)
-
- def _addSubregistry(self, r):
- self._v_subregistries[r] = 1
-
- def _removeSubregistry(self, r):
- if r in self._v_subregistries:
- del self._v_subregistries[r]
-
- def _setBases(self, bases):
- old = self.__dict__.get('__bases__', ())
- for r in old:
- if r not in bases:
- r._removeSubregistry(self)
- for r in bases:
- if r not in old:
- r._addSubregistry(self)
-
- super()._setBases(bases)
-
- def changed(self, originally_changed):
- super().changed(originally_changed)
-
- for sub in self._v_subregistries.keys():
- sub.changed(originally_changed)
-
-
-class VerifyingAdapterLookup(AdapterLookupBase, VerifyingBase):
- pass
-
-@implementer(IAdapterRegistry)
-class VerifyingAdapterRegistry(BaseAdapterRegistry):
- """
- The most commonly-used adapter registry.
- """
-
- LookupClass = VerifyingAdapterLookup
-
-def _convert_None_to_Interface(x):
- if x is None:
- return Interface
- else:
- return x
-
-def _lookup(components, specs, provided, name, i, l):
- # this function is called very often.
- # The components.get in loops is executed 100 of 1000s times.
- # by loading get into a local variable the bytecode
- # "LOAD_FAST 0 (components)" in the loop can be eliminated.
- components_get = components.get
- if i < l:
- for spec in specs[i].__sro__:
- comps = components_get(spec)
- if comps:
- r = _lookup(comps, specs, provided, name, i+1, l)
- if r is not None:
- return r
- else:
- for iface in provided:
- comps = components_get(iface)
- if comps:
- r = comps.get(name)
- if r is not None:
- return r
-
- return None
-
-def _lookupAll(components, specs, provided, result, i, l):
- components_get = components.get # see _lookup above
- if i < l:
- for spec in reversed(specs[i].__sro__):
- comps = components_get(spec)
- if comps:
- _lookupAll(comps, specs, provided, result, i+1, l)
- else:
- for iface in reversed(provided):
- comps = components_get(iface)
- if comps:
- result.update(comps)
-
-def _subscriptions(components, specs, provided, name, result, i, l):
- components_get = components.get # see _lookup above
- if i < l:
- for spec in reversed(specs[i].__sro__):
- comps = components_get(spec)
- if comps:
- _subscriptions(comps, specs, provided, name, result, i+1, l)
- else:
- for iface in reversed(provided):
- comps = components_get(iface)
- if comps:
- comps = comps.get(name)
- if comps:
- result.extend(comps)
diff --git a/resources/python/bin/3.7/linux/zope/interface/advice.py b/resources/python/bin/3.7/linux/zope/interface/advice.py
deleted file mode 100644
index 5a8e37773..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/advice.py
+++ /dev/null
@@ -1,120 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Class advice.
-
-This module was adapted from 'protocols.advice', part of the Python
-Enterprise Application Kit (PEAK). Please notify the PEAK authors
-(pje@telecommunity.com and tsarna@sarna.org) if bugs are found or
-Zope-specific changes are required, so that the PEAK version of this module
-can be kept in sync.
-
-PEAK is a Python application framework that interoperates with (but does
-not require) Zope 3 and Twisted. It provides tools for manipulating UML
-models, object-relational persistence, aspect-oriented programming, and more.
-Visit the PEAK home page at http://peak.telecommunity.com for more information.
-"""
-
-from types import FunctionType
-
-
-__all__ = [
- 'determineMetaclass',
- 'getFrameInfo',
- 'isClassAdvisor',
- 'minimalBases',
-]
-
-import sys
-
-
-def getFrameInfo(frame):
- """Return (kind,module,locals,globals) for a frame
-
- 'kind' is one of "exec", "module", "class", "function call", or "unknown".
- """
-
- f_locals = frame.f_locals
- f_globals = frame.f_globals
-
- sameNamespace = f_locals is f_globals
- hasModule = '__module__' in f_locals
- hasName = '__name__' in f_globals
-
- sameName = hasModule and hasName
- sameName = sameName and f_globals['__name__']==f_locals['__module__']
-
- module = hasName and sys.modules.get(f_globals['__name__']) or None
-
- namespaceIsModule = module and module.__dict__ is f_globals
-
- if not namespaceIsModule:
- # some kind of funky exec
- kind = "exec"
- elif sameNamespace and not hasModule:
- kind = "module"
- elif sameName and not sameNamespace:
- kind = "class"
- elif not sameNamespace:
- kind = "function call"
- else: # pragma: no cover
- # How can you have f_locals is f_globals, and have '__module__' set?
- # This is probably module-level code, but with a '__module__' variable.
- kind = "unknown"
- return kind, module, f_locals, f_globals
-
-
-def isClassAdvisor(ob):
- """True if 'ob' is a class advisor function"""
- return isinstance(ob,FunctionType) and hasattr(ob,'previousMetaclass')
-
-
-def determineMetaclass(bases, explicit_mc=None):
- """Determine metaclass from 1+ bases and optional explicit __metaclass__"""
-
- meta = [getattr(b,'__class__',type(b)) for b in bases]
-
- if explicit_mc is not None:
- # The explicit metaclass needs to be verified for compatibility
- # as well, and allowed to resolve the incompatible bases, if any
- meta.append(explicit_mc)
-
- if len(meta)==1:
- # easy case
- return meta[0]
-
- candidates = minimalBases(meta) # minimal set of metaclasses
-
- if len(candidates)>1:
- # We could auto-combine, but for now we won't...
- raise TypeError("Incompatible metatypes", bases)
-
- # Just one, return it
- return candidates[0]
-
-
-def minimalBases(classes):
- """Reduce a list of base classes to its ordered minimum equivalent"""
- candidates = []
-
- for m in classes:
- for n in classes:
- if issubclass(n,m) and m is not n:
- break
- else:
- # m has no subclasses in 'classes'
- if m in candidates:
- candidates.remove(m) # ensure that we're later in the list
- candidates.append(m)
-
- return candidates
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/__init__.py b/resources/python/bin/3.7/linux/zope/interface/common/__init__.py
deleted file mode 100644
index f308f9edd..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/__init__.py
+++ /dev/null
@@ -1,273 +0,0 @@
-##############################################################################
-# Copyright (c) 2020 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-
-import itertools
-from types import FunctionType
-
-from zope.interface import Interface
-from zope.interface import classImplements
-from zope.interface.interface import InterfaceClass
-from zope.interface.interface import _decorator_non_return
-from zope.interface.interface import fromFunction
-
-
-__all__ = [
- # Nothing public here.
-]
-
-
-# pylint:disable=inherit-non-class,
-# pylint:disable=no-self-argument,no-method-argument
-# pylint:disable=unexpected-special-method-signature
-
-class optional:
- # Apply this decorator to a method definition to make it
- # optional (remove it from the list of required names), overriding
- # the definition inherited from the ABC.
- def __init__(self, method):
- self.__doc__ = method.__doc__
-
-
-class ABCInterfaceClass(InterfaceClass):
- """
- An interface that is automatically derived from a
- :class:`abc.ABCMeta` type.
-
- Internal use only.
-
- The body of the interface definition *must* define
- a property ``abc`` that is the ABC to base the interface on.
-
- If ``abc`` is *not* in the interface definition, a regular
- interface will be defined instead (but ``extra_classes`` is still
- respected).
-
- Use the ``@optional`` decorator on method definitions if
- the ABC defines methods that are not actually required in all cases
- because the Python language has multiple ways to implement a protocol.
- For example, the ``iter()`` protocol can be implemented with
- ``__iter__`` or the pair ``__len__`` and ``__getitem__``.
-
- When created, any existing classes that are registered to conform
- to the ABC are declared to implement this interface. This is *not*
- automatically updated as the ABC registry changes. If the body of the
- interface definition defines ``extra_classes``, it should be a
- tuple giving additional classes to declare implement the interface.
-
- Note that this is not fully symmetric. For example, it is usually
- the case that a subclass relationship carries the interface
- declarations over::
-
- >>> from zope.interface import Interface
- >>> class I1(Interface):
- ... pass
- ...
- >>> from zope.interface import implementer
- >>> @implementer(I1)
- ... class Root(object):
- ... pass
- ...
- >>> class Child(Root):
- ... pass
- ...
- >>> child = Child()
- >>> isinstance(child, Root)
- True
- >>> from zope.interface import providedBy
- >>> list(providedBy(child))
- []
-
- However, that's not the case with ABCs and ABC interfaces. Just
- because ``isinstance(A(), AnABC)`` and ``isinstance(B(), AnABC)``
- are both true, that doesn't mean there's any class hierarchy
- relationship between ``A`` and ``B``, or between either of them
- and ``AnABC``. Thus, if ``AnABC`` implemented ``IAnABC``, it would
- not follow that either ``A`` or ``B`` implements ``IAnABC`` (nor
- their instances provide it)::
-
- >>> class SizedClass(object):
- ... def __len__(self): return 1
- ...
- >>> from collections.abc import Sized
- >>> isinstance(SizedClass(), Sized)
- True
- >>> from zope.interface import classImplements
- >>> classImplements(Sized, I1)
- None
- >>> list(providedBy(SizedClass()))
- []
-
- Thus, to avoid conflicting assumptions, ABCs should not be
- declared to implement their parallel ABC interface. Only concrete
- classes specifically registered with the ABC should be declared to
- do so.
-
- .. versionadded:: 5.0.0
- """
-
- # If we could figure out invalidation, and used some special
- # Specification/Declaration instances, and override the method ``providedBy`` here,
- # perhaps we could more closely integrate with ABC virtual inheritance?
-
- def __init__(self, name, bases, attrs):
- # go ahead and give us a name to ease debugging.
- self.__name__ = name
- extra_classes = attrs.pop('extra_classes', ())
- ignored_classes = attrs.pop('ignored_classes', ())
-
- if 'abc' not in attrs:
- # Something like ``IList(ISequence)``: We're extending
- # abc interfaces but not an ABC interface ourself.
- InterfaceClass.__init__(self, name, bases, attrs)
- ABCInterfaceClass.__register_classes(self, extra_classes, ignored_classes)
- self.__class__ = InterfaceClass
- return
-
- based_on = attrs.pop('abc')
- self.__abc = based_on
- self.__extra_classes = tuple(extra_classes)
- self.__ignored_classes = tuple(ignored_classes)
-
- assert name[1:] == based_on.__name__, (name, based_on)
- methods = {
- # Passing the name is important in case of aliases,
- # e.g., ``__ror__ = __or__``.
- k: self.__method_from_function(v, k)
- for k, v in vars(based_on).items()
- if isinstance(v, FunctionType) and not self.__is_private_name(k)
- and not self.__is_reverse_protocol_name(k)
- }
-
- methods['__doc__'] = self.__create_class_doc(attrs)
- # Anything specified in the body takes precedence.
- methods.update(attrs)
- InterfaceClass.__init__(self, name, bases, methods)
- self.__register_classes()
-
- @staticmethod
- def __optional_methods_to_docs(attrs):
- optionals = {k: v for k, v in attrs.items() if isinstance(v, optional)}
- for k in optionals:
- attrs[k] = _decorator_non_return
-
- if not optionals:
- return ''
-
- docs = "\n\nThe following methods are optional:\n - " + "\n-".join(
- "{}\n{}".format(k, v.__doc__) for k, v in optionals.items()
- )
- return docs
-
- def __create_class_doc(self, attrs):
- based_on = self.__abc
- def ref(c):
- mod = c.__module__
- name = c.__name__
- if mod == str.__module__:
- return "`%s`" % name
- if mod == '_io':
- mod = 'io'
- return "`{}.{}`".format(mod, name)
- implementations_doc = "\n - ".join(
- ref(c)
- for c in sorted(self.getRegisteredConformers(), key=ref)
- )
- if implementations_doc:
- implementations_doc = "\n\nKnown implementations are:\n\n - " + implementations_doc
-
- based_on_doc = (based_on.__doc__ or '')
- based_on_doc = based_on_doc.splitlines()
- based_on_doc = based_on_doc[0] if based_on_doc else ''
-
- doc = """Interface for the ABC `{}.{}`.\n\n{}{}{}""".format(
- based_on.__module__, based_on.__name__,
- attrs.get('__doc__', based_on_doc),
- self.__optional_methods_to_docs(attrs),
- implementations_doc
- )
- return doc
-
-
- @staticmethod
- def __is_private_name(name):
- if name.startswith('__') and name.endswith('__'):
- return False
- return name.startswith('_')
-
- @staticmethod
- def __is_reverse_protocol_name(name):
- # The reverse names, like __rand__,
- # aren't really part of the protocol. The interpreter has
- # very complex behaviour around invoking those. PyPy
- # doesn't always even expose them as attributes.
- return name.startswith('__r') and name.endswith('__')
-
- def __method_from_function(self, function, name):
- method = fromFunction(function, self, name=name)
- # Eliminate the leading *self*, which is implied in
- # an interface, but explicit in an ABC.
- method.positional = method.positional[1:]
- return method
-
- def __register_classes(self, conformers=None, ignored_classes=None):
- # Make the concrete classes already present in our ABC's registry
- # declare that they implement this interface.
- conformers = conformers if conformers is not None else self.getRegisteredConformers()
- ignored = ignored_classes if ignored_classes is not None else self.__ignored_classes
- for cls in conformers:
- if cls in ignored:
- continue
- classImplements(cls, self)
-
- def getABC(self):
- """
- Return the ABC this interface represents.
- """
- return self.__abc
-
- def getRegisteredConformers(self):
- """
- Return an iterable of the classes that are known to conform to
- the ABC this interface parallels.
- """
- based_on = self.__abc
-
- # The registry only contains things that aren't already
- # known to be subclasses of the ABC. But the ABC is in charge
- # of checking that, so its quite possible that registrations
- # are in fact ignored, winding up just in the _abc_cache.
- try:
- registered = list(based_on._abc_registry) + list(based_on._abc_cache)
- except AttributeError:
- # Rewritten in C in CPython 3.7.
- # These expose the underlying weakref.
- from abc import _get_dump
- data = _get_dump(based_on)
- registry = data[0]
- cache = data[1]
- registered = [x() for x in itertools.chain(registry, cache)]
- registered = [x for x in registered if x is not None]
-
- return set(itertools.chain(registered, self.__extra_classes))
-
-
-def _create_ABCInterface():
- # It's a two-step process to create the root ABCInterface, because
- # without specifying a corresponding ABC, using the normal constructor
- # gets us a plain InterfaceClass object, and there is no ABC to associate with the
- # root.
- abc_name_bases_attrs = ('ABCInterface', (Interface,), {})
- instance = ABCInterfaceClass.__new__(ABCInterfaceClass, *abc_name_bases_attrs)
- InterfaceClass.__init__(instance, *abc_name_bases_attrs)
- return instance
-
-ABCInterface = _create_ABCInterface()
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/builtins.py b/resources/python/bin/3.7/linux/zope/interface/common/builtins.py
deleted file mode 100644
index 6e13e0648..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/builtins.py
+++ /dev/null
@@ -1,119 +0,0 @@
-##############################################################################
-# Copyright (c) 2020 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""
-Interface definitions for builtin types.
-
-After this module is imported, the standard library types will declare
-that they implement the appropriate interface.
-
-.. versionadded:: 5.0.0
-"""
-
-from zope.interface import classImplements
-from zope.interface.common import collections
-from zope.interface.common import io
-from zope.interface.common import numbers
-
-
-__all__ = [
- 'IList',
- 'ITuple',
- 'ITextString',
- 'IByteString',
- 'INativeString',
- 'IBool',
- 'IDict',
- 'IFile',
-]
-
-# pylint:disable=no-self-argument
-class IList(collections.IMutableSequence):
- """
- Interface for :class:`list`
- """
- extra_classes = (list,)
-
- def sort(key=None, reverse=False):
- """
- Sort the list in place and return None.
-
- *key* and *reverse* must be passed by name only.
- """
-
-
-class ITuple(collections.ISequence):
- """
- Interface for :class:`tuple`
- """
- extra_classes = (tuple,)
-
-
-class ITextString(collections.ISequence):
- """
- Interface for text ("unicode") strings.
-
- This is :class:`str`
- """
- extra_classes = (str,)
-
-
-class IByteString(collections.IByteString):
- """
- Interface for immutable byte strings.
-
- On all Python versions this is :class:`bytes`.
-
- Unlike :class:`zope.interface.common.collections.IByteString`
- (the parent of this interface) this does *not* include
- :class:`bytearray`.
- """
- extra_classes = (bytes,)
-
-
-class INativeString(ITextString):
- """
- Interface for native strings.
-
- On all Python versions, this is :class:`str`. Tt extends
- :class:`ITextString`.
- """
-# We're not extending ABCInterface so extra_classes won't work
-classImplements(str, INativeString)
-
-
-class IBool(numbers.IIntegral):
- """
- Interface for :class:`bool`
- """
- extra_classes = (bool,)
-
-
-class IDict(collections.IMutableMapping):
- """
- Interface for :class:`dict`
- """
- extra_classes = (dict,)
-
-
-class IFile(io.IIOBase):
- """
- Interface for :class:`file`.
-
- It is recommended to use the interfaces from :mod:`zope.interface.common.io`
- instead of this interface.
-
- On Python 3, there is no single implementation of this interface;
- depending on the arguments, the :func:`open` builtin can return
- many different classes that implement different interfaces from
- :mod:`zope.interface.common.io`.
- """
- extra_classes = ()
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/collections.py b/resources/python/bin/3.7/linux/zope/interface/common/collections.py
deleted file mode 100644
index 3c751c05c..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/collections.py
+++ /dev/null
@@ -1,253 +0,0 @@
-##############################################################################
-# Copyright (c) 2020 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""
-Interface definitions paralleling the abstract base classes defined in
-:mod:`collections.abc`.
-
-After this module is imported, the standard library types will declare
-that they implement the appropriate interface. While most standard
-library types will properly implement that interface (that
-is, ``verifyObject(ISequence, list()))`` will pass, for example), a few might not:
-
- - `memoryview` doesn't feature all the defined methods of
- ``ISequence`` such as ``count``; it is still declared to provide
- ``ISequence`` though.
-
- - `collections.deque.pop` doesn't accept the ``index`` argument of
- `collections.abc.MutableSequence.pop`
-
- - `range.index` does not accept the ``start`` and ``stop`` arguments.
-
-.. versionadded:: 5.0.0
-"""
-
-import sys
-from abc import ABCMeta
-from collections import OrderedDict
-from collections import UserDict
-from collections import UserList
-from collections import UserString
-from collections import abc
-
-from zope.interface.common import ABCInterface
-from zope.interface.common import optional
-
-
-# pylint:disable=inherit-non-class,
-# pylint:disable=no-self-argument,no-method-argument
-# pylint:disable=unexpected-special-method-signature
-# pylint:disable=no-value-for-parameter
-
-
-def _new_in_ver(name, ver,
- bases_if_missing=(ABCMeta,),
- register_if_missing=()):
- if ver:
- return getattr(abc, name)
-
- # TODO: It's a shame to have to repeat the bases when
- # the ABC is missing. Can we DRY that?
- missing = ABCMeta(name, bases_if_missing, {
- '__doc__': "The ABC %s is not defined in this version of Python." % (
- name
- ),
- })
-
- for c in register_if_missing:
- missing.register(c)
-
- return missing
-
-__all__ = [
- 'IAsyncGenerator',
- 'IAsyncIterable',
- 'IAsyncIterator',
- 'IAwaitable',
- 'ICollection',
- 'IContainer',
- 'ICoroutine',
- 'IGenerator',
- 'IHashable',
- 'IItemsView',
- 'IIterable',
- 'IIterator',
- 'IKeysView',
- 'IMapping',
- 'IMappingView',
- 'IMutableMapping',
- 'IMutableSequence',
- 'IMutableSet',
- 'IReversible',
- 'ISequence',
- 'ISet',
- 'ISized',
- 'IValuesView',
-]
-
-class IContainer(ABCInterface):
- abc = abc.Container
-
- @optional
- def __contains__(other):
- """
- Optional method. If not provided, the interpreter will use
- ``__iter__`` or the old ``__getitem__`` protocol
- to implement ``in``.
- """
-
-class IHashable(ABCInterface):
- abc = abc.Hashable
-
-class IIterable(ABCInterface):
- abc = abc.Iterable
-
- @optional
- def __iter__():
- """
- Optional method. If not provided, the interpreter will
- implement `iter` using the old ``__getitem__`` protocol.
- """
-
-class IIterator(IIterable):
- abc = abc.Iterator
-
-class IReversible(IIterable):
- abc = _new_in_ver('Reversible', True, (IIterable.getABC(),))
-
- @optional
- def __reversed__():
- """
- Optional method. If this isn't present, the interpreter
- will use ``__len__`` and ``__getitem__`` to implement the
- `reversed` builtin.
- """
-
-class IGenerator(IIterator):
- # New in Python 3.5
- abc = _new_in_ver('Generator', True, (IIterator.getABC(),))
-
-
-class ISized(ABCInterface):
- abc = abc.Sized
-
-
-# ICallable is not defined because there's no standard signature.
-
-class ICollection(ISized,
- IIterable,
- IContainer):
- abc = _new_in_ver('Collection', True,
- (ISized.getABC(), IIterable.getABC(), IContainer.getABC()))
-
-
-class ISequence(IReversible,
- ICollection):
- abc = abc.Sequence
- extra_classes = (UserString,)
- # On Python 2, basestring is registered as an ISequence, and
- # its subclass str is an IByteString. If we also register str as
- # an ISequence, that tends to lead to inconsistent resolution order.
- ignored_classes = (basestring,) if str is bytes else () # pylint:disable=undefined-variable
-
- @optional
- def __reversed__():
- """
- Optional method. If this isn't present, the interpreter
- will use ``__len__`` and ``__getitem__`` to implement the
- `reversed` builtin.
- """
-
- @optional
- def __iter__():
- """
- Optional method. If not provided, the interpreter will
- implement `iter` using the old ``__getitem__`` protocol.
- """
-
-class IMutableSequence(ISequence):
- abc = abc.MutableSequence
- extra_classes = (UserList,)
-
-
-class IByteString(ISequence):
- """
- This unifies `bytes` and `bytearray`.
- """
- abc = _new_in_ver('ByteString', True,
- (ISequence.getABC(),),
- (bytes, bytearray))
-
-
-class ISet(ICollection):
- abc = abc.Set
-
-
-class IMutableSet(ISet):
- abc = abc.MutableSet
-
-
-class IMapping(ICollection):
- abc = abc.Mapping
- extra_classes = (dict,)
- # OrderedDict is a subclass of dict. On CPython 2,
- # it winds up registered as a IMutableMapping, which
- # produces an inconsistent IRO if we also try to register it
- # here.
- ignored_classes = (OrderedDict,)
-
-
-class IMutableMapping(IMapping):
- abc = abc.MutableMapping
- extra_classes = (dict, UserDict,)
- ignored_classes = (OrderedDict,)
-
-class IMappingView(ISized):
- abc = abc.MappingView
-
-
-class IItemsView(IMappingView, ISet):
- abc = abc.ItemsView
-
-
-class IKeysView(IMappingView, ISet):
- abc = abc.KeysView
-
-
-class IValuesView(IMappingView, ICollection):
- abc = abc.ValuesView
-
- @optional
- def __contains__(other):
- """
- Optional method. If not provided, the interpreter will use
- ``__iter__`` or the old ``__len__`` and ``__getitem__`` protocol
- to implement ``in``.
- """
-
-class IAwaitable(ABCInterface):
- abc = _new_in_ver('Awaitable', True)
-
-
-class ICoroutine(IAwaitable):
- abc = _new_in_ver('Coroutine', True)
-
-
-class IAsyncIterable(ABCInterface):
- abc = _new_in_ver('AsyncIterable', True)
-
-
-class IAsyncIterator(IAsyncIterable):
- abc = _new_in_ver('AsyncIterator', True)
-
-
-class IAsyncGenerator(IAsyncIterator):
- abc = _new_in_ver('AsyncGenerator', True)
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/idatetime.py b/resources/python/bin/3.7/linux/zope/interface/common/idatetime.py
deleted file mode 100644
index aeda07aa0..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/idatetime.py
+++ /dev/null
@@ -1,611 +0,0 @@
-##############################################################################
-# Copyright (c) 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""Datetime interfaces.
-
-This module is called idatetime because if it were called datetime the import
-of the real datetime would fail.
-"""
-from datetime import date
-from datetime import datetime
-from datetime import time
-from datetime import timedelta
-from datetime import tzinfo
-
-from zope.interface import Attribute
-from zope.interface import Interface
-from zope.interface import classImplements
-
-
-class ITimeDeltaClass(Interface):
- """This is the timedelta class interface.
-
- This is symbolic; this module does **not** make
- `datetime.timedelta` provide this interface.
- """
-
- min = Attribute("The most negative timedelta object")
-
- max = Attribute("The most positive timedelta object")
-
- resolution = Attribute(
- "The smallest difference between non-equal timedelta objects")
-
-
-class ITimeDelta(ITimeDeltaClass):
- """Represent the difference between two datetime objects.
-
- Implemented by `datetime.timedelta`.
-
- Supported operators:
-
- - add, subtract timedelta
- - unary plus, minus, abs
- - compare to timedelta
- - multiply, divide by int/long
-
- In addition, `.datetime` supports subtraction of two `.datetime` objects
- returning a `.timedelta`, and addition or subtraction of a `.datetime`
- and a `.timedelta` giving a `.datetime`.
-
- Representation: (days, seconds, microseconds).
- """
-
- days = Attribute("Days between -999999999 and 999999999 inclusive")
-
- seconds = Attribute("Seconds between 0 and 86399 inclusive")
-
- microseconds = Attribute("Microseconds between 0 and 999999 inclusive")
-
-
-class IDateClass(Interface):
- """This is the date class interface.
-
- This is symbolic; this module does **not** make
- `datetime.date` provide this interface.
- """
-
- min = Attribute("The earliest representable date")
-
- max = Attribute("The latest representable date")
-
- resolution = Attribute(
- "The smallest difference between non-equal date objects")
-
- def today():
- """Return the current local time.
-
- This is equivalent to ``date.fromtimestamp(time.time())``"""
-
- def fromtimestamp(timestamp):
- """Return the local date from a POSIX timestamp (like time.time())
-
- This may raise `ValueError`, if the timestamp is out of the range of
- values supported by the platform C ``localtime()`` function. It's common
- for this to be restricted to years from 1970 through 2038. Note that
- on non-POSIX systems that include leap seconds in their notion of a
- timestamp, leap seconds are ignored by `fromtimestamp`.
- """
-
- def fromordinal(ordinal):
- """Return the date corresponding to the proleptic Gregorian ordinal.
-
- January 1 of year 1 has ordinal 1. `ValueError` is raised unless
- 1 <= ordinal <= date.max.toordinal().
-
- For any date *d*, ``date.fromordinal(d.toordinal()) == d``.
- """
-
-
-class IDate(IDateClass):
- """Represents a date (year, month and day) in an idealized calendar.
-
- Implemented by `datetime.date`.
-
- Operators:
-
- __repr__, __str__
- __cmp__, __hash__
- __add__, __radd__, __sub__ (add/radd only with timedelta arg)
- """
-
- year = Attribute("Between MINYEAR and MAXYEAR inclusive.")
-
- month = Attribute("Between 1 and 12 inclusive")
-
- day = Attribute(
- "Between 1 and the number of days in the given month of the given year.")
-
- def replace(year, month, day):
- """Return a date with the same value.
-
- Except for those members given new values by whichever keyword
- arguments are specified. For example, if ``d == date(2002, 12, 31)``, then
- ``d.replace(day=26) == date(2000, 12, 26)``.
- """
-
- def timetuple():
- """Return a 9-element tuple of the form returned by `time.localtime`.
-
- The hours, minutes and seconds are 0, and the DST flag is -1.
- ``d.timetuple()`` is equivalent to
- ``(d.year, d.month, d.day, 0, 0, 0, d.weekday(), d.toordinal() -
- date(d.year, 1, 1).toordinal() + 1, -1)``
- """
-
- def toordinal():
- """Return the proleptic Gregorian ordinal of the date
-
- January 1 of year 1 has ordinal 1. For any date object *d*,
- ``date.fromordinal(d.toordinal()) == d``.
- """
-
- def weekday():
- """Return the day of the week as an integer.
-
- Monday is 0 and Sunday is 6. For example,
- ``date(2002, 12, 4).weekday() == 2``, a Wednesday.
-
- .. seealso:: `isoweekday`.
- """
-
- def isoweekday():
- """Return the day of the week as an integer.
-
- Monday is 1 and Sunday is 7. For example,
- date(2002, 12, 4).isoweekday() == 3, a Wednesday.
-
- .. seealso:: `weekday`, `isocalendar`.
- """
-
- def isocalendar():
- """Return a 3-tuple, (ISO year, ISO week number, ISO weekday).
-
- The ISO calendar is a widely used variant of the Gregorian calendar.
- See http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm for a good
- explanation.
-
- The ISO year consists of 52 or 53 full weeks, and where a week starts
- on a Monday and ends on a Sunday. The first week of an ISO year is the
- first (Gregorian) calendar week of a year containing a Thursday. This
- is called week number 1, and the ISO year of that Thursday is the same
- as its Gregorian year.
-
- For example, 2004 begins on a Thursday, so the first week of ISO year
- 2004 begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004, so
- that ``date(2003, 12, 29).isocalendar() == (2004, 1, 1)`` and
- ``date(2004, 1, 4).isocalendar() == (2004, 1, 7)``.
- """
-
- def isoformat():
- """Return a string representing the date in ISO 8601 format.
-
- This is 'YYYY-MM-DD'.
- For example, ``date(2002, 12, 4).isoformat() == '2002-12-04'``.
- """
-
- def __str__():
- """For a date *d*, ``str(d)`` is equivalent to ``d.isoformat()``."""
-
- def ctime():
- """Return a string representing the date.
-
- For example date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'.
- d.ctime() is equivalent to time.ctime(time.mktime(d.timetuple()))
- on platforms where the native C ctime() function
- (which `time.ctime` invokes, but which date.ctime() does not invoke)
- conforms to the C standard.
- """
-
- def strftime(format):
- """Return a string representing the date.
-
- Controlled by an explicit format string. Format codes referring to
- hours, minutes or seconds will see 0 values.
- """
-
-
-class IDateTimeClass(Interface):
- """This is the datetime class interface.
-
- This is symbolic; this module does **not** make
- `datetime.datetime` provide this interface.
- """
-
- min = Attribute("The earliest representable datetime")
-
- max = Attribute("The latest representable datetime")
-
- resolution = Attribute(
- "The smallest possible difference between non-equal datetime objects")
-
- def today():
- """Return the current local datetime, with tzinfo None.
-
- This is equivalent to ``datetime.fromtimestamp(time.time())``.
-
- .. seealso:: `now`, `fromtimestamp`.
- """
-
- def now(tz=None):
- """Return the current local date and time.
-
- If optional argument *tz* is None or not specified, this is like `today`,
- but, if possible, supplies more precision than can be gotten from going
- through a `time.time` timestamp (for example, this may be possible on
- platforms supplying the C ``gettimeofday()`` function).
-
- Else tz must be an instance of a class tzinfo subclass, and the current
- date and time are converted to tz's time zone. In this case the result
- is equivalent to tz.fromutc(datetime.utcnow().replace(tzinfo=tz)).
-
- .. seealso:: `today`, `utcnow`.
- """
-
- def utcnow():
- """Return the current UTC date and time, with tzinfo None.
-
- This is like `now`, but returns the current UTC date and time, as a
- naive datetime object.
-
- .. seealso:: `now`.
- """
-
- def fromtimestamp(timestamp, tz=None):
- """Return the local date and time corresponding to the POSIX timestamp.
-
- Same as is returned by time.time(). If optional argument tz is None or
- not specified, the timestamp is converted to the platform's local date
- and time, and the returned datetime object is naive.
-
- Else tz must be an instance of a class tzinfo subclass, and the
- timestamp is converted to tz's time zone. In this case the result is
- equivalent to
- ``tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))``.
-
- fromtimestamp() may raise `ValueError`, if the timestamp is out of the
- range of values supported by the platform C localtime() or gmtime()
- functions. It's common for this to be restricted to years in 1970
- through 2038. Note that on non-POSIX systems that include leap seconds
- in their notion of a timestamp, leap seconds are ignored by
- fromtimestamp(), and then it's possible to have two timestamps
- differing by a second that yield identical datetime objects.
-
- .. seealso:: `utcfromtimestamp`.
- """
-
- def utcfromtimestamp(timestamp):
- """Return the UTC datetime from the POSIX timestamp with tzinfo None.
-
- This may raise `ValueError`, if the timestamp is out of the range of
- values supported by the platform C ``gmtime()`` function. It's common for
- this to be restricted to years in 1970 through 2038.
-
- .. seealso:: `fromtimestamp`.
- """
-
- def fromordinal(ordinal):
- """Return the datetime from the proleptic Gregorian ordinal.
-
- January 1 of year 1 has ordinal 1. `ValueError` is raised unless
- 1 <= ordinal <= datetime.max.toordinal().
- The hour, minute, second and microsecond of the result are all 0, and
- tzinfo is None.
- """
-
- def combine(date, time):
- """Return a new datetime object.
-
- Its date members are equal to the given date object's, and whose time
- and tzinfo members are equal to the given time object's. For any
- datetime object *d*, ``d == datetime.combine(d.date(), d.timetz())``.
- If date is a datetime object, its time and tzinfo members are ignored.
- """
-
-
-class IDateTime(IDate, IDateTimeClass):
- """Object contains all the information from a date object and a time object.
-
- Implemented by `datetime.datetime`.
- """
-
- year = Attribute("Year between MINYEAR and MAXYEAR inclusive")
-
- month = Attribute("Month between 1 and 12 inclusive")
-
- day = Attribute(
- "Day between 1 and the number of days in the given month of the year")
-
- hour = Attribute("Hour in range(24)")
-
- minute = Attribute("Minute in range(60)")
-
- second = Attribute("Second in range(60)")
-
- microsecond = Attribute("Microsecond in range(1000000)")
-
- tzinfo = Attribute(
- """The object passed as the tzinfo argument to the datetime constructor
- or None if none was passed""")
-
- def date():
- """Return date object with same year, month and day."""
-
- def time():
- """Return time object with same hour, minute, second, microsecond.
-
- tzinfo is None.
-
- .. seealso:: Method :meth:`timetz`.
- """
-
- def timetz():
- """Return time object with same hour, minute, second, microsecond,
- and tzinfo.
-
- .. seealso:: Method :meth:`time`.
- """
-
- def replace(year, month, day, hour, minute, second, microsecond, tzinfo):
- """Return a datetime with the same members, except for those members
- given new values by whichever keyword arguments are specified.
-
- Note that ``tzinfo=None`` can be specified to create a naive datetime from
- an aware datetime with no conversion of date and time members.
- """
-
- def astimezone(tz):
- """Return a datetime object with new tzinfo member tz, adjusting the
- date and time members so the result is the same UTC time as self, but
- in tz's local time.
-
- tz must be an instance of a tzinfo subclass, and its utcoffset() and
- dst() methods must not return None. self must be aware (self.tzinfo
- must not be None, and self.utcoffset() must not return None).
-
- If self.tzinfo is tz, self.astimezone(tz) is equal to self: no
- adjustment of date or time members is performed. Else the result is
- local time in time zone tz, representing the same UTC time as self:
-
- after astz = dt.astimezone(tz), astz - astz.utcoffset()
-
- will usually have the same date and time members as dt - dt.utcoffset().
- The discussion of class `datetime.tzinfo` explains the cases at Daylight Saving
- Time transition boundaries where this cannot be achieved (an issue only
- if tz models both standard and daylight time).
-
- If you merely want to attach a time zone object *tz* to a datetime *dt*
- without adjustment of date and time members, use ``dt.replace(tzinfo=tz)``.
- If you merely want to remove the time zone object from an aware
- datetime dt without conversion of date and time members, use
- ``dt.replace(tzinfo=None)``.
-
- Note that the default `tzinfo.fromutc` method can be overridden in a
- tzinfo subclass to effect the result returned by `astimezone`.
- """
-
- def utcoffset():
- """Return the timezone offset in minutes east of UTC (negative west of
- UTC)."""
-
- def dst():
- """Return 0 if DST is not in effect, or the DST offset (in minutes
- eastward) if DST is in effect.
- """
-
- def tzname():
- """Return the timezone name."""
-
- def timetuple():
- """Return a 9-element tuple of the form returned by `time.localtime`."""
-
- def utctimetuple():
- """Return UTC time tuple compatilble with `time.gmtime`."""
-
- def toordinal():
- """Return the proleptic Gregorian ordinal of the date.
-
- The same as self.date().toordinal().
- """
-
- def weekday():
- """Return the day of the week as an integer.
-
- Monday is 0 and Sunday is 6. The same as self.date().weekday().
- See also isoweekday().
- """
-
- def isoweekday():
- """Return the day of the week as an integer.
-
- Monday is 1 and Sunday is 7. The same as self.date().isoweekday.
-
- .. seealso:: `weekday`, `isocalendar`.
- """
-
- def isocalendar():
- """Return a 3-tuple, (ISO year, ISO week number, ISO weekday).
-
- The same as self.date().isocalendar().
- """
-
- def isoformat(sep='T'):
- """Return a string representing the date and time in ISO 8601 format.
-
- YYYY-MM-DDTHH:MM:SS.mmmmmm or YYYY-MM-DDTHH:MM:SS if microsecond is 0
-
- If `utcoffset` does not return None, a 6-character string is appended,
- giving the UTC offset in (signed) hours and minutes:
-
- YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or YYYY-MM-DDTHH:MM:SS+HH:MM
- if microsecond is 0.
-
- The optional argument sep (default 'T') is a one-character separator,
- placed between the date and time portions of the result.
- """
-
- def __str__():
- """For a datetime instance *d*, ``str(d)`` is equivalent to ``d.isoformat(' ')``.
- """
-
- def ctime():
- """Return a string representing the date and time.
-
- ``datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'``.
- ``d.ctime()`` is equivalent to ``time.ctime(time.mktime(d.timetuple()))`` on
- platforms where the native C ``ctime()`` function (which `time.ctime`
- invokes, but which `datetime.ctime` does not invoke) conforms to the
- C standard.
- """
-
- def strftime(format):
- """Return a string representing the date and time.
-
- This is controlled by an explicit format string.
- """
-
-
-class ITimeClass(Interface):
- """This is the time class interface.
-
- This is symbolic; this module does **not** make
- `datetime.time` provide this interface.
-
- """
-
- min = Attribute("The earliest representable time")
-
- max = Attribute("The latest representable time")
-
- resolution = Attribute(
- "The smallest possible difference between non-equal time objects")
-
-
-class ITime(ITimeClass):
- """Represent time with time zone.
-
- Implemented by `datetime.time`.
-
- Operators:
-
- __repr__, __str__
- __cmp__, __hash__
- """
-
- hour = Attribute("Hour in range(24)")
-
- minute = Attribute("Minute in range(60)")
-
- second = Attribute("Second in range(60)")
-
- microsecond = Attribute("Microsecond in range(1000000)")
-
- tzinfo = Attribute(
- """The object passed as the tzinfo argument to the time constructor
- or None if none was passed.""")
-
- def replace(hour, minute, second, microsecond, tzinfo):
- """Return a time with the same value.
-
- Except for those members given new values by whichever keyword
- arguments are specified. Note that tzinfo=None can be specified
- to create a naive time from an aware time, without conversion of the
- time members.
- """
-
- def isoformat():
- """Return a string representing the time in ISO 8601 format.
-
- That is HH:MM:SS.mmmmmm or, if self.microsecond is 0, HH:MM:SS
- If utcoffset() does not return None, a 6-character string is appended,
- giving the UTC offset in (signed) hours and minutes:
- HH:MM:SS.mmmmmm+HH:MM or, if self.microsecond is 0, HH:MM:SS+HH:MM
- """
-
- def __str__():
- """For a time t, str(t) is equivalent to t.isoformat()."""
-
- def strftime(format):
- """Return a string representing the time.
-
- This is controlled by an explicit format string.
- """
-
- def utcoffset():
- """Return the timezone offset in minutes east of UTC (negative west of
- UTC).
-
- If tzinfo is None, returns None, else returns
- self.tzinfo.utcoffset(None), and raises an exception if the latter
- doesn't return None or a timedelta object representing a whole number
- of minutes with magnitude less than one day.
- """
-
- def dst():
- """Return 0 if DST is not in effect, or the DST offset (in minutes
- eastward) if DST is in effect.
-
- If tzinfo is None, returns None, else returns self.tzinfo.dst(None),
- and raises an exception if the latter doesn't return None, or a
- timedelta object representing a whole number of minutes with
- magnitude less than one day.
- """
-
- def tzname():
- """Return the timezone name.
-
- If tzinfo is None, returns None, else returns self.tzinfo.tzname(None),
- or raises an exception if the latter doesn't return None or a string
- object.
- """
-
-
-class ITZInfo(Interface):
- """Time zone info class.
- """
-
- def utcoffset(dt):
- """Return offset of local time from UTC, in minutes east of UTC.
-
- If local time is west of UTC, this should be negative.
- Note that this is intended to be the total offset from UTC;
- for example, if a tzinfo object represents both time zone and DST
- adjustments, utcoffset() should return their sum. If the UTC offset
- isn't known, return None. Else the value returned must be a timedelta
- object specifying a whole number of minutes in the range -1439 to 1439
- inclusive (1440 = 24*60; the magnitude of the offset must be less
- than one day).
- """
-
- def dst(dt):
- """Return the daylight saving time (DST) adjustment, in minutes east
- of UTC, or None if DST information isn't known.
- """
-
- def tzname(dt):
- """Return the time zone name corresponding to the datetime object as
- a string.
- """
-
- def fromutc(dt):
- """Return an equivalent datetime in self's local time."""
-
-
-classImplements(timedelta, ITimeDelta)
-classImplements(date, IDate)
-classImplements(datetime, IDateTime)
-classImplements(time, ITime)
-classImplements(tzinfo, ITZInfo)
-
-## directlyProvides(timedelta, ITimeDeltaClass)
-## directlyProvides(date, IDateClass)
-## directlyProvides(datetime, IDateTimeClass)
-## directlyProvides(time, ITimeClass)
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/interfaces.py b/resources/python/bin/3.7/linux/zope/interface/common/interfaces.py
deleted file mode 100644
index 688e323a9..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/interfaces.py
+++ /dev/null
@@ -1,209 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Interfaces for standard python exceptions
-"""
-from zope.interface import Interface
-from zope.interface import classImplements
-
-
-class IException(Interface):
- "Interface for `Exception`"
-classImplements(Exception, IException)
-
-
-class IStandardError(IException):
- "Interface for `StandardError` (no longer existing.)"
-
-
-class IWarning(IException):
- "Interface for `Warning`"
-classImplements(Warning, IWarning)
-
-
-class ISyntaxError(IStandardError):
- "Interface for `SyntaxError`"
-classImplements(SyntaxError, ISyntaxError)
-
-
-class ILookupError(IStandardError):
- "Interface for `LookupError`"
-classImplements(LookupError, ILookupError)
-
-
-class IValueError(IStandardError):
- "Interface for `ValueError`"
-classImplements(ValueError, IValueError)
-
-
-class IRuntimeError(IStandardError):
- "Interface for `RuntimeError`"
-classImplements(RuntimeError, IRuntimeError)
-
-
-class IArithmeticError(IStandardError):
- "Interface for `ArithmeticError`"
-classImplements(ArithmeticError, IArithmeticError)
-
-
-class IAssertionError(IStandardError):
- "Interface for `AssertionError`"
-classImplements(AssertionError, IAssertionError)
-
-
-class IAttributeError(IStandardError):
- "Interface for `AttributeError`"
-classImplements(AttributeError, IAttributeError)
-
-
-class IDeprecationWarning(IWarning):
- "Interface for `DeprecationWarning`"
-classImplements(DeprecationWarning, IDeprecationWarning)
-
-
-class IEOFError(IStandardError):
- "Interface for `EOFError`"
-classImplements(EOFError, IEOFError)
-
-
-class IEnvironmentError(IStandardError):
- "Interface for `EnvironmentError`"
-classImplements(EnvironmentError, IEnvironmentError)
-
-
-class IFloatingPointError(IArithmeticError):
- "Interface for `FloatingPointError`"
-classImplements(FloatingPointError, IFloatingPointError)
-
-
-class IIOError(IEnvironmentError):
- "Interface for `IOError`"
-classImplements(IOError, IIOError)
-
-
-class IImportError(IStandardError):
- "Interface for `ImportError`"
-classImplements(ImportError, IImportError)
-
-
-class IIndentationError(ISyntaxError):
- "Interface for `IndentationError`"
-classImplements(IndentationError, IIndentationError)
-
-
-class IIndexError(ILookupError):
- "Interface for `IndexError`"
-classImplements(IndexError, IIndexError)
-
-
-class IKeyError(ILookupError):
- "Interface for `KeyError`"
-classImplements(KeyError, IKeyError)
-
-
-class IKeyboardInterrupt(IStandardError):
- "Interface for `KeyboardInterrupt`"
-classImplements(KeyboardInterrupt, IKeyboardInterrupt)
-
-
-class IMemoryError(IStandardError):
- "Interface for `MemoryError`"
-classImplements(MemoryError, IMemoryError)
-
-
-class INameError(IStandardError):
- "Interface for `NameError`"
-classImplements(NameError, INameError)
-
-
-class INotImplementedError(IRuntimeError):
- "Interface for `NotImplementedError`"
-classImplements(NotImplementedError, INotImplementedError)
-
-
-class IOSError(IEnvironmentError):
- "Interface for `OSError`"
-classImplements(OSError, IOSError)
-
-
-class IOverflowError(IArithmeticError):
- "Interface for `ArithmeticError`"
-classImplements(OverflowError, IOverflowError)
-
-
-class IOverflowWarning(IWarning):
- """Deprecated, no standard class implements this.
-
- This was the interface for ``OverflowWarning`` prior to Python 2.5,
- but that class was removed for all versions after that.
- """
-
-
-class IReferenceError(IStandardError):
- "Interface for `ReferenceError`"
-classImplements(ReferenceError, IReferenceError)
-
-
-class IRuntimeWarning(IWarning):
- "Interface for `RuntimeWarning`"
-classImplements(RuntimeWarning, IRuntimeWarning)
-
-
-class IStopIteration(IException):
- "Interface for `StopIteration`"
-classImplements(StopIteration, IStopIteration)
-
-
-class ISyntaxWarning(IWarning):
- "Interface for `SyntaxWarning`"
-classImplements(SyntaxWarning, ISyntaxWarning)
-
-
-class ISystemError(IStandardError):
- "Interface for `SystemError`"
-classImplements(SystemError, ISystemError)
-
-
-class ISystemExit(IException):
- "Interface for `SystemExit`"
-classImplements(SystemExit, ISystemExit)
-
-
-class ITabError(IIndentationError):
- "Interface for `TabError`"
-classImplements(TabError, ITabError)
-
-
-class ITypeError(IStandardError):
- "Interface for `TypeError`"
-classImplements(TypeError, ITypeError)
-
-
-class IUnboundLocalError(INameError):
- "Interface for `UnboundLocalError`"
-classImplements(UnboundLocalError, IUnboundLocalError)
-
-
-class IUnicodeError(IValueError):
- "Interface for `UnicodeError`"
-classImplements(UnicodeError, IUnicodeError)
-
-
-class IUserWarning(IWarning):
- "Interface for `UserWarning`"
-classImplements(UserWarning, IUserWarning)
-
-
-class IZeroDivisionError(IArithmeticError):
- "Interface for `ZeroDivisionError`"
-classImplements(ZeroDivisionError, IZeroDivisionError)
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/io.py b/resources/python/bin/3.7/linux/zope/interface/common/io.py
deleted file mode 100644
index 89f1ba803..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/io.py
+++ /dev/null
@@ -1,44 +0,0 @@
-##############################################################################
-# Copyright (c) 2020 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""
-Interface definitions paralleling the abstract base classes defined in
-:mod:`io`.
-
-After this module is imported, the standard library types will declare
-that they implement the appropriate interface.
-
-.. versionadded:: 5.0.0
-"""
-
-import io as abc
-
-from zope.interface.common import ABCInterface
-
-
-# pylint:disable=inherit-non-class,
-# pylint:disable=no-member
-
-class IIOBase(ABCInterface):
- abc = abc.IOBase
-
-
-class IRawIOBase(IIOBase):
- abc = abc.RawIOBase
-
-
-class IBufferedIOBase(IIOBase):
- abc = abc.BufferedIOBase
- extra_classes = ()
-
-
-class ITextIOBase(IIOBase):
- abc = abc.TextIOBase
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/mapping.py b/resources/python/bin/3.7/linux/zope/interface/common/mapping.py
deleted file mode 100644
index eb9a2900b..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/mapping.py
+++ /dev/null
@@ -1,169 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-Mapping Interfaces.
-
-Importing this module does *not* mark any standard classes as
-implementing any of these interfaces.
-
-While this module is not deprecated, new code should generally use
-:mod:`zope.interface.common.collections`, specifically
-:class:`~zope.interface.common.collections.IMapping` and
-:class:`~zope.interface.common.collections.IMutableMapping`. This
-module is occasionally useful for its extremely fine grained breakdown
-of interfaces.
-
-The standard library :class:`dict` and :class:`collections.UserDict`
-implement ``IMutableMapping``, but *do not* implement any of the
-interfaces in this module.
-"""
-from zope.interface import Interface
-from zope.interface.common import collections
-
-
-class IItemMapping(Interface):
- """Simplest readable mapping object
- """
-
- def __getitem__(key):
- """Get a value for a key
-
- A `KeyError` is raised if there is no value for the key.
- """
-
-
-class IReadMapping(collections.IContainer, IItemMapping):
- """
- Basic mapping interface.
-
- .. versionchanged:: 5.0.0
- Extend ``IContainer``
- """
-
- def get(key, default=None):
- """Get a value for a key
-
- The default is returned if there is no value for the key.
- """
-
- def __contains__(key):
- """Tell if a key exists in the mapping."""
- # Optional in IContainer, required by this interface.
-
-
-class IWriteMapping(Interface):
- """Mapping methods for changing data"""
-
- def __delitem__(key):
- """Delete a value from the mapping using the key."""
-
- def __setitem__(key, value):
- """Set a new item in the mapping."""
-
-
-class IEnumerableMapping(collections.ISized, IReadMapping):
- """
- Mapping objects whose items can be enumerated.
-
- .. versionchanged:: 5.0.0
- Extend ``ISized``
- """
-
- def keys():
- """Return the keys of the mapping object.
- """
-
- def __iter__():
- """Return an iterator for the keys of the mapping object.
- """
-
- def values():
- """Return the values of the mapping object.
- """
-
- def items():
- """Return the items of the mapping object.
- """
-
-class IMapping(IWriteMapping, IEnumerableMapping):
- ''' Simple mapping interface '''
-
-class IIterableMapping(IEnumerableMapping):
- """A mapping that has distinct methods for iterating
- without copying.
-
- """
-
-
-class IClonableMapping(Interface):
- """Something that can produce a copy of itself.
-
- This is available in `dict`.
- """
-
- def copy():
- "return copy of dict"
-
-class IExtendedReadMapping(IIterableMapping):
- """
- Something with a particular method equivalent to ``__contains__``.
-
- On Python 2, `dict` provided the ``has_key`` method, but it was removed
- in Python 3.
- """
-
-
-class IExtendedWriteMapping(IWriteMapping):
- """Additional mutation methods.
-
- These are all provided by `dict`.
- """
-
- def clear():
- "delete all items"
-
- def update(d):
- " Update D from E: for k in E.keys(): D[k] = E[k]"
-
- def setdefault(key, default=None):
- "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D"
-
- def pop(k, default=None):
- """
- pop(k[,default]) -> value
-
- Remove specified key and return the corresponding value.
-
- If key is not found, *default* is returned if given, otherwise
- `KeyError` is raised. Note that *default* must not be passed by
- name.
- """
-
- def popitem():
- """remove and return some (key, value) pair as a
- 2-tuple; but raise KeyError if mapping is empty"""
-
-class IFullMapping(
- collections.IMutableMapping,
- IExtendedReadMapping, IExtendedWriteMapping, IClonableMapping, IMapping,):
- """
- Full mapping interface.
-
- Most uses of this interface should instead use
- :class:`~zope.interface.commons.collections.IMutableMapping` (one of the
- bases of this interface). The required methods are the same.
-
- .. versionchanged:: 5.0.0
- Extend ``IMutableMapping``
- """
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/numbers.py b/resources/python/bin/3.7/linux/zope/interface/common/numbers.py
deleted file mode 100644
index 6b20e09d3..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/numbers.py
+++ /dev/null
@@ -1,65 +0,0 @@
-##############################################################################
-# Copyright (c) 2020 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""
-Interface definitions paralleling the abstract base classes defined in
-:mod:`numbers`.
-
-After this module is imported, the standard library types will declare
-that they implement the appropriate interface.
-
-.. versionadded:: 5.0.0
-"""
-
-import numbers as abc
-
-from zope.interface.common import ABCInterface
-from zope.interface.common import optional
-
-
-# pylint:disable=inherit-non-class,
-# pylint:disable=no-self-argument,no-method-argument
-# pylint:disable=unexpected-special-method-signature
-# pylint:disable=no-value-for-parameter
-
-
-class INumber(ABCInterface):
- abc = abc.Number
-
-
-class IComplex(INumber):
- abc = abc.Complex
-
- @optional
- def __complex__():
- """
- Rarely implemented, even in builtin types.
- """
-
-
-class IReal(IComplex):
- abc = abc.Real
-
- @optional
- def __complex__():
- """
- Rarely implemented, even in builtin types.
- """
-
- __floor__ = __ceil__ = __complex__
-
-
-class IRational(IReal):
- abc = abc.Rational
-
-
-class IIntegral(IRational):
- abc = abc.Integral
diff --git a/resources/python/bin/3.7/linux/zope/interface/common/sequence.py b/resources/python/bin/3.7/linux/zope/interface/common/sequence.py
deleted file mode 100644
index 738f76d42..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/common/sequence.py
+++ /dev/null
@@ -1,190 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-Sequence Interfaces
-
-Importing this module does *not* mark any standard classes as
-implementing any of these interfaces.
-
-While this module is not deprecated, new code should generally use
-:mod:`zope.interface.common.collections`, specifically
-:class:`~zope.interface.common.collections.ISequence` and
-:class:`~zope.interface.common.collections.IMutableSequence`. This
-module is occasionally useful for its fine-grained breakdown of interfaces.
-
-The standard library :class:`list`, :class:`tuple` and
-:class:`collections.UserList`, among others, implement ``ISequence``
-or ``IMutableSequence`` but *do not* implement any of the interfaces
-in this module.
-"""
-
-__docformat__ = 'restructuredtext'
-from zope.interface import Interface
-from zope.interface.common import collections
-
-
-class IMinimalSequence(collections.IIterable):
- """Most basic sequence interface.
-
- All sequences are iterable. This requires at least one of the
- following:
-
- - a `__getitem__()` method that takes a single argument; integer
- values starting at 0 must be supported, and `IndexError` should
- be raised for the first index for which there is no value, or
-
- - an `__iter__()` method that returns an iterator as defined in
- the Python documentation (http://docs.python.org/lib/typeiter.html).
-
- """
-
- def __getitem__(index):
- """``x.__getitem__(index) <==> x[index]``
-
- Declaring this interface does not specify whether `__getitem__`
- supports slice objects."""
-
-class IFiniteSequence(collections.ISized, IMinimalSequence):
- """
- A sequence of bound size.
-
- .. versionchanged:: 5.0.0
- Extend ``ISized``
- """
-
-class IReadSequence(collections.IContainer, IFiniteSequence):
- """
- read interface shared by tuple and list
-
- This interface is similar to
- :class:`~zope.interface.common.collections.ISequence`, but
- requires that all instances be totally ordered. Most users
- should prefer ``ISequence``.
-
- .. versionchanged:: 5.0.0
- Extend ``IContainer``
- """
-
- def __contains__(item):
- """``x.__contains__(item) <==> item in x``"""
- # Optional in IContainer, required here.
-
- def __lt__(other):
- """``x.__lt__(other) <==> x < other``"""
-
- def __le__(other):
- """``x.__le__(other) <==> x <= other``"""
-
- def __eq__(other):
- """``x.__eq__(other) <==> x == other``"""
-
- def __ne__(other):
- """``x.__ne__(other) <==> x != other``"""
-
- def __gt__(other):
- """``x.__gt__(other) <==> x > other``"""
-
- def __ge__(other):
- """``x.__ge__(other) <==> x >= other``"""
-
- def __add__(other):
- """``x.__add__(other) <==> x + other``"""
-
- def __mul__(n):
- """``x.__mul__(n) <==> x * n``"""
-
- def __rmul__(n):
- """``x.__rmul__(n) <==> n * x``"""
-
-
-class IExtendedReadSequence(IReadSequence):
- """Full read interface for lists"""
-
- def count(item):
- """Return number of occurrences of value"""
-
- def index(item, *args):
- """index(value, [start, [stop]]) -> int
-
- Return first index of *value*
- """
-
-class IUniqueMemberWriteSequence(Interface):
- """The write contract for a sequence that may enforce unique members"""
-
- def __setitem__(index, item):
- """``x.__setitem__(index, item) <==> x[index] = item``
-
- Declaring this interface does not specify whether `__setitem__`
- supports slice objects.
- """
-
- def __delitem__(index):
- """``x.__delitem__(index) <==> del x[index]``
-
- Declaring this interface does not specify whether `__delitem__`
- supports slice objects.
- """
-
- def __iadd__(y):
- """``x.__iadd__(y) <==> x += y``"""
-
- def append(item):
- """Append item to end"""
-
- def insert(index, item):
- """Insert item before index"""
-
- def pop(index=-1):
- """Remove and return item at index (default last)"""
-
- def remove(item):
- """Remove first occurrence of value"""
-
- def reverse():
- """Reverse *IN PLACE*"""
-
- def sort(cmpfunc=None):
- """Stable sort *IN PLACE*; `cmpfunc(x, y)` -> -1, 0, 1"""
-
- def extend(iterable):
- """Extend list by appending elements from the iterable"""
-
-class IWriteSequence(IUniqueMemberWriteSequence):
- """Full write contract for sequences"""
-
- def __imul__(n):
- """``x.__imul__(n) <==> x *= n``"""
-
-class ISequence(IReadSequence, IWriteSequence):
- """
- Full sequence contract.
-
- New code should prefer
- :class:`~zope.interface.common.collections.IMutableSequence`.
-
- Compared to that interface, which is implemented by :class:`list`
- (:class:`~zope.interface.common.builtins.IList`), among others,
- this interface is missing the following methods:
-
- - clear
-
- - count
-
- - index
-
- This interface adds the following methods:
-
- - sort
- """
diff --git a/resources/python/bin/3.7/linux/zope/interface/declarations.py b/resources/python/bin/3.7/linux/zope/interface/declarations.py
deleted file mode 100644
index 87e625203..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/declarations.py
+++ /dev/null
@@ -1,1189 +0,0 @@
-##############################################################################
-# Copyright (c) 2003 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-##############################################################################
-"""Implementation of interface declarations
-
-There are three flavors of declarations:
-
- - Declarations are used to simply name declared interfaces.
-
- - ImplementsDeclarations are used to express the interfaces that a
- class implements (that instances of the class provides).
-
- Implements specifications support inheriting interfaces.
-
- - ProvidesDeclarations are used to express interfaces directly
- provided by objects.
-
-"""
-__docformat__ = 'restructuredtext'
-
-import sys
-import weakref
-from types import FunctionType
-from types import MethodType
-from types import ModuleType
-
-from zope.interface._compat import _use_c_impl
-from zope.interface.interface import Interface
-from zope.interface.interface import InterfaceClass
-from zope.interface.interface import NameAndModuleComparisonMixin
-from zope.interface.interface import Specification
-from zope.interface.interface import SpecificationBase
-
-
-__all__ = [
- # None. The public APIs of this module are
- # re-exported from zope.interface directly.
-]
-
-# pylint:disable=too-many-lines
-
-# Registry of class-implementation specifications
-BuiltinImplementationSpecifications = {}
-
-
-def _next_super_class(ob):
- # When ``ob`` is an instance of ``super``, return
- # the next class in the MRO that we should actually be
- # looking at. Watch out for diamond inheritance!
- self_class = ob.__self_class__
- class_that_invoked_super = ob.__thisclass__
- complete_mro = self_class.__mro__
- next_class = complete_mro[complete_mro.index(class_that_invoked_super) + 1]
- return next_class
-
-class named:
-
- def __init__(self, name):
- self.name = name
-
- def __call__(self, ob):
- ob.__component_name__ = self.name
- return ob
-
-
-class Declaration(Specification):
- """Interface declarations"""
-
- __slots__ = ()
-
- def __init__(self, *bases):
- Specification.__init__(self, _normalizeargs(bases))
-
- def __contains__(self, interface):
- """Test whether an interface is in the specification
- """
-
- return self.extends(interface) and interface in self.interfaces()
-
- def __iter__(self):
- """Return an iterator for the interfaces in the specification
- """
- return self.interfaces()
-
- def flattened(self):
- """Return an iterator of all included and extended interfaces
- """
- return iter(self.__iro__)
-
- def __sub__(self, other):
- """Remove interfaces from a specification
- """
- return Declaration(*[
- i for i in self.interfaces()
- if not [
- j
- for j in other.interfaces()
- if i.extends(j, 0) # non-strict extends
- ]
- ])
-
- def __add__(self, other):
- """
- Add two specifications or a specification and an interface
- and produce a new declaration.
-
- .. versionchanged:: 5.4.0
- Now tries to preserve a consistent resolution order. Interfaces
- being added to this object are added to the front of the resulting resolution
- order if they already extend an interface in this object. Previously,
- they were always added to the end of the order, which easily resulted in
- invalid orders.
- """
- before = []
- result = list(self.interfaces())
- seen = set(result)
- for i in other.interfaces():
- if i in seen:
- continue
- seen.add(i)
- if any(i.extends(x) for x in result):
- # It already extends us, e.g., is a subclass,
- # so it needs to go at the front of the RO.
- before.append(i)
- else:
- result.append(i)
- return Declaration(*(before + result))
-
- # XXX: Is __radd__ needed? No tests break if it's removed.
- # If it is needed, does it need to handle the C3 ordering differently?
- # I (JAM) don't *think* it does.
- __radd__ = __add__
-
- @staticmethod
- def _add_interfaces_to_cls(interfaces, cls):
- # Strip redundant interfaces already provided
- # by the cls so we don't produce invalid
- # resolution orders.
- implemented_by_cls = implementedBy(cls)
- interfaces = tuple([
- iface
- for iface in interfaces
- if not implemented_by_cls.isOrExtends(iface)
- ])
- return interfaces + (implemented_by_cls,)
-
- @staticmethod
- def _argument_names_for_repr(interfaces):
- # These don't actually have to be interfaces, they could be other
- # Specification objects like Implements. Also, the first
- # one is typically/nominally the cls.
- ordered_names = []
- names = set()
- for iface in interfaces:
- duplicate_transform = repr
- if isinstance(iface, InterfaceClass):
- # Special case to get 'foo.bar.IFace'
- # instead of ''
- this_name = iface.__name__
- duplicate_transform = str
- elif isinstance(iface, type):
- # Likewise for types. (Ignoring legacy old-style
- # classes.)
- this_name = iface.__name__
- duplicate_transform = _implements_name
- elif (isinstance(iface, Implements)
- and not iface.declared
- and iface.inherit in interfaces):
- # If nothing is declared, there's no need to even print this;
- # it would just show as ``classImplements(Class)``, and the
- # ``Class`` has typically already.
- continue
- else:
- this_name = repr(iface)
-
- already_seen = this_name in names
- names.add(this_name)
- if already_seen:
- this_name = duplicate_transform(iface)
-
- ordered_names.append(this_name)
- return ', '.join(ordered_names)
-
-
-class _ImmutableDeclaration(Declaration):
- # A Declaration that is immutable. Used as a singleton to
- # return empty answers for things like ``implementedBy``.
- # We have to define the actual singleton after normalizeargs
- # is defined, and that in turn is defined after InterfaceClass and
- # Implements.
-
- __slots__ = ()
-
- __instance = None
-
- def __new__(cls):
- if _ImmutableDeclaration.__instance is None:
- _ImmutableDeclaration.__instance = object.__new__(cls)
- return _ImmutableDeclaration.__instance
-
- def __reduce__(self):
- return "_empty"
-
- @property
- def __bases__(self):
- return ()
-
- @__bases__.setter
- def __bases__(self, new_bases):
- # We expect the superclass constructor to set ``self.__bases__ = ()``.
- # Rather than attempt to special case that in the constructor and allow
- # setting __bases__ only at that time, it's easier to just allow setting
- # the empty tuple at any time. That makes ``x.__bases__ = x.__bases__`` a nice
- # no-op too. (Skipping the superclass constructor altogether is a recipe
- # for maintenance headaches.)
- if new_bases != ():
- raise TypeError("Cannot set non-empty bases on shared empty Declaration.")
-
- # As the immutable empty declaration, we cannot be changed.
- # This means there's no logical reason for us to have dependents
- # or subscriptions: we'll never notify them. So there's no need for
- # us to keep track of any of that.
- @property
- def dependents(self):
- return {}
-
- changed = subscribe = unsubscribe = lambda self, _ignored: None
-
- def interfaces(self):
- # An empty iterator
- return iter(())
-
- def extends(self, interface, strict=True):
- return interface is self._ROOT
-
- def get(self, name, default=None):
- return default
-
- def weakref(self, callback=None):
- # We're a singleton, we never go away. So there's no need to return
- # distinct weakref objects here; their callbacks will never
- # be called. Instead, we only need to return a callable that
- # returns ourself. The easiest one is to return _ImmutableDeclaration
- # itself; testing on Python 3.8 shows that's faster than a function that
- # returns _empty. (Remember, one goal is to avoid allocating any
- # object, and that includes a method.)
- return _ImmutableDeclaration
-
- @property
- def _v_attrs(self):
- # _v_attrs is not a public, documented property, but some client code
- # uses it anyway as a convenient place to cache things. To keep the
- # empty declaration truly immutable, we must ignore that. That includes
- # ignoring assignments as well.
- return {}
-
- @_v_attrs.setter
- def _v_attrs(self, new_attrs):
- pass
-
-
-##############################################################################
-#
-# Implementation specifications
-#
-# These specify interfaces implemented by instances of classes
-
-class Implements(NameAndModuleComparisonMixin,
- Declaration):
- # Inherit from NameAndModuleComparisonMixin to be
- # mutually comparable with InterfaceClass objects.
- # (The two must be mutually comparable to be able to work in e.g., BTrees.)
- # Instances of this class generally don't have a __module__ other than
- # `zope.interface.declarations`, whereas they *do* have a __name__ that is the
- # fully qualified name of the object they are representing.
-
- # Note, though, that equality and hashing are still identity based. This
- # accounts for things like nested objects that have the same name (typically
- # only in tests) and is consistent with pickling. As far as comparisons to InterfaceClass
- # goes, we'll never have equal name and module to those, so we're still consistent there.
- # Instances of this class are essentially intended to be unique and are
- # heavily cached (note how our __reduce__ handles this) so having identity
- # based hash and eq should also work.
-
- # We want equality and hashing to be based on identity. However, we can't actually
- # implement __eq__/__ne__ to do this because sometimes we get wrapped in a proxy.
- # We need to let the proxy types implement these methods so they can handle unwrapping
- # and then rely on: (1) the interpreter automatically changing `implements == proxy` into
- # `proxy == implements` (which will call proxy.__eq__ to do the unwrapping) and then
- # (2) the default equality and hashing semantics being identity based.
-
- # class whose specification should be used as additional base
- inherit = None
-
- # interfaces actually declared for a class
- declared = ()
-
- # Weak cache of {class: } for super objects.
- # Created on demand. These are rare, as of 5.0 anyway. Using a class
- # level default doesn't take space in instances. Using _v_attrs would be
- # another place to store this without taking space unless needed.
- _super_cache = None
-
- __name__ = '?'
-
- @classmethod
- def named(cls, name, *bases):
- # Implementation method: Produce an Implements interface with
- # a fully fleshed out __name__ before calling the constructor, which
- # sets bases to the given interfaces and which may pass this object to
- # other objects (e.g., to adjust dependents). If they're sorting or comparing
- # by name, this needs to be set.
- inst = cls.__new__(cls)
- inst.__name__ = name
- inst.__init__(*bases)
- return inst
-
- def changed(self, originally_changed):
- try:
- del self._super_cache
- except AttributeError:
- pass
- return super().changed(originally_changed)
-
- def __repr__(self):
- if self.inherit:
- name = getattr(self.inherit, '__name__', None) or _implements_name(self.inherit)
- else:
- name = self.__name__
- declared_names = self._argument_names_for_repr(self.declared)
- if declared_names:
- declared_names = ', ' + declared_names
- return 'classImplements({}{})'.format(name, declared_names)
-
- def __reduce__(self):
- return implementedBy, (self.inherit, )
-
-
-def _implements_name(ob):
- # Return the __name__ attribute to be used by its __implemented__
- # property.
- # This must be stable for the "same" object across processes
- # because it is used for sorting. It needn't be unique, though, in cases
- # like nested classes named Foo created by different functions, because
- # equality and hashing is still based on identity.
- # It might be nice to use __qualname__ on Python 3, but that would produce
- # different values between Py2 and Py3.
- return (getattr(ob, '__module__', '?') or '?') + \
- '.' + (getattr(ob, '__name__', '?') or '?')
-
-
-def _implementedBy_super(sup):
- # TODO: This is now simple enough we could probably implement
- # in C if needed.
-
- # If the class MRO is strictly linear, we could just
- # follow the normal algorithm for the next class in the
- # search order (e.g., just return
- # ``implemented_by_next``). But when diamond inheritance
- # or mixins + interface declarations are present, we have
- # to consider the whole MRO and compute a new Implements
- # that excludes the classes being skipped over but
- # includes everything else.
- implemented_by_self = implementedBy(sup.__self_class__)
- cache = implemented_by_self._super_cache # pylint:disable=protected-access
- if cache is None:
- cache = implemented_by_self._super_cache = weakref.WeakKeyDictionary()
-
- key = sup.__thisclass__
- try:
- return cache[key]
- except KeyError:
- pass
-
- next_cls = _next_super_class(sup)
- # For ``implementedBy(cls)``:
- # .__bases__ is .declared + [implementedBy(b) for b in cls.__bases__]
- # .inherit is cls
-
- implemented_by_next = implementedBy(next_cls)
- mro = sup.__self_class__.__mro__
- ix_next_cls = mro.index(next_cls)
- classes_to_keep = mro[ix_next_cls:]
- new_bases = [implementedBy(c) for c in classes_to_keep]
-
- new = Implements.named(
- implemented_by_self.__name__ + ':' + implemented_by_next.__name__,
- *new_bases
- )
- new.inherit = implemented_by_next.inherit
- new.declared = implemented_by_next.declared
- # I don't *think* that new needs to subscribe to ``implemented_by_self``;
- # it auto-subscribed to its bases, and that should be good enough.
- cache[key] = new
-
- return new
-
-
-@_use_c_impl
-def implementedBy(cls): # pylint:disable=too-many-return-statements,too-many-branches
- """Return the interfaces implemented for a class' instances
-
- The value returned is an `~zope.interface.interfaces.IDeclaration`.
- """
- try:
- if isinstance(cls, super):
- # Yes, this needs to be inside the try: block. Some objects
- # like security proxies even break isinstance.
- return _implementedBy_super(cls)
-
- spec = cls.__dict__.get('__implemented__')
- except AttributeError:
-
- # we can't get the class dict. This is probably due to a
- # security proxy. If this is the case, then probably no
- # descriptor was installed for the class.
-
- # We don't want to depend directly on zope.security in
- # zope.interface, but we'll try to make reasonable
- # accommodations in an indirect way.
-
- # We'll check to see if there's an implements:
-
- spec = getattr(cls, '__implemented__', None)
- if spec is None:
- # There's no spec stred in the class. Maybe its a builtin:
- spec = BuiltinImplementationSpecifications.get(cls)
- if spec is not None:
- return spec
- return _empty
-
- if spec.__class__ == Implements:
- # we defaulted to _empty or there was a spec. Good enough.
- # Return it.
- return spec
-
- # TODO: need old style __implements__ compatibility?
- # Hm, there's an __implemented__, but it's not a spec. Must be
- # an old-style declaration. Just compute a spec for it
- return Declaration(*_normalizeargs((spec, )))
-
- if isinstance(spec, Implements):
- return spec
-
- if spec is None:
- spec = BuiltinImplementationSpecifications.get(cls)
- if spec is not None:
- return spec
-
- # TODO: need old style __implements__ compatibility?
- spec_name = _implements_name(cls)
- if spec is not None:
- # old-style __implemented__ = foo declaration
- spec = (spec, ) # tuplefy, as it might be just an int
- spec = Implements.named(spec_name, *_normalizeargs(spec))
- spec.inherit = None # old-style implies no inherit
- del cls.__implemented__ # get rid of the old-style declaration
- else:
- try:
- bases = cls.__bases__
- except AttributeError:
- if not callable(cls):
- raise TypeError("ImplementedBy called for non-factory", cls)
- bases = ()
-
- spec = Implements.named(spec_name, *[implementedBy(c) for c in bases])
- spec.inherit = cls
-
- try:
- cls.__implemented__ = spec
- if not hasattr(cls, '__providedBy__'):
- cls.__providedBy__ = objectSpecificationDescriptor
-
- if isinstance(cls, type) and '__provides__' not in cls.__dict__:
- # Make sure we get a __provides__ descriptor
- cls.__provides__ = ClassProvides(
- cls,
- getattr(cls, '__class__', type(cls)),
- )
-
- except TypeError:
- if not isinstance(cls, type):
- raise TypeError("ImplementedBy called for non-type", cls)
- BuiltinImplementationSpecifications[cls] = spec
-
- return spec
-
-
-def classImplementsOnly(cls, *interfaces):
- """
- Declare the only interfaces implemented by instances of a class
-
- The arguments after the class are one or more interfaces or interface
- specifications (`~zope.interface.interfaces.IDeclaration` objects).
-
- The interfaces given (including the interfaces in the specifications)
- replace any previous declarations, *including* inherited definitions. If you
- wish to preserve inherited declarations, you can pass ``implementedBy(cls)``
- in *interfaces*. This can be used to alter the interface resolution order.
- """
- spec = implementedBy(cls)
- # Clear out everything inherited. It's important to
- # also clear the bases right now so that we don't improperly discard
- # interfaces that are already implemented by *old* bases that we're
- # about to get rid of.
- spec.declared = ()
- spec.inherit = None
- spec.__bases__ = ()
- _classImplements_ordered(spec, interfaces, ())
-
-
-def classImplements(cls, *interfaces):
- """
- Declare additional interfaces implemented for instances of a class
-
- The arguments after the class are one or more interfaces or
- interface specifications (`~zope.interface.interfaces.IDeclaration` objects).
-
- The interfaces given (including the interfaces in the specifications)
- are added to any interfaces previously declared. An effort is made to
- keep a consistent C3 resolution order, but this cannot be guaranteed.
-
- .. versionchanged:: 5.0.0
- Each individual interface in *interfaces* may be added to either the
- beginning or end of the list of interfaces declared for *cls*,
- based on inheritance, in order to try to maintain a consistent
- resolution order. Previously, all interfaces were added to the end.
- .. versionchanged:: 5.1.0
- If *cls* is already declared to implement an interface (or derived interface)
- in *interfaces* through inheritance, the interface is ignored. Previously, it
- would redundantly be made direct base of *cls*, which often produced inconsistent
- interface resolution orders. Now, the order will be consistent, but may change.
- Also, if the ``__bases__`` of the *cls* are later changed, the *cls* will no
- longer be considered to implement such an interface (changing the ``__bases__`` of *cls*
- has never been supported).
- """
- spec = implementedBy(cls)
- interfaces = tuple(_normalizeargs(interfaces))
-
- before = []
- after = []
-
- # Take steps to try to avoid producing an invalid resolution
- # order, while still allowing for BWC (in the past, we always
- # appended)
- for iface in interfaces:
- for b in spec.declared:
- if iface.extends(b):
- before.append(iface)
- break
- else:
- after.append(iface)
- _classImplements_ordered(spec, tuple(before), tuple(after))
-
-
-def classImplementsFirst(cls, iface):
- """
- Declare that instances of *cls* additionally provide *iface*.
-
- The second argument is an interface or interface specification.
- It is added as the highest priority (first in the IRO) interface;
- no attempt is made to keep a consistent resolution order.
-
- .. versionadded:: 5.0.0
- """
- spec = implementedBy(cls)
- _classImplements_ordered(spec, (iface,), ())
-
-
-def _classImplements_ordered(spec, before=(), after=()):
- # Elide everything already inherited.
- # Except, if it is the root, and we don't already declare anything else
- # that would imply it, allow the root through. (TODO: When we disallow non-strict
- # IRO, this part of the check can be removed because it's not possible to re-declare
- # like that.)
- before = [
- x
- for x in before
- if not spec.isOrExtends(x) or (x is Interface and not spec.declared)
- ]
- after = [
- x
- for x in after
- if not spec.isOrExtends(x) or (x is Interface and not spec.declared)
- ]
-
- # eliminate duplicates
- new_declared = []
- seen = set()
- for l in before, spec.declared, after:
- for b in l:
- if b not in seen:
- new_declared.append(b)
- seen.add(b)
-
- spec.declared = tuple(new_declared)
-
- # compute the bases
- bases = new_declared # guaranteed no dupes
-
- if spec.inherit is not None:
- for c in spec.inherit.__bases__:
- b = implementedBy(c)
- if b not in seen:
- seen.add(b)
- bases.append(b)
-
- spec.__bases__ = tuple(bases)
-
-
-def _implements_advice(cls):
- interfaces, do_classImplements = cls.__dict__['__implements_advice_data__']
- del cls.__implements_advice_data__
- do_classImplements(cls, *interfaces)
- return cls
-
-
-class implementer:
- """
- Declare the interfaces implemented by instances of a class.
-
- This function is called as a class decorator.
-
- The arguments are one or more interfaces or interface
- specifications (`~zope.interface.interfaces.IDeclaration`
- objects).
-
- The interfaces given (including the interfaces in the
- specifications) are added to any interfaces previously declared,
- unless the interface is already implemented.
-
- Previous declarations include declarations for base classes unless
- implementsOnly was used.
-
- This function is provided for convenience. It provides a more
- convenient way to call `classImplements`. For example::
-
- @implementer(I1)
- class C(object):
- pass
-
- is equivalent to calling::
-
- classImplements(C, I1)
-
- after the class has been created.
-
- .. seealso:: `classImplements`
- The change history provided there applies to this function too.
- """
- __slots__ = ('interfaces',)
-
- def __init__(self, *interfaces):
- self.interfaces = interfaces
-
- def __call__(self, ob):
- if isinstance(ob, type):
- # This is the common branch for classes.
- classImplements(ob, *self.interfaces)
- return ob
-
- spec_name = _implements_name(ob)
- spec = Implements.named(spec_name, *self.interfaces)
- try:
- ob.__implemented__ = spec
- except AttributeError:
- raise TypeError("Can't declare implements", ob)
- return ob
-
-class implementer_only:
- """Declare the only interfaces implemented by instances of a class
-
- This function is called as a class decorator.
-
- The arguments are one or more interfaces or interface
- specifications (`~zope.interface.interfaces.IDeclaration` objects).
-
- Previous declarations including declarations for base classes
- are overridden.
-
- This function is provided for convenience. It provides a more
- convenient way to call `classImplementsOnly`. For example::
-
- @implementer_only(I1)
- class C(object): pass
-
- is equivalent to calling::
-
- classImplementsOnly(I1)
-
- after the class has been created.
- """
-
- def __init__(self, *interfaces):
- self.interfaces = interfaces
-
- def __call__(self, ob):
- if isinstance(ob, (FunctionType, MethodType)):
- # XXX Does this decorator make sense for anything but classes?
- # I don't think so. There can be no inheritance of interfaces
- # on a method or function....
- raise ValueError('The implementer_only decorator is not '
- 'supported for methods or functions.')
-
- # Assume it's a class:
- classImplementsOnly(ob, *self.interfaces)
- return ob
-
-
-##############################################################################
-#
-# Instance declarations
-
-class Provides(Declaration): # Really named ProvidesClass
- """Implement ``__provides__``, the instance-specific specification
-
- When an object is pickled, we pickle the interfaces that it implements.
- """
-
- def __init__(self, cls, *interfaces):
- self.__args = (cls, ) + interfaces
- self._cls = cls
- Declaration.__init__(self, *self._add_interfaces_to_cls(interfaces, cls))
-
- # Added to by ``moduleProvides``, et al
- _v_module_names = ()
-
- def __repr__(self):
- # The typical way to create instances of this
- # object is via calling ``directlyProvides(...)`` or ``alsoProvides()``,
- # but that's not the only way. Proxies, for example,
- # directly use the ``Provides(...)`` function (which is the
- # more generic method, and what we pickle as). We're after the most
- # readable, useful repr in the common case, so we use the most
- # common name.
- #
- # We also cooperate with ``moduleProvides`` to attempt to do the
- # right thing for that API. See it for details.
- function_name = 'directlyProvides'
- if self._cls is ModuleType and self._v_module_names:
- # See notes in ``moduleProvides``/``directlyProvides``
- providing_on_module = True
- interfaces = self.__args[1:]
- else:
- providing_on_module = False
- interfaces = (self._cls,) + self.__bases__
- ordered_names = self._argument_names_for_repr(interfaces)
- if providing_on_module:
- mod_names = self._v_module_names
- if len(mod_names) == 1:
- mod_names = "sys.modules[%r]" % mod_names[0]
- ordered_names = (
- '{}, '.format(mod_names)
- ) + ordered_names
- return "{}({})".format(
- function_name,
- ordered_names,
- )
-
- def __reduce__(self):
- # This reduces to the Provides *function*, not
- # this class.
- return Provides, self.__args
-
- __module__ = 'zope.interface'
-
- def __get__(self, inst, cls):
- """Make sure that a class __provides__ doesn't leak to an instance
- """
- if inst is None and cls is self._cls:
- # We were accessed through a class, so we are the class'
- # provides spec. Just return this object, but only if we are
- # being called on the same class that we were defined for:
- return self
-
- raise AttributeError('__provides__')
-
-ProvidesClass = Provides
-
-# Registry of instance declarations
-# This is a memory optimization to allow objects to share specifications.
-InstanceDeclarations = weakref.WeakValueDictionary()
-
-def Provides(*interfaces): # pylint:disable=function-redefined
- """Declaration for an instance of *cls*.
-
- The correct signature is ``cls, *interfaces``.
- The *cls* is necessary to avoid the
- construction of inconsistent resolution orders.
-
- Instance declarations are shared among instances that have the same
- declaration. The declarations are cached in a weak value dictionary.
- """
- spec = InstanceDeclarations.get(interfaces)
- if spec is None:
- spec = ProvidesClass(*interfaces)
- InstanceDeclarations[interfaces] = spec
-
- return spec
-
-Provides.__safe_for_unpickling__ = True
-
-
-def directlyProvides(object, *interfaces): # pylint:disable=redefined-builtin
- """Declare interfaces declared directly for an object
-
- The arguments after the object are one or more interfaces or interface
- specifications (`~zope.interface.interfaces.IDeclaration` objects).
-
- The interfaces given (including the interfaces in the specifications)
- replace interfaces previously declared for the object.
- """
- cls = getattr(object, '__class__', None)
- if cls is not None and getattr(cls, '__class__', None) is cls:
- # It's a meta class (well, at least it it could be an extension class)
- # Note that we can't get here from the tests: there is no normal
- # class which isn't descriptor aware.
- if not isinstance(object, type):
- raise TypeError("Attempt to make an interface declaration on a "
- "non-descriptor-aware class")
-
- interfaces = _normalizeargs(interfaces)
- if cls is None:
- cls = type(object)
-
- if issubclass(cls, type):
- # we have a class or type. We'll use a special descriptor
- # that provides some extra caching
- object.__provides__ = ClassProvides(object, cls, *interfaces)
- else:
- provides = object.__provides__ = Provides(cls, *interfaces)
- # See notes in ``moduleProvides``.
- if issubclass(cls, ModuleType) and hasattr(object, '__name__'):
- provides._v_module_names += (object.__name__,)
-
-
-
-def alsoProvides(object, *interfaces): # pylint:disable=redefined-builtin
- """Declare interfaces declared directly for an object
-
- The arguments after the object are one or more interfaces or interface
- specifications (`~zope.interface.interfaces.IDeclaration` objects).
-
- The interfaces given (including the interfaces in the specifications) are
- added to the interfaces previously declared for the object.
- """
- directlyProvides(object, directlyProvidedBy(object), *interfaces)
-
-
-def noLongerProvides(object, interface): # pylint:disable=redefined-builtin
- """ Removes a directly provided interface from an object.
- """
- directlyProvides(object, directlyProvidedBy(object) - interface)
- if interface.providedBy(object):
- raise ValueError("Can only remove directly provided interfaces.")
-
-
-@_use_c_impl
-class ClassProvidesBase(SpecificationBase):
-
- __slots__ = (
- '_cls',
- '_implements',
- )
-
- def __get__(self, inst, cls):
- # member slots are set by subclass
- # pylint:disable=no-member
- if cls is self._cls:
- # We only work if called on the class we were defined for
-
- if inst is None:
- # We were accessed through a class, so we are the class'
- # provides spec. Just return this object as is:
- return self
-
- return self._implements
-
- raise AttributeError('__provides__')
-
-
-class ClassProvides(Declaration, ClassProvidesBase):
- """Special descriptor for class ``__provides__``
-
- The descriptor caches the implementedBy info, so that
- we can get declarations for objects without instance-specific
- interfaces a bit quicker.
- """
-
- __slots__ = (
- '__args',
- )
-
- def __init__(self, cls, metacls, *interfaces):
- self._cls = cls
- self._implements = implementedBy(cls)
- self.__args = (cls, metacls, ) + interfaces
- Declaration.__init__(self, *self._add_interfaces_to_cls(interfaces, metacls))
-
- def __repr__(self):
- # There are two common ways to get instances of this object:
- # The most interesting way is calling ``@provider(..)`` as a decorator
- # of a class; this is the same as calling ``directlyProvides(cls, ...)``.
- #
- # The other way is by default: anything that invokes ``implementedBy(x)``
- # will wind up putting an instance in ``type(x).__provides__``; this includes
- # the ``@implementer(...)`` decorator. Those instances won't have any
- # interfaces.
- #
- # Thus, as our repr, we go with the ``directlyProvides()`` syntax.
- interfaces = (self._cls, ) + self.__args[2:]
- ordered_names = self._argument_names_for_repr(interfaces)
- return "directlyProvides({})".format(ordered_names)
-
- def __reduce__(self):
- return self.__class__, self.__args
-
- # Copy base-class method for speed
- __get__ = ClassProvidesBase.__get__
-
-
-def directlyProvidedBy(object): # pylint:disable=redefined-builtin
- """Return the interfaces directly provided by the given object
-
- The value returned is an `~zope.interface.interfaces.IDeclaration`.
- """
- provides = getattr(object, "__provides__", None)
- if (
- provides is None # no spec
- # We might have gotten the implements spec, as an
- # optimization. If so, it's like having only one base, that we
- # lop off to exclude class-supplied declarations:
- or isinstance(provides, Implements)
- ):
- return _empty
-
- # Strip off the class part of the spec:
- return Declaration(provides.__bases__[:-1])
-
-
-class provider:
- """Declare interfaces provided directly by a class
-
- This function is called in a class definition.
-
- The arguments are one or more interfaces or interface specifications
- (`~zope.interface.interfaces.IDeclaration` objects).
-
- The given interfaces (including the interfaces in the specifications)
- are used to create the class's direct-object interface specification.
- An error will be raised if the module class has an direct interface
- specification. In other words, it is an error to call this function more
- than once in a class definition.
-
- Note that the given interfaces have nothing to do with the interfaces
- implemented by instances of the class.
-
- This function is provided for convenience. It provides a more convenient
- way to call `directlyProvides` for a class. For example::
-
- @provider(I1)
- class C:
- pass
-
- is equivalent to calling::
-
- directlyProvides(C, I1)
-
- after the class has been created.
- """
-
- def __init__(self, *interfaces):
- self.interfaces = interfaces
-
- def __call__(self, ob):
- directlyProvides(ob, *self.interfaces)
- return ob
-
-
-def moduleProvides(*interfaces):
- """Declare interfaces provided by a module
-
- This function is used in a module definition.
-
- The arguments are one or more interfaces or interface specifications
- (`~zope.interface.interfaces.IDeclaration` objects).
-
- The given interfaces (including the interfaces in the specifications) are
- used to create the module's direct-object interface specification. An
- error will be raised if the module already has an interface specification.
- In other words, it is an error to call this function more than once in a
- module definition.
-
- This function is provided for convenience. It provides a more convenient
- way to call directlyProvides. For example::
-
- moduleProvides(I1)
-
- is equivalent to::
-
- directlyProvides(sys.modules[__name__], I1)
- """
- frame = sys._getframe(1) # pylint:disable=protected-access
- locals = frame.f_locals # pylint:disable=redefined-builtin
-
- # Try to make sure we were called from a module body
- if (locals is not frame.f_globals) or ('__name__' not in locals):
- raise TypeError(
- "moduleProvides can only be used from a module definition.")
-
- if '__provides__' in locals:
- raise TypeError(
- "moduleProvides can only be used once in a module definition.")
-
- # Note: This is cached based on the key ``(ModuleType, *interfaces)``;
- # One consequence is that any module that provides the same interfaces
- # gets the same ``__repr__``, meaning that you can't tell what module
- # such a declaration came from. Adding the module name to ``_v_module_names``
- # attempts to correct for this; it works in some common situations, but fails
- # (1) after pickling (the data is lost) and (2) if declarations are
- # actually shared and (3) if the alternate spelling of ``directlyProvides()``
- # is used. Problem (3) is fixed by cooperating with ``directlyProvides``
- # to maintain this information, and problem (2) is worked around by
- # printing all the names, but (1) is unsolvable without introducing
- # new classes or changing the stored data...but it doesn't actually matter,
- # because ``ModuleType`` can't be pickled!
- p = locals["__provides__"] = Provides(ModuleType,
- *_normalizeargs(interfaces))
- p._v_module_names += (locals['__name__'],)
-
-
-##############################################################################
-#
-# Declaration querying support
-
-# XXX: is this a fossil? Nobody calls it, no unit tests exercise it, no
-# doctests import it, and the package __init__ doesn't import it.
-# (Answer: Versions of zope.container prior to 4.4.0 called this,
-# and zope.proxy.decorator up through at least 4.3.5 called this.)
-def ObjectSpecification(direct, cls):
- """Provide object specifications
-
- These combine information for the object and for it's classes.
- """
- return Provides(cls, direct) # pragma: no cover fossil
-
-@_use_c_impl
-def getObjectSpecification(ob):
- try:
- provides = ob.__provides__
- except AttributeError:
- provides = None
-
- if provides is not None:
- if isinstance(provides, SpecificationBase):
- return provides
-
- try:
- cls = ob.__class__
- except AttributeError:
- # We can't get the class, so just consider provides
- return _empty
- return implementedBy(cls)
-
-
-@_use_c_impl
-def providedBy(ob):
- """
- Return the interfaces provided by *ob*.
-
- If *ob* is a :class:`super` object, then only interfaces implemented
- by the remainder of the classes in the method resolution order are
- considered. Interfaces directly provided by the object underlying *ob*
- are not.
- """
- # Here we have either a special object, an old-style declaration
- # or a descriptor
-
- # Try to get __providedBy__
- try:
- if isinstance(ob, super): # Some objects raise errors on isinstance()
- return implementedBy(ob)
-
- r = ob.__providedBy__
- except AttributeError:
- # Not set yet. Fall back to lower-level thing that computes it
- return getObjectSpecification(ob)
-
- try:
- # We might have gotten a descriptor from an instance of a
- # class (like an ExtensionClass) that doesn't support
- # descriptors. We'll make sure we got one by trying to get
- # the only attribute, which all specs have.
- r.extends
- except AttributeError:
-
- # The object's class doesn't understand descriptors.
- # Sigh. We need to get an object descriptor, but we have to be
- # careful. We want to use the instance's __provides__, if
- # there is one, but only if it didn't come from the class.
-
- try:
- r = ob.__provides__
- except AttributeError:
- # No __provides__, so just fall back to implementedBy
- return implementedBy(ob.__class__)
-
- # We need to make sure we got the __provides__ from the
- # instance. We'll do this by making sure we don't get the same
- # thing from the class:
-
- try:
- cp = ob.__class__.__provides__
- except AttributeError:
- # The ob doesn't have a class or the class has no
- # provides, assume we're done:
- return r
-
- if r is cp:
- # Oops, we got the provides from the class. This means
- # the object doesn't have it's own. We should use implementedBy
- return implementedBy(ob.__class__)
-
- return r
-
-
-@_use_c_impl
-class ObjectSpecificationDescriptor:
- """Implement the ``__providedBy__`` attribute
-
- The ``__providedBy__`` attribute computes the interfaces provided by
- an object. If an object has an ``__provides__`` attribute, that is returned.
- Otherwise, `implementedBy` the *cls* is returned.
-
- .. versionchanged:: 5.4.0
- Both the default (C) implementation and the Python implementation
- now let exceptions raised by accessing ``__provides__`` propagate.
- Previously, the C version ignored all exceptions.
- .. versionchanged:: 5.4.0
- The Python implementation now matches the C implementation and lets
- a ``__provides__`` of ``None`` override what the class is declared to
- implement.
- """
-
- def __get__(self, inst, cls):
- """Get an object specification for an object
- """
- if inst is None:
- return getObjectSpecification(cls)
-
- try:
- return inst.__provides__
- except AttributeError:
- return implementedBy(cls)
-
-
-##############################################################################
-
-def _normalizeargs(sequence, output=None):
- """Normalize declaration arguments
-
- Normalization arguments might contain Declarions, tuples, or single
- interfaces.
-
- Anything but individual interfaces or implements specs will be expanded.
- """
- if output is None:
- output = []
-
- cls = sequence.__class__
- if InterfaceClass in cls.__mro__ or Implements in cls.__mro__:
- output.append(sequence)
- else:
- for v in sequence:
- _normalizeargs(v, output)
-
- return output
-
-_empty = _ImmutableDeclaration()
-
-objectSpecificationDescriptor = ObjectSpecificationDescriptor()
diff --git a/resources/python/bin/3.7/linux/zope/interface/document.py b/resources/python/bin/3.7/linux/zope/interface/document.py
deleted file mode 100644
index 2595c569d..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/document.py
+++ /dev/null
@@ -1,125 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" Pretty-Print an Interface object as structured text (Yum)
-
-This module provides a function, asStructuredText, for rendering an
-interface as structured text.
-"""
-import zope.interface
-
-
-__all__ = [
- 'asReStructuredText',
- 'asStructuredText',
-]
-
-def asStructuredText(I, munge=0, rst=False):
- """ Output structured text format. Note, this will whack any existing
- 'structured' format of the text.
-
- If `rst=True`, then the output will quote all code as inline literals in
- accordance with 'reStructuredText' markup principles.
- """
-
- if rst:
- inline_literal = lambda s: "``{}``".format(s)
- else:
- inline_literal = lambda s: s
-
- r = [inline_literal(I.getName())]
- outp = r.append
- level = 1
-
- if I.getDoc():
- outp(_justify_and_indent(_trim_doc_string(I.getDoc()), level))
-
- bases = [base
- for base in I.__bases__
- if base is not zope.interface.Interface
- ]
- if bases:
- outp(_justify_and_indent("This interface extends:", level, munge))
- level += 1
- for b in bases:
- item = "o %s" % inline_literal(b.getName())
- outp(_justify_and_indent(_trim_doc_string(item), level, munge))
- level -= 1
-
- namesAndDescriptions = sorted(I.namesAndDescriptions())
-
- outp(_justify_and_indent("Attributes:", level, munge))
- level += 1
- for name, desc in namesAndDescriptions:
- if not hasattr(desc, 'getSignatureString'): # ugh...
- item = "{} -- {}".format(inline_literal(desc.getName()),
- desc.getDoc() or 'no documentation')
- outp(_justify_and_indent(_trim_doc_string(item), level, munge))
- level -= 1
-
- outp(_justify_and_indent("Methods:", level, munge))
- level += 1
- for name, desc in namesAndDescriptions:
- if hasattr(desc, 'getSignatureString'): # ugh...
- _call = "{}{}".format(desc.getName(), desc.getSignatureString())
- item = "{} -- {}".format(inline_literal(_call),
- desc.getDoc() or 'no documentation')
- outp(_justify_and_indent(_trim_doc_string(item), level, munge))
-
- return "\n\n".join(r) + "\n\n"
-
-
-def asReStructuredText(I, munge=0):
- """ Output reStructuredText format. Note, this will whack any existing
- 'structured' format of the text."""
- return asStructuredText(I, munge=munge, rst=True)
-
-
-def _trim_doc_string(text):
- """ Trims a doc string to make it format
- correctly with structured text. """
-
- lines = text.replace('\r\n', '\n').split('\n')
- nlines = [lines.pop(0)]
- if lines:
- min_indent = min([len(line) - len(line.lstrip())
- for line in lines])
- for line in lines:
- nlines.append(line[min_indent:])
-
- return '\n'.join(nlines)
-
-
-def _justify_and_indent(text, level, munge=0, width=72):
- """ indent and justify text, rejustify (munge) if specified """
-
- indent = " " * level
-
- if munge:
- lines = []
- line = indent
- text = text.split()
-
- for word in text:
- line = ' '.join([line, word])
- if len(line) > width:
- lines.append(line)
- line = indent
- else:
- lines.append(line)
-
- return '\n'.join(lines)
-
- else:
- return indent + \
- text.strip().replace("\r\n", "\n") .replace("\n", "\n" + indent)
diff --git a/resources/python/bin/3.7/linux/zope/interface/exceptions.py b/resources/python/bin/3.7/linux/zope/interface/exceptions.py
deleted file mode 100644
index 0612eb230..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/exceptions.py
+++ /dev/null
@@ -1,275 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Interface-specific exceptions
-"""
-
-__all__ = [
- # Invalid tree
- 'Invalid',
- 'DoesNotImplement',
- 'BrokenImplementation',
- 'BrokenMethodImplementation',
- 'MultipleInvalid',
- # Other
- 'BadImplements',
- 'InvalidInterface',
-]
-
-class Invalid(Exception):
- """A specification is violated
- """
-
-
-class _TargetInvalid(Invalid):
- # Internal use. Subclass this when you're describing
- # a particular target object that's invalid according
- # to a specific interface.
- #
- # For backwards compatibility, the *target* and *interface* are
- # optional, and the signatures are inconsistent in their ordering.
- #
- # We deal with the inconsistency in ordering by defining the index
- # of the two values in ``self.args``. *target* uses a marker object to
- # distinguish "not given" from "given, but None", because the latter
- # can be a value that gets passed to validation. For this reason, it must
- # always be the last argument (we detect absence by the ``IndexError``).
-
- _IX_INTERFACE = 0
- _IX_TARGET = 1
- # The exception to catch when indexing self.args indicating that
- # an argument was not given. If all arguments are expected,
- # a subclass should set this to ().
- _NOT_GIVEN_CATCH = IndexError
- _NOT_GIVEN = ''
-
- def _get_arg_or_default(self, ix, default=None):
- try:
- return self.args[ix] # pylint:disable=unsubscriptable-object
- except self._NOT_GIVEN_CATCH:
- return default
-
- @property
- def interface(self):
- return self._get_arg_or_default(self._IX_INTERFACE)
-
- @property
- def target(self):
- return self._get_arg_or_default(self._IX_TARGET, self._NOT_GIVEN)
-
- ###
- # str
- #
- # The ``__str__`` of self is implemented by concatenating (%s), in order,
- # these properties (none of which should have leading or trailing
- # whitespace):
- #
- # - self._str_subject
- # Begin the message, including a description of the target.
- # - self._str_description
- # Provide a general description of the type of error, including
- # the interface name if possible and relevant.
- # - self._str_conjunction
- # Join the description to the details. Defaults to ": ".
- # - self._str_details
- # Provide details about how this particular instance of the error.
- # - self._str_trailer
- # End the message. Usually just a period.
- ###
-
- @property
- def _str_subject(self):
- target = self.target
- if target is self._NOT_GIVEN:
- return "An object"
- return "The object {!r}".format(target)
-
- @property
- def _str_description(self):
- return "has failed to implement interface %s" % (
- self.interface or ''
- )
-
- _str_conjunction = ": "
- _str_details = ""
- _str_trailer = '.'
-
- def __str__(self):
- return "{} {}{}{}{}".format(
- self._str_subject,
- self._str_description,
- self._str_conjunction,
- self._str_details,
- self._str_trailer
- )
-
-
-class DoesNotImplement(_TargetInvalid):
- """
- DoesNotImplement(interface[, target])
-
- The *target* (optional) does not implement the *interface*.
-
- .. versionchanged:: 5.0.0
- Add the *target* argument and attribute, and change the resulting
- string value of this object accordingly.
- """
-
- _str_details = "Does not declaratively implement the interface"
-
-
-class BrokenImplementation(_TargetInvalid):
- """
- BrokenImplementation(interface, name[, target])
-
- The *target* (optional) is missing the attribute *name*.
-
- .. versionchanged:: 5.0.0
- Add the *target* argument and attribute, and change the resulting
- string value of this object accordingly.
-
- The *name* can either be a simple string or a ``Attribute`` object.
- """
-
- _IX_NAME = _TargetInvalid._IX_INTERFACE + 1
- _IX_TARGET = _IX_NAME + 1
-
- @property
- def name(self):
- return self.args[1] # pylint:disable=unsubscriptable-object
-
- @property
- def _str_details(self):
- return "The %s attribute was not provided" % (
- repr(self.name) if isinstance(self.name, str) else self.name
- )
-
-
-class BrokenMethodImplementation(_TargetInvalid):
- """
- BrokenMethodImplementation(method, message[, implementation, interface, target])
-
- The *target* (optional) has a *method* in *implementation* that violates
- its contract in a way described by *mess*.
-
- .. versionchanged:: 5.0.0
- Add the *interface* and *target* argument and attribute,
- and change the resulting string value of this object accordingly.
-
- The *method* can either be a simple string or a ``Method`` object.
-
- .. versionchanged:: 5.0.0
- If *implementation* is given, then the *message* will have the
- string "implementation" replaced with an short but informative
- representation of *implementation*.
-
- """
-
- _IX_IMPL = 2
- _IX_INTERFACE = _IX_IMPL + 1
- _IX_TARGET = _IX_INTERFACE + 1
-
- @property
- def method(self):
- return self.args[0] # pylint:disable=unsubscriptable-object
-
- @property
- def mess(self):
- return self.args[1] # pylint:disable=unsubscriptable-object
-
- @staticmethod
- def __implementation_str(impl):
- # It could be a callable or some arbitrary object, we don't
- # know yet.
- import inspect # Inspect is a heavy-weight dependency, lots of imports
- try:
- sig = inspect.signature
- formatsig = str
- except AttributeError:
- sig = inspect.getargspec
- f = inspect.formatargspec
- formatsig = lambda sig: f(*sig) # pylint:disable=deprecated-method
-
- try:
- sig = sig(impl)
- except (ValueError, TypeError):
- # Unable to introspect. Darn.
- # This could be a non-callable, or a particular builtin,
- # or a bound method that doesn't even accept 'self', e.g.,
- # ``Class.method = lambda: None; Class().method``
- return repr(impl)
-
- try:
- name = impl.__qualname__
- except AttributeError:
- name = impl.__name__
-
- return name + formatsig(sig)
-
- @property
- def _str_details(self):
- impl = self._get_arg_or_default(self._IX_IMPL, self._NOT_GIVEN)
- message = self.mess
- if impl is not self._NOT_GIVEN and 'implementation' in message:
- message = message.replace("implementation", '%r')
- message = message % (self.__implementation_str(impl),)
-
- return 'The contract of {} is violated because {}'.format(
- repr(self.method) if isinstance(self.method, str) else self.method,
- message,
- )
-
-
-class MultipleInvalid(_TargetInvalid):
- """
- The *target* has failed to implement the *interface* in
- multiple ways.
-
- The failures are described by *exceptions*, a collection of
- other `Invalid` instances.
-
- .. versionadded:: 5.0
- """
-
- _NOT_GIVEN_CATCH = ()
-
- def __init__(self, interface, target, exceptions):
- super().__init__(interface, target, tuple(exceptions))
-
- @property
- def exceptions(self):
- return self.args[2] # pylint:disable=unsubscriptable-object
-
- @property
- def _str_details(self):
- # It would be nice to use tabs here, but that
- # is hard to represent in doctests.
- return '\n ' + '\n '.join(
- x._str_details.strip() if isinstance(x, _TargetInvalid) else str(x)
- for x in self.exceptions
- )
-
- _str_conjunction = ':' # We don't want a trailing space, messes up doctests
- _str_trailer = ''
-
-
-class InvalidInterface(Exception):
- """The interface has invalid contents
- """
-
-class BadImplements(TypeError):
- """An implementation assertion is invalid
-
- because it doesn't contain an interface or a sequence of valid
- implementation assertions.
- """
diff --git a/resources/python/bin/3.7/linux/zope/interface/interface.py b/resources/python/bin/3.7/linux/zope/interface/interface.py
deleted file mode 100644
index 8e0d9ad2b..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/interface.py
+++ /dev/null
@@ -1,1148 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Interface object implementation
-"""
-# pylint:disable=protected-access
-import sys
-import weakref
-from types import FunctionType
-from types import MethodType
-from typing import Union
-
-from zope.interface import ro
-from zope.interface._compat import _use_c_impl
-from zope.interface.exceptions import Invalid
-from zope.interface.ro import ro as calculate_ro
-
-
-__all__ = [
- # Most of the public API from this module is directly exported
- # from zope.interface. The only remaining public API intended to
- # be imported from here should be those few things documented as
- # such.
- 'InterfaceClass',
- 'Specification',
- 'adapter_hooks',
-]
-
-CO_VARARGS = 4
-CO_VARKEYWORDS = 8
-# Put in the attrs dict of an interface by ``taggedValue`` and ``invariants``
-TAGGED_DATA = '__interface_tagged_values__'
-# Put in the attrs dict of an interface by ``interfacemethod``
-INTERFACE_METHODS = '__interface_methods__'
-
-_decorator_non_return = object()
-_marker = object()
-
-
-
-def invariant(call):
- f_locals = sys._getframe(1).f_locals
- tags = f_locals.setdefault(TAGGED_DATA, {})
- invariants = tags.setdefault('invariants', [])
- invariants.append(call)
- return _decorator_non_return
-
-
-def taggedValue(key, value):
- """Attaches a tagged value to an interface at definition time."""
- f_locals = sys._getframe(1).f_locals
- tagged_values = f_locals.setdefault(TAGGED_DATA, {})
- tagged_values[key] = value
- return _decorator_non_return
-
-
-class Element:
- """
- Default implementation of `zope.interface.interfaces.IElement`.
- """
-
- # We can't say this yet because we don't have enough
- # infrastructure in place.
- #
- #implements(IElement)
-
- def __init__(self, __name__, __doc__=''): # pylint:disable=redefined-builtin
- if not __doc__ and __name__.find(' ') >= 0:
- __doc__ = __name__
- __name__ = None
-
- self.__name__ = __name__
- self.__doc__ = __doc__
- # Tagged values are rare, especially on methods or attributes.
- # Deferring the allocation can save substantial memory.
- self.__tagged_values = None
-
- def getName(self):
- """ Returns the name of the object. """
- return self.__name__
-
- def getDoc(self):
- """ Returns the documentation for the object. """
- return self.__doc__
-
- ###
- # Tagged values.
- #
- # Direct tagged values are set only in this instance. Others
- # may be inherited (for those subclasses that have that concept).
- ###
-
- def getTaggedValue(self, tag):
- """ Returns the value associated with 'tag'. """
- if not self.__tagged_values:
- raise KeyError(tag)
- return self.__tagged_values[tag]
-
- def queryTaggedValue(self, tag, default=None):
- """ Returns the value associated with 'tag'. """
- return self.__tagged_values.get(tag, default) if self.__tagged_values else default
-
- def getTaggedValueTags(self):
- """ Returns a collection of all tags. """
- return self.__tagged_values.keys() if self.__tagged_values else ()
-
- def setTaggedValue(self, tag, value):
- """ Associates 'value' with 'key'. """
- if self.__tagged_values is None:
- self.__tagged_values = {}
- self.__tagged_values[tag] = value
-
- queryDirectTaggedValue = queryTaggedValue
- getDirectTaggedValue = getTaggedValue
- getDirectTaggedValueTags = getTaggedValueTags
-
-
-SpecificationBasePy = object # filled by _use_c_impl.
-
-
-@_use_c_impl
-class SpecificationBase:
- # This object is the base of the inheritance hierarchy for ClassProvides:
- #
- # ClassProvides < ClassProvidesBase, Declaration
- # Declaration < Specification < SpecificationBase
- # ClassProvidesBase < SpecificationBase
- #
- # In order to have compatible instance layouts, we need to declare
- # the storage used by Specification and Declaration here (and
- # those classes must have ``__slots__ = ()``); fortunately this is
- # not a waste of space because those are the only two inheritance
- # trees. These all translate into tp_members in C.
- __slots__ = (
- # Things used here.
- '_implied',
- # Things used in Specification.
- '_dependents',
- '_bases',
- '_v_attrs',
- '__iro__',
- '__sro__',
- '__weakref__',
- )
-
- def providedBy(self, ob):
- """Is the interface implemented by an object
- """
- spec = providedBy(ob)
- return self in spec._implied
-
- def implementedBy(self, cls):
- """Test whether the specification is implemented by a class or factory.
-
- Raise TypeError if argument is neither a class nor a callable.
- """
- spec = implementedBy(cls)
- return self in spec._implied
-
- def isOrExtends(self, interface):
- """Is the interface the same as or extend the given interface
- """
- return interface in self._implied # pylint:disable=no-member
-
- __call__ = isOrExtends
-
-
-class NameAndModuleComparisonMixin:
- # Internal use. Implement the basic sorting operators (but not (in)equality
- # or hashing). Subclasses must provide ``__name__`` and ``__module__``
- # attributes. Subclasses will be mutually comparable; but because equality
- # and hashing semantics are missing from this class, take care in how
- # you define those two attributes: If you stick with the default equality
- # and hashing (identity based) you should make sure that all possible ``__name__``
- # and ``__module__`` pairs are unique ACROSS ALL SUBCLASSES. (Actually, pretty
- # much the same thing goes if you define equality and hashing to be based on
- # those two attributes: they must still be consistent ACROSS ALL SUBCLASSES.)
-
- # pylint:disable=assigning-non-slot
- __slots__ = ()
-
- def _compare(self, other):
- """
- Compare *self* to *other* based on ``__name__`` and ``__module__``.
-
- Return 0 if they are equal, return 1 if *self* is
- greater than *other*, and return -1 if *self* is less than
- *other*.
-
- If *other* does not have ``__name__`` or ``__module__``, then
- return ``NotImplemented``.
-
- .. caution::
- This allows comparison to things well outside the type hierarchy,
- perhaps not symmetrically.
-
- For example, ``class Foo(object)`` and ``class Foo(Interface)``
- in the same file would compare equal, depending on the order of
- operands. Writing code like this by hand would be unusual, but it could
- happen with dynamic creation of types and interfaces.
-
- None is treated as a pseudo interface that implies the loosest
- contact possible, no contract. For that reason, all interfaces
- sort before None.
- """
- if other is self:
- return 0
-
- if other is None:
- return -1
-
- n1 = (self.__name__, self.__module__)
- try:
- n2 = (other.__name__, other.__module__)
- except AttributeError:
- return NotImplemented
-
- # This spelling works under Python3, which doesn't have cmp().
- return (n1 > n2) - (n1 < n2)
-
- def __lt__(self, other):
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c < 0
-
- def __le__(self, other):
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c <= 0
-
- def __gt__(self, other):
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c > 0
-
- def __ge__(self, other):
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c >= 0
-
-
-@_use_c_impl
-class InterfaceBase(NameAndModuleComparisonMixin, SpecificationBasePy):
- """Base class that wants to be replaced with a C base :)
- """
-
- __slots__ = (
- '__name__',
- '__ibmodule__',
- '_v_cached_hash',
- )
-
- def __init__(self, name=None, module=None):
- self.__name__ = name
- self.__ibmodule__ = module
-
- def _call_conform(self, conform):
- raise NotImplementedError
-
- @property
- def __module_property__(self):
- # This is for _InterfaceMetaClass
- return self.__ibmodule__
-
- def __call__(self, obj, alternate=_marker):
- """Adapt an object to the interface
- """
- try:
- conform = obj.__conform__
- except AttributeError:
- conform = None
-
- if conform is not None:
- adapter = self._call_conform(conform)
- if adapter is not None:
- return adapter
-
- adapter = self.__adapt__(obj)
-
- if adapter is not None:
- return adapter
- if alternate is not _marker:
- return alternate
- raise TypeError("Could not adapt", obj, self)
-
- def __adapt__(self, obj):
- """Adapt an object to the receiver
- """
- if self.providedBy(obj):
- return obj
-
- for hook in adapter_hooks:
- adapter = hook(self, obj)
- if adapter is not None:
- return adapter
-
- return None
-
- def __hash__(self):
- # pylint:disable=assigning-non-slot,attribute-defined-outside-init
- try:
- return self._v_cached_hash
- except AttributeError:
- self._v_cached_hash = hash((self.__name__, self.__module__))
- return self._v_cached_hash
-
- def __eq__(self, other):
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c == 0
-
- def __ne__(self, other):
- if other is self:
- return False
-
- c = self._compare(other)
- if c is NotImplemented:
- return c
- return c != 0
-
-adapter_hooks = _use_c_impl([], 'adapter_hooks')
-
-
-class Specification(SpecificationBase):
- """Specifications
-
- An interface specification is used to track interface declarations
- and component registrations.
-
- This class is a base class for both interfaces themselves and for
- interface specifications (declarations).
-
- Specifications are mutable. If you reassign their bases, their
- relations with other specifications are adjusted accordingly.
- """
- __slots__ = ()
-
- # The root of all Specifications. This will be assigned `Interface`,
- # once it is defined.
- _ROOT = None
-
- # Copy some base class methods for speed
- isOrExtends = SpecificationBase.isOrExtends
- providedBy = SpecificationBase.providedBy
-
- def __init__(self, bases=()):
- # There are many leaf interfaces with no dependents,
- # and a few with very many. It's a heavily left-skewed
- # distribution. In a survey of Plone and Zope related packages
- # that loaded 2245 InterfaceClass objects and 2235 ClassProvides
- # instances, there were a total of 7000 Specification objects created.
- # 4700 had 0 dependents, 1400 had 1, 382 had 2 and so on. Only one
- # for had 1664. So there's savings to be had deferring
- # the creation of dependents.
- self._dependents = None # type: weakref.WeakKeyDictionary
- self._bases = ()
- self._implied = {}
- self._v_attrs = None
- self.__iro__ = ()
- self.__sro__ = ()
-
- self.__bases__ = tuple(bases)
-
- @property
- def dependents(self):
- if self._dependents is None:
- self._dependents = weakref.WeakKeyDictionary()
- return self._dependents
-
- def subscribe(self, dependent):
- self._dependents[dependent] = self.dependents.get(dependent, 0) + 1
-
- def unsubscribe(self, dependent):
- try:
- n = self._dependents[dependent]
- except TypeError:
- raise KeyError(dependent)
- n -= 1
- if not n:
- del self.dependents[dependent]
- else:
- assert n > 0
- self.dependents[dependent] = n
-
- def __setBases(self, bases):
- # Remove ourselves as a dependent of our old bases
- for b in self.__bases__:
- b.unsubscribe(self)
-
- # Register ourselves as a dependent of our new bases
- self._bases = bases
- for b in bases:
- b.subscribe(self)
-
- self.changed(self)
-
- __bases__ = property(
- lambda self: self._bases,
- __setBases,
- )
-
- # This method exists for tests to override the way we call
- # ro.calculate_ro(), usually by adding extra kwargs. We don't
- # want to have a mutable dictionary as a class member that we pass
- # ourself because mutability is bad, and passing **kw is slower than
- # calling the bound function.
- _do_calculate_ro = calculate_ro
-
- def _calculate_sro(self):
- """
- Calculate and return the resolution order for this object, using its ``__bases__``.
-
- Ensures that ``Interface`` is always the last (lowest priority) element.
- """
- # We'd like to make Interface the lowest priority as a
- # property of the resolution order algorithm. That almost
- # works out naturally, but it fails when class inheritance has
- # some bases that DO implement an interface, and some that DO
- # NOT. In such a mixed scenario, you wind up with a set of
- # bases to consider that look like this: [[..., Interface],
- # [..., object], ...]. Depending on the order of inheritance,
- # Interface can wind up before or after object, and that can
- # happen at any point in the tree, meaning Interface can wind
- # up somewhere in the middle of the order. Since Interface is
- # treated as something that everything winds up implementing
- # anyway (a catch-all for things like adapters), having it high up
- # the order is bad. It's also bad to have it at the end, just before
- # some concrete class: concrete classes should be HIGHER priority than
- # interfaces (because there's only one class, but many implementations).
- #
- # One technically nice way to fix this would be to have
- # ``implementedBy(object).__bases__ = (Interface,)``
- #
- # But: (1) That fails for old-style classes and (2) that causes
- # everything to appear to *explicitly* implement Interface, when up
- # to this point it's been an implicit virtual sort of relationship.
- #
- # So we force the issue by mutating the resolution order.
-
- # Note that we let C3 use pre-computed __sro__ for our bases.
- # This requires that by the time this method is invoked, our bases
- # have settled their SROs. Thus, ``changed()`` must first
- # update itself before telling its descendents of changes.
- sro = self._do_calculate_ro(base_mros={
- b: b.__sro__
- for b in self.__bases__
- })
- root = self._ROOT
- if root is not None and sro and sro[-1] is not root:
- # In one dataset of 1823 Interface objects, 1117 ClassProvides objects,
- # sro[-1] was root 4496 times, and only not root 118 times. So it's
- # probably worth checking.
-
- # Once we don't have to deal with old-style classes,
- # we can add a check and only do this if base_count > 1,
- # if we tweak the bootstrapping for ````
- sro = [
- x
- for x in sro
- if x is not root
- ]
- sro.append(root)
-
- return sro
-
- def changed(self, originally_changed):
- """
- We, or something we depend on, have changed.
-
- By the time this is called, the things we depend on,
- such as our bases, should themselves be stable.
- """
- self._v_attrs = None
-
- implied = self._implied
- implied.clear()
-
- ancestors = self._calculate_sro()
- self.__sro__ = tuple(ancestors)
- self.__iro__ = tuple([ancestor for ancestor in ancestors
- if isinstance(ancestor, InterfaceClass)
- ])
-
- for ancestor in ancestors:
- # We directly imply our ancestors:
- implied[ancestor] = ()
-
- # Now, advise our dependents of change
- # (being careful not to create the WeakKeyDictionary if not needed):
- for dependent in tuple(self._dependents.keys() if self._dependents else ()):
- dependent.changed(originally_changed)
-
- # Just in case something called get() at some point
- # during that process and we have a cycle of some sort
- # make sure we didn't cache incomplete results.
- self._v_attrs = None
-
- def interfaces(self):
- """Return an iterator for the interfaces in the specification.
- """
- seen = {}
- for base in self.__bases__:
- for interface in base.interfaces():
- if interface not in seen:
- seen[interface] = 1
- yield interface
-
- def extends(self, interface, strict=True):
- """Does the specification extend the given interface?
-
- Test whether an interface in the specification extends the
- given interface
- """
- return ((interface in self._implied)
- and
- ((not strict) or (self != interface))
- )
-
- def weakref(self, callback=None):
- return weakref.ref(self, callback)
-
- def get(self, name, default=None):
- """Query for an attribute description
- """
- attrs = self._v_attrs
- if attrs is None:
- attrs = self._v_attrs = {}
- attr = attrs.get(name)
- if attr is None:
- for iface in self.__iro__:
- attr = iface.direct(name)
- if attr is not None:
- attrs[name] = attr
- break
-
- return default if attr is None else attr
-
-
-class _InterfaceMetaClass(type):
- # Handling ``__module__`` on ``InterfaceClass`` is tricky. We need
- # to be able to read it on a type and get the expected string. We
- # also need to be able to set it on an instance and get the value
- # we set. So far so good. But what gets tricky is that we'd like
- # to store the value in the C structure (``InterfaceBase.__ibmodule__``) for
- # direct access during equality, sorting, and hashing. "No
- # problem, you think, I'll just use a property" (well, the C
- # equivalents, ``PyMemberDef`` or ``PyGetSetDef``).
- #
- # Except there is a problem. When a subclass is created, the
- # metaclass (``type``) always automatically puts the expected
- # string in the class's dictionary under ``__module__``, thus
- # overriding the property inherited from the superclass. Writing
- # ``Subclass.__module__`` still works, but
- # ``Subclass().__module__`` fails.
- #
- # There are multiple ways to work around this:
- #
- # (1) Define ``InterfaceBase.__getattribute__`` to watch for
- # ``__module__`` and return the C storage.
- #
- # This works, but slows down *all* attribute access (except,
- # ironically, to ``__module__``) by about 25% (40ns becomes 50ns)
- # (when implemented in C). Since that includes methods like
- # ``providedBy``, that's probably not acceptable.
- #
- # All the other methods involve modifying subclasses. This can be
- # done either on the fly in some cases, as instances are
- # constructed, or by using a metaclass. These next few can be done on the fly.
- #
- # (2) Make ``__module__`` a descriptor in each subclass dictionary.
- # It can't be a straight up ``@property`` descriptor, though, because accessing
- # it on the class returns a ``property`` object, not the desired string.
- #
- # (3) Implement a data descriptor (``__get__`` and ``__set__``)
- # that is both a subclass of string, and also does the redirect of
- # ``__module__`` to ``__ibmodule__`` and does the correct thing
- # with the ``instance`` argument to ``__get__`` is None (returns
- # the class's value.) (Why must it be a subclass of string? Because
- # when it' s in the class's dict, it's defined on an *instance* of the
- # metaclass; descriptors in an instance's dict aren't honored --- their
- # ``__get__`` is never invoked --- so it must also *be* the value we want
- # returned.)
- #
- # This works, preserves the ability to read and write
- # ``__module__``, and eliminates any penalty accessing other
- # attributes. But it slows down accessing ``__module__`` of
- # instances by 200% (40ns to 124ns), requires editing class dicts on the fly
- # (in InterfaceClass.__init__), thus slightly slowing down all interface creation,
- # and is ugly.
- #
- # (4) As in the last step, but make it a non-data descriptor (no ``__set__``).
- #
- # If you then *also* store a copy of ``__ibmodule__`` in
- # ``__module__`` in the instance's dict, reading works for both
- # class and instance and is full speed for instances. But the cost
- # is storage space, and you can't write to it anymore, not without
- # things getting out of sync.
- #
- # (Actually, ``__module__`` was never meant to be writable. Doing
- # so would break BTrees and normal dictionaries, as well as the
- # repr, maybe more.)
- #
- # That leaves us with a metaclass. (Recall that a class is an
- # instance of its metaclass, so properties/descriptors defined in
- # the metaclass are used when accessing attributes on the
- # instance/class. We'll use that to define ``__module__``.) Here
- # we can have our cake and eat it too: no extra storage, and
- # C-speed access to the underlying storage. The only substantial
- # cost is that metaclasses tend to make people's heads hurt. (But
- # still less than the descriptor-is-string, hopefully.)
-
- __slots__ = ()
-
- def __new__(cls, name, bases, attrs):
- # Figure out what module defined the interface.
- # This is copied from ``InterfaceClass.__init__``;
- # reviewers aren't sure how AttributeError or KeyError
- # could be raised.
- __module__ = sys._getframe(1).f_globals['__name__']
- # Get the C optimized __module__ accessor and give it
- # to the new class.
- moduledescr = InterfaceBase.__dict__['__module__']
- if isinstance(moduledescr, str):
- # We're working with the Python implementation,
- # not the C version
- moduledescr = InterfaceBase.__dict__['__module_property__']
- attrs['__module__'] = moduledescr
- kind = type.__new__(cls, name, bases, attrs)
- kind.__module = __module__
- return kind
-
- @property
- def __module__(cls):
- return cls.__module
-
- def __repr__(cls):
- return "".format(
- cls.__module,
- cls.__name__,
- )
-
-
-_InterfaceClassBase = _InterfaceMetaClass(
- 'InterfaceClass',
- # From least specific to most specific.
- (InterfaceBase, Specification, Element),
- {'__slots__': ()}
-)
-
-
-def interfacemethod(func):
- """
- Convert a method specification to an actual method of the interface.
-
- This is a decorator that functions like `staticmethod` et al.
-
- The primary use of this decorator is to allow interface definitions to
- define the ``__adapt__`` method, but other interface methods can be
- overridden this way too.
-
- .. seealso:: `zope.interface.interfaces.IInterfaceDeclaration.interfacemethod`
- """
- f_locals = sys._getframe(1).f_locals
- methods = f_locals.setdefault(INTERFACE_METHODS, {})
- methods[func.__name__] = func
- return _decorator_non_return
-
-
-class InterfaceClass(_InterfaceClassBase):
- """
- Prototype (scarecrow) Interfaces Implementation.
-
- Note that it is not possible to change the ``__name__`` or ``__module__``
- after an instance of this object has been constructed.
- """
-
- # We can't say this yet because we don't have enough
- # infrastructure in place.
- #
- #implements(IInterface)
-
- def __new__(cls, name=None, bases=(), attrs=None, __doc__=None, # pylint:disable=redefined-builtin
- __module__=None):
- assert isinstance(bases, tuple)
- attrs = attrs or {}
- needs_custom_class = attrs.pop(INTERFACE_METHODS, None)
- if needs_custom_class:
- needs_custom_class.update(
- {'__classcell__': attrs.pop('__classcell__')}
- if '__classcell__' in attrs
- else {}
- )
- if '__adapt__' in needs_custom_class:
- # We need to tell the C code to call this.
- needs_custom_class['_CALL_CUSTOM_ADAPT'] = 1
-
- if issubclass(cls, _InterfaceClassWithCustomMethods):
- cls_bases = (cls,)
- elif cls is InterfaceClass:
- cls_bases = (_InterfaceClassWithCustomMethods,)
- else:
- cls_bases = (cls, _InterfaceClassWithCustomMethods)
-
- cls = type(cls)( # pylint:disable=self-cls-assignment
- name + "",
- cls_bases,
- needs_custom_class
- )
-
- return _InterfaceClassBase.__new__(cls)
-
- def __init__(self, name, bases=(), attrs=None, __doc__=None, # pylint:disable=redefined-builtin
- __module__=None):
- # We don't call our metaclass parent directly
- # pylint:disable=non-parent-init-called
- # pylint:disable=super-init-not-called
- if not all(isinstance(base, InterfaceClass) for base in bases):
- raise TypeError('Expected base interfaces')
-
- if attrs is None:
- attrs = {}
-
- if __module__ is None:
- __module__ = attrs.get('__module__')
- if isinstance(__module__, str):
- del attrs['__module__']
- else:
- try:
- # Figure out what module defined the interface.
- # This is how cPython figures out the module of
- # a class, but of course it does it in C. :-/
- __module__ = sys._getframe(1).f_globals['__name__']
- except (AttributeError, KeyError): # pragma: no cover
- pass
-
- InterfaceBase.__init__(self, name, __module__)
- # These asserts assisted debugging the metaclass
- # assert '__module__' not in self.__dict__
- # assert self.__ibmodule__ is self.__module__ is __module__
-
- d = attrs.get('__doc__')
- if d is not None:
- if not isinstance(d, Attribute):
- if __doc__ is None:
- __doc__ = d
- del attrs['__doc__']
-
- if __doc__ is None:
- __doc__ = ''
-
- Element.__init__(self, name, __doc__)
-
- tagged_data = attrs.pop(TAGGED_DATA, None)
- if tagged_data is not None:
- for key, val in tagged_data.items():
- self.setTaggedValue(key, val)
-
- Specification.__init__(self, bases)
- self.__attrs = self.__compute_attrs(attrs)
-
- self.__identifier__ = "{}.{}".format(__module__, name)
-
- def __compute_attrs(self, attrs):
- # Make sure that all recorded attributes (and methods) are of type
- # `Attribute` and `Method`
- def update_value(aname, aval):
- if isinstance(aval, Attribute):
- aval.interface = self
- if not aval.__name__:
- aval.__name__ = aname
- elif isinstance(aval, FunctionType):
- aval = fromFunction(aval, self, name=aname)
- else:
- raise InvalidInterface("Concrete attribute, " + aname)
- return aval
-
- return {
- aname: update_value(aname, aval)
- for aname, aval in attrs.items()
- if aname not in (
- # __locals__: Python 3 sometimes adds this.
- '__locals__',
- # __qualname__: PEP 3155 (Python 3.3+)
- '__qualname__',
- # __annotations__: PEP 3107 (Python 3.0+)
- '__annotations__',
- # __static_attributes__: Python 3.13a6+
- # https://github.com/python/cpython/pull/115913
- '__static_attributes__',
- # __firstlineno__: Python 3.13b1+
- # https://github.com/python/cpython/pull/118475
- '__firstlineno__',
- )
- and aval is not _decorator_non_return
- }
-
- def interfaces(self):
- """Return an iterator for the interfaces in the specification.
- """
- yield self
-
- def getBases(self):
- return self.__bases__
-
- def isEqualOrExtendedBy(self, other):
- """Same interface or extends?"""
- return self == other or other.extends(self)
-
- def names(self, all=False): # pylint:disable=redefined-builtin
- """Return the attribute names defined by the interface."""
- if not all:
- return self.__attrs.keys()
-
- r = self.__attrs.copy()
-
- for base in self.__bases__:
- r.update(dict.fromkeys(base.names(all)))
-
- return r.keys()
-
- def __iter__(self):
- return iter(self.names(all=True))
-
- def namesAndDescriptions(self, all=False): # pylint:disable=redefined-builtin
- """Return attribute names and descriptions defined by interface."""
- if not all:
- return self.__attrs.items()
-
- r = {}
- for base in self.__bases__[::-1]:
- r.update(dict(base.namesAndDescriptions(all)))
-
- r.update(self.__attrs)
-
- return r.items()
-
- def getDescriptionFor(self, name):
- """Return the attribute description for the given name."""
- r = self.get(name)
- if r is not None:
- return r
-
- raise KeyError(name)
-
- __getitem__ = getDescriptionFor
-
- def __contains__(self, name):
- return self.get(name) is not None
-
- def direct(self, name):
- return self.__attrs.get(name)
-
- def queryDescriptionFor(self, name, default=None):
- return self.get(name, default)
-
- def validateInvariants(self, obj, errors=None):
- """validate object to defined invariants."""
-
- for iface in self.__iro__:
- for invariant in iface.queryDirectTaggedValue('invariants', ()):
- try:
- invariant(obj)
- except Invalid as error:
- if errors is not None:
- errors.append(error)
- else:
- raise
-
- if errors:
- raise Invalid(errors)
-
- def queryTaggedValue(self, tag, default=None):
- """
- Queries for the value associated with *tag*, returning it from the nearest
- interface in the ``__iro__``.
-
- If not found, returns *default*.
- """
- for iface in self.__iro__:
- value = iface.queryDirectTaggedValue(tag, _marker)
- if value is not _marker:
- return value
- return default
-
- def getTaggedValue(self, tag):
- """ Returns the value associated with 'tag'. """
- value = self.queryTaggedValue(tag, default=_marker)
- if value is _marker:
- raise KeyError(tag)
- return value
-
- def getTaggedValueTags(self):
- """ Returns a list of all tags. """
- keys = set()
- for base in self.__iro__:
- keys.update(base.getDirectTaggedValueTags())
- return keys
-
- def __repr__(self):
- try:
- return self._v_repr
- except AttributeError:
- name = str(self)
- r = "<{} {}>".format(self.__class__.__name__, name)
- self._v_repr = r # pylint:disable=attribute-defined-outside-init
- return r
-
- def __str__(self):
- name = self.__name__
- m = self.__ibmodule__
- if m:
- name = '{}.{}'.format(m, name)
- return name
-
- def _call_conform(self, conform):
- try:
- return conform(self)
- except TypeError: # pragma: no cover
- # We got a TypeError. It might be an error raised by
- # the __conform__ implementation, or *we* may have
- # made the TypeError by calling an unbound method
- # (object is a class). In the later case, we behave
- # as though there is no __conform__ method. We can
- # detect this case by checking whether there is more
- # than one traceback object in the traceback chain:
- if sys.exc_info()[2].tb_next is not None:
- # There is more than one entry in the chain, so
- # reraise the error:
- raise
- # This clever trick is from Phillip Eby
-
- return None # pragma: no cover
-
- def __reduce__(self):
- return self.__name__
-
- def __or__(self, other):
- """Allow type hinting syntax: Interface | None."""
- return Union[self, other]
-
- def __ror__(self, other):
- """Allow type hinting syntax: None | Interface."""
- return Union[other, self]
-
-Interface = InterfaceClass("Interface", __module__='zope.interface')
-# Interface is the only member of its own SRO.
-Interface._calculate_sro = lambda: (Interface,)
-Interface.changed(Interface)
-assert Interface.__sro__ == (Interface,)
-Specification._ROOT = Interface
-ro._ROOT = Interface
-
-class _InterfaceClassWithCustomMethods(InterfaceClass):
- """
- Marker class for interfaces with custom methods that override InterfaceClass methods.
- """
-
-
-class Attribute(Element):
- """Attribute descriptions
- """
-
- # We can't say this yet because we don't have enough
- # infrastructure in place.
- #
- # implements(IAttribute)
-
- interface = None
-
- def _get_str_info(self):
- """Return extra data to put at the end of __str__."""
- return ""
-
- def __str__(self):
- of = ''
- if self.interface is not None:
- of = self.interface.__module__ + '.' + self.interface.__name__ + '.'
- # self.__name__ may be None during construction (e.g., debugging)
- return of + (self.__name__ or '') + self._get_str_info()
-
- def __repr__(self):
- return "<{}.{} object at 0x{:x} {}>".format(
- type(self).__module__,
- type(self).__name__,
- id(self),
- self
- )
-
-
-class Method(Attribute):
- """Method interfaces
-
- The idea here is that you have objects that describe methods.
- This provides an opportunity for rich meta-data.
- """
-
- # We can't say this yet because we don't have enough
- # infrastructure in place.
- #
- # implements(IMethod)
-
- positional = required = ()
- _optional = varargs = kwargs = None
- def _get_optional(self):
- if self._optional is None:
- return {}
- return self._optional
- def _set_optional(self, opt):
- self._optional = opt
- def _del_optional(self):
- self._optional = None
- optional = property(_get_optional, _set_optional, _del_optional)
-
- def __call__(self, *args, **kw):
- raise BrokenImplementation(self.interface, self.__name__)
-
- def getSignatureInfo(self):
- return {'positional': self.positional,
- 'required': self.required,
- 'optional': self.optional,
- 'varargs': self.varargs,
- 'kwargs': self.kwargs,
- }
-
- def getSignatureString(self):
- sig = []
- for v in self.positional:
- sig.append(v)
- if v in self.optional.keys():
- sig[-1] += "=" + repr(self.optional[v])
- if self.varargs:
- sig.append("*" + self.varargs)
- if self.kwargs:
- sig.append("**" + self.kwargs)
-
- return "(%s)" % ", ".join(sig)
-
- _get_str_info = getSignatureString
-
-
-def fromFunction(func, interface=None, imlevel=0, name=None):
- name = name or func.__name__
- method = Method(name, func.__doc__)
- defaults = getattr(func, '__defaults__', None) or ()
- code = func.__code__
- # Number of positional arguments
- na = code.co_argcount - imlevel
- names = code.co_varnames[imlevel:]
- opt = {}
- # Number of required arguments
- defaults_count = len(defaults)
- if not defaults_count:
- # PyPy3 uses ``__defaults_count__`` for builtin methods
- # like ``dict.pop``. Surprisingly, these don't have recorded
- # ``__defaults__``
- defaults_count = getattr(func, '__defaults_count__', 0)
-
- nr = na - defaults_count
- if nr < 0:
- defaults = defaults[-nr:]
- nr = 0
-
- # Determine the optional arguments.
- opt.update(dict(zip(names[nr:], defaults)))
-
- method.positional = names[:na]
- method.required = names[:nr]
- method.optional = opt
-
- argno = na
-
- # Determine the function's variable argument's name (i.e. *args)
- if code.co_flags & CO_VARARGS:
- method.varargs = names[argno]
- argno = argno + 1
- else:
- method.varargs = None
-
- # Determine the function's keyword argument's name (i.e. **kw)
- if code.co_flags & CO_VARKEYWORDS:
- method.kwargs = names[argno]
- else:
- method.kwargs = None
-
- method.interface = interface
-
- for key, value in func.__dict__.items():
- method.setTaggedValue(key, value)
-
- return method
-
-
-def fromMethod(meth, interface=None, name=None):
- if isinstance(meth, MethodType):
- func = meth.__func__
- else:
- func = meth
- return fromFunction(func, interface, imlevel=1, name=name)
-
-
-# Now we can create the interesting interfaces and wire them up:
-def _wire():
- from zope.interface.declarations import classImplements
- # From lest specific to most specific.
- from zope.interface.interfaces import IElement
- classImplements(Element, IElement)
-
- from zope.interface.interfaces import IAttribute
- classImplements(Attribute, IAttribute)
-
- from zope.interface.interfaces import IMethod
- classImplements(Method, IMethod)
-
- from zope.interface.interfaces import ISpecification
- classImplements(Specification, ISpecification)
-
- from zope.interface.interfaces import IInterface
- classImplements(InterfaceClass, IInterface)
-
-
-# We import this here to deal with module dependencies.
-# pylint:disable=wrong-import-position
-from zope.interface.declarations import implementedBy
-from zope.interface.declarations import providedBy
-from zope.interface.exceptions import BrokenImplementation
-from zope.interface.exceptions import InvalidInterface
-
-
-# This ensures that ``Interface`` winds up in the flattened()
-# list of the immutable declaration. It correctly overrides changed()
-# as a no-op, so we bypass that.
-from zope.interface.declarations import _empty
-Specification.changed(_empty, _empty)
diff --git a/resources/python/bin/3.7/linux/zope/interface/interfaces.py b/resources/python/bin/3.7/linux/zope/interface/interfaces.py
deleted file mode 100644
index 0d315cb6a..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/interfaces.py
+++ /dev/null
@@ -1,1481 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Interface Package Interfaces
-"""
-__docformat__ = 'restructuredtext'
-
-from zope.interface.declarations import implementer
-from zope.interface.interface import Attribute
-from zope.interface.interface import Interface
-
-
-__all__ = [
- 'ComponentLookupError',
- 'IAdapterRegistration',
- 'IAdapterRegistry',
- 'IAttribute',
- 'IComponentLookup',
- 'IComponentRegistry',
- 'IComponents',
- 'IDeclaration',
- 'IElement',
- 'IHandlerRegistration',
- 'IInterface',
- 'IInterfaceDeclaration',
- 'IMethod',
- 'Invalid',
- 'IObjectEvent',
- 'IRegistered',
- 'IRegistration',
- 'IRegistrationEvent',
- 'ISpecification',
- 'ISubscriptionAdapterRegistration',
- 'IUnregistered',
- 'IUtilityRegistration',
- 'ObjectEvent',
- 'Registered',
- 'Unregistered',
-]
-
-# pylint:disable=inherit-non-class,no-method-argument,no-self-argument
-# pylint:disable=unexpected-special-method-signature
-# pylint:disable=too-many-lines
-
-class IElement(Interface):
- """
- Objects that have basic documentation and tagged values.
-
- Known derivatives include :class:`IAttribute` and its derivative
- :class:`IMethod`; these have no notion of inheritance.
- :class:`IInterface` is also a derivative, and it does have a
- notion of inheritance, expressed through its ``__bases__`` and
- ordered in its ``__iro__`` (both defined by
- :class:`ISpecification`).
- """
-
- # pylint:disable=arguments-differ
-
- # Note that defining __doc__ as an Attribute hides the docstring
- # from introspection. When changing it, also change it in the Sphinx
- # ReST files.
-
- __name__ = Attribute('__name__', 'The object name')
- __doc__ = Attribute('__doc__', 'The object doc string')
-
- ###
- # Tagged values.
- #
- # Direct values are established in this instance. Others may be
- # inherited. Although ``IElement`` itself doesn't have a notion of
- # inheritance, ``IInterface`` *does*. It might have been better to
- # make ``IInterface`` define new methods
- # ``getIndirectTaggedValue``, etc, to include inheritance instead
- # of overriding ``getTaggedValue`` to do that, but that ship has sailed.
- # So to keep things nice and symmetric, we define the ``Direct`` methods here.
- ###
-
- def getTaggedValue(tag):
- """Returns the value associated with *tag*.
-
- Raise a `KeyError` if the tag isn't set.
-
- If the object has a notion of inheritance, this searches
- through the inheritance hierarchy and returns the nearest result.
- If there is no such notion, this looks only at this object.
-
- .. versionchanged:: 4.7.0
- This method should respect inheritance if present.
- """
-
- def queryTaggedValue(tag, default=None):
- """
- As for `getTaggedValue`, but instead of raising a `KeyError`, returns *default*.
-
-
- .. versionchanged:: 4.7.0
- This method should respect inheritance if present.
- """
-
- def getTaggedValueTags():
- """
- Returns a collection of all tags in no particular order.
-
- If the object has a notion of inheritance, this
- includes all the inherited tagged values. If there is
- no such notion, this looks only at this object.
-
- .. versionchanged:: 4.7.0
- This method should respect inheritance if present.
- """
-
- def setTaggedValue(tag, value):
- """
- Associates *value* with *key* directly in this object.
- """
-
- def getDirectTaggedValue(tag):
- """
- As for `getTaggedValue`, but never includes inheritance.
-
- .. versionadded:: 5.0.0
- """
-
- def queryDirectTaggedValue(tag, default=None):
- """
- As for `queryTaggedValue`, but never includes inheritance.
-
- .. versionadded:: 5.0.0
- """
-
- def getDirectTaggedValueTags():
- """
- As for `getTaggedValueTags`, but includes only tags directly
- set on this object.
-
- .. versionadded:: 5.0.0
- """
-
-
-class IAttribute(IElement):
- """Attribute descriptors"""
-
- interface = Attribute('interface',
- 'Stores the interface instance in which the '
- 'attribute is located.')
-
-
-class IMethod(IAttribute):
- """Method attributes"""
-
- def getSignatureInfo():
- """Returns the signature information.
-
- This method returns a dictionary with the following string keys:
-
- - positional
- A sequence of the names of positional arguments.
- - required
- A sequence of the names of required arguments.
- - optional
- A dictionary mapping argument names to their default values.
- - varargs
- The name of the varargs argument (or None).
- - kwargs
- The name of the kwargs argument (or None).
- """
-
- def getSignatureString():
- """Return a signature string suitable for inclusion in documentation.
-
- This method returns the function signature string. For example, if you
- have ``def func(a, b, c=1, d='f')``, then the signature string is ``"(a, b,
- c=1, d='f')"``.
- """
-
-class ISpecification(Interface):
- """Object Behavioral specifications"""
- # pylint:disable=arguments-differ
- def providedBy(object): # pylint:disable=redefined-builtin
- """Test whether the interface is implemented by the object
-
- Return true of the object asserts that it implements the
- interface, including asserting that it implements an extended
- interface.
- """
-
- def implementedBy(class_):
- """Test whether the interface is implemented by instances of the class
-
- Return true of the class asserts that its instances implement the
- interface, including asserting that they implement an extended
- interface.
- """
-
- def isOrExtends(other):
- """Test whether the specification is or extends another
- """
-
- def extends(other, strict=True):
- """Test whether a specification extends another
-
- The specification extends other if it has other as a base
- interface or if one of it's bases extends other.
-
- If strict is false, then the specification extends itself.
- """
-
- def weakref(callback=None):
- """Return a weakref to the specification
-
- This method is, regrettably, needed to allow weakrefs to be
- computed to security-proxied specifications. While the
- zope.interface package does not require zope.security or
- zope.proxy, it has to be able to coexist with it.
-
- """
-
- __bases__ = Attribute("""Base specifications
-
- A tuple of specifications from which this specification is
- directly derived.
-
- """)
-
- __sro__ = Attribute("""Specification-resolution order
-
- A tuple of the specification and all of it's ancestor
- specifications from most specific to least specific. The specification
- itself is the first element.
-
- (This is similar to the method-resolution order for new-style classes.)
- """)
-
- __iro__ = Attribute("""Interface-resolution order
-
- A tuple of the specification's ancestor interfaces from
- most specific to least specific. The specification itself is
- included if it is an interface.
-
- (This is similar to the method-resolution order for new-style classes.)
- """)
-
- def get(name, default=None):
- """Look up the description for a name
-
- If the named attribute is not defined, the default is
- returned.
- """
-
-
-class IInterface(ISpecification, IElement):
- """Interface objects
-
- Interface objects describe the behavior of an object by containing
- useful information about the object. This information includes:
-
- - Prose documentation about the object. In Python terms, this
- is called the "doc string" of the interface. In this element,
- you describe how the object works in prose language and any
- other useful information about the object.
-
- - Descriptions of attributes. Attribute descriptions include
- the name of the attribute and prose documentation describing
- the attributes usage.
-
- - Descriptions of methods. Method descriptions can include:
-
- - Prose "doc string" documentation about the method and its
- usage.
-
- - A description of the methods arguments; how many arguments
- are expected, optional arguments and their default values,
- the position or arguments in the signature, whether the
- method accepts arbitrary arguments and whether the method
- accepts arbitrary keyword arguments.
-
- - Optional tagged data. Interface objects (and their attributes and
- methods) can have optional, application specific tagged data
- associated with them. Examples uses for this are examples,
- security assertions, pre/post conditions, and other possible
- information you may want to associate with an Interface or its
- attributes.
-
- Not all of this information is mandatory. For example, you may
- only want the methods of your interface to have prose
- documentation and not describe the arguments of the method in
- exact detail. Interface objects are flexible and let you give or
- take any of these components.
-
- Interfaces are created with the Python class statement using
- either `zope.interface.Interface` or another interface, as in::
-
- from zope.interface import Interface
-
- class IMyInterface(Interface):
- '''Interface documentation'''
-
- def meth(arg1, arg2):
- '''Documentation for meth'''
-
- # Note that there is no self argument
-
- class IMySubInterface(IMyInterface):
- '''Interface documentation'''
-
- def meth2():
- '''Documentation for meth2'''
-
- You use interfaces in two ways:
-
- - You assert that your object implement the interfaces.
-
- There are several ways that you can declare that an object
- provides an interface:
-
- 1. Call `zope.interface.implementer` on your class definition.
-
- 2. Call `zope.interface.directlyProvides` on your object.
-
- 3. Call `zope.interface.classImplements` to declare that instances
- of a class implement an interface.
-
- For example::
-
- from zope.interface import classImplements
-
- classImplements(some_class, some_interface)
-
- This approach is useful when it is not an option to modify
- the class source. Note that this doesn't affect what the
- class itself implements, but only what its instances
- implement.
-
- - You query interface meta-data. See the IInterface methods and
- attributes for details.
-
- """
- # pylint:disable=arguments-differ
- def names(all=False): # pylint:disable=redefined-builtin
- """Get the interface attribute names
-
- Return a collection of the names of the attributes, including
- methods, included in the interface definition.
-
- Normally, only directly defined attributes are included. If
- a true positional or keyword argument is given, then
- attributes defined by base classes will be included.
- """
-
- def namesAndDescriptions(all=False): # pylint:disable=redefined-builtin
- """Get the interface attribute names and descriptions
-
- Return a collection of the names and descriptions of the
- attributes, including methods, as name-value pairs, included
- in the interface definition.
-
- Normally, only directly defined attributes are included. If
- a true positional or keyword argument is given, then
- attributes defined by base classes will be included.
- """
-
- def __getitem__(name):
- """Get the description for a name
-
- If the named attribute is not defined, a `KeyError` is raised.
- """
-
- def direct(name):
- """Get the description for the name if it was defined by the interface
-
- If the interface doesn't define the name, returns None.
- """
-
- def validateInvariants(obj, errors=None):
- """Validate invariants
-
- Validate object to defined invariants. If errors is None,
- raises first Invalid error; if errors is a list, appends all errors
- to list, then raises Invalid with the errors as the first element
- of the "args" tuple."""
-
- def __contains__(name):
- """Test whether the name is defined by the interface"""
-
- def __iter__():
- """Return an iterator over the names defined by the interface
-
- The names iterated include all of the names defined by the
- interface directly and indirectly by base interfaces.
- """
-
- __module__ = Attribute("""The name of the module defining the interface""")
-
-
-class IDeclaration(ISpecification):
- """Interface declaration
-
- Declarations are used to express the interfaces implemented by
- classes or provided by objects.
- """
-
- def __contains__(interface):
- """Test whether an interface is in the specification
-
- Return true if the given interface is one of the interfaces in
- the specification and false otherwise.
- """
-
- def __iter__():
- """Return an iterator for the interfaces in the specification
- """
-
- def flattened():
- """Return an iterator of all included and extended interfaces
-
- An iterator is returned for all interfaces either included in
- or extended by interfaces included in the specifications
- without duplicates. The interfaces are in "interface
- resolution order". The interface resolution order is such that
- base interfaces are listed after interfaces that extend them
- and, otherwise, interfaces are included in the order that they
- were defined in the specification.
- """
-
- def __sub__(interfaces):
- """Create an interface specification with some interfaces excluded
-
- The argument can be an interface or an interface
- specifications. The interface or interfaces given in a
- specification are subtracted from the interface specification.
-
- Removing an interface that is not in the specification does
- not raise an error. Doing so has no effect.
-
- Removing an interface also removes sub-interfaces of the interface.
-
- """
-
- def __add__(interfaces):
- """Create an interface specification with some interfaces added
-
- The argument can be an interface or an interface
- specifications. The interface or interfaces given in a
- specification are added to the interface specification.
-
- Adding an interface that is already in the specification does
- not raise an error. Doing so has no effect.
- """
-
- def __nonzero__():
- """Return a true value of the interface specification is non-empty
- """
-
-class IInterfaceDeclaration(Interface):
- """
- Declare and check the interfaces of objects.
-
- The functions defined in this interface are used to declare the
- interfaces that objects provide and to query the interfaces that
- have been declared.
-
- Interfaces can be declared for objects in two ways:
-
- - Interfaces are declared for instances of the object's class
-
- - Interfaces are declared for the object directly.
-
- The interfaces declared for an object are, therefore, the union of
- interfaces declared for the object directly and the interfaces
- declared for instances of the object's class.
-
- Note that we say that a class implements the interfaces provided
- by it's instances. An instance can also provide interfaces
- directly. The interfaces provided by an object are the union of
- the interfaces provided directly and the interfaces implemented by
- the class.
-
- This interface is implemented by :mod:`zope.interface`.
- """
- # pylint:disable=arguments-differ
- ###
- # Defining interfaces
- ###
-
- Interface = Attribute("The base class used to create new interfaces")
-
- def taggedValue(key, value):
- """
- Attach a tagged value to an interface while defining the interface.
-
- This is a way of executing :meth:`IElement.setTaggedValue` from
- the definition of the interface. For example::
-
- class IFoo(Interface):
- taggedValue('key', 'value')
-
- .. seealso:: `zope.interface.taggedValue`
- """
-
- def invariant(checker_function):
- """
- Attach an invariant checker function to an interface while defining it.
-
- Invariants can later be validated against particular implementations by
- calling :meth:`IInterface.validateInvariants`.
-
- For example::
-
- def check_range(ob):
- if ob.max < ob.min:
- raise ValueError("max value is less than min value")
-
- class IRange(Interface):
- min = Attribute("The min value")
- max = Attribute("The max value")
-
- invariant(check_range)
-
- .. seealso:: `zope.interface.invariant`
- """
-
- def interfacemethod(method):
- """
- A decorator that transforms a method specification into an
- implementation method.
-
- This is used to override methods of ``Interface`` or provide new methods.
- Definitions using this decorator will not appear in :meth:`IInterface.names()`.
- It is possible to have an implementation method and a method specification
- of the same name.
-
- For example::
-
- class IRange(Interface):
- @interfacemethod
- def __adapt__(self, obj):
- if isinstance(obj, range):
- # Return the builtin ``range`` as-is
- return obj
- return super(type(IRange), self).__adapt__(obj)
-
- You can use ``super`` to call the parent class functionality. Note that
- the zero-argument version (``super().__adapt__``) works on Python 3.6 and above, but
- prior to that the two-argument version must be used, and the class must be explicitly
- passed as the first argument.
-
- .. versionadded:: 5.1.0
- .. seealso:: `zope.interface.interfacemethod`
- """
-
- ###
- # Querying interfaces
- ###
-
- def providedBy(ob):
- """
- Return the interfaces provided by an object.
-
- This is the union of the interfaces directly provided by an
- object and interfaces implemented by it's class.
-
- The value returned is an `IDeclaration`.
-
- .. seealso:: `zope.interface.providedBy`
- """
-
- def implementedBy(class_):
- """
- Return the interfaces implemented for a class's instances.
-
- The value returned is an `IDeclaration`.
-
- .. seealso:: `zope.interface.implementedBy`
- """
-
- ###
- # Declaring interfaces
- ###
-
- def classImplements(class_, *interfaces):
- """
- Declare additional interfaces implemented for instances of a class.
-
- The arguments after the class are one or more interfaces or
- interface specifications (`IDeclaration` objects).
-
- The interfaces given (including the interfaces in the
- specifications) are added to any interfaces previously
- declared.
-
- Consider the following example::
-
- class C(A, B):
- ...
-
- classImplements(C, I1, I2)
-
-
- Instances of ``C`` provide ``I1``, ``I2``, and whatever interfaces
- instances of ``A`` and ``B`` provide. This is equivalent to::
-
- @implementer(I1, I2)
- class C(A, B):
- pass
-
- .. seealso:: `zope.interface.classImplements`
- .. seealso:: `zope.interface.implementer`
- """
-
- def classImplementsFirst(cls, interface):
- """
- See :func:`zope.interface.classImplementsFirst`.
- """
-
- def implementer(*interfaces):
- """
- Create a decorator for declaring interfaces implemented by a
- factory.
-
- A callable is returned that makes an implements declaration on
- objects passed to it.
-
- .. seealso:: :meth:`classImplements`
- """
-
- def classImplementsOnly(class_, *interfaces):
- """
- Declare the only interfaces implemented by instances of a class.
-
- The arguments after the class are one or more interfaces or
- interface specifications (`IDeclaration` objects).
-
- The interfaces given (including the interfaces in the
- specifications) replace any previous declarations.
-
- Consider the following example::
-
- class C(A, B):
- ...
-
- classImplements(C, IA, IB. IC)
- classImplementsOnly(C. I1, I2)
-
- Instances of ``C`` provide only ``I1``, ``I2``, and regardless of
- whatever interfaces instances of ``A`` and ``B`` implement.
-
- .. seealso:: `zope.interface.classImplementsOnly`
- """
-
- def implementer_only(*interfaces):
- """
- Create a decorator for declaring the only interfaces implemented.
-
- A callable is returned that makes an implements declaration on
- objects passed to it.
-
- .. seealso:: `zope.interface.implementer_only`
- """
-
- def directlyProvidedBy(object): # pylint:disable=redefined-builtin
- """
- Return the interfaces directly provided by the given object.
-
- The value returned is an `IDeclaration`.
-
- .. seealso:: `zope.interface.directlyProvidedBy`
- """
-
- def directlyProvides(object, *interfaces): # pylint:disable=redefined-builtin
- """
- Declare interfaces declared directly for an object.
-
- The arguments after the object are one or more interfaces or
- interface specifications (`IDeclaration` objects).
-
- .. caution::
- The interfaces given (including the interfaces in the
- specifications) *replace* interfaces previously
- declared for the object. See :meth:`alsoProvides` to add
- additional interfaces.
-
- Consider the following example::
-
- class C(A, B):
- ...
-
- ob = C()
- directlyProvides(ob, I1, I2)
-
- The object, ``ob`` provides ``I1``, ``I2``, and whatever interfaces
- instances have been declared for instances of ``C``.
-
- To remove directly provided interfaces, use `directlyProvidedBy` and
- subtract the unwanted interfaces. For example::
-
- directlyProvides(ob, directlyProvidedBy(ob)-I2)
-
- removes I2 from the interfaces directly provided by
- ``ob``. The object, ``ob`` no longer directly provides ``I2``,
- although it might still provide ``I2`` if it's class
- implements ``I2``.
-
- To add directly provided interfaces, use `directlyProvidedBy` and
- include additional interfaces. For example::
-
- directlyProvides(ob, directlyProvidedBy(ob), I2)
-
- adds I2 to the interfaces directly provided by ob.
-
- .. seealso:: `zope.interface.directlyProvides`
- """
-
- def alsoProvides(object, *interfaces): # pylint:disable=redefined-builtin
- """
- Declare additional interfaces directly for an object.
-
- For example::
-
- alsoProvides(ob, I1)
-
- is equivalent to::
-
- directlyProvides(ob, directlyProvidedBy(ob), I1)
-
- .. seealso:: `zope.interface.alsoProvides`
- """
-
- def noLongerProvides(object, interface): # pylint:disable=redefined-builtin
- """
- Remove an interface from the list of an object's directly provided
- interfaces.
-
- For example::
-
- noLongerProvides(ob, I1)
-
- is equivalent to::
-
- directlyProvides(ob, directlyProvidedBy(ob) - I1)
-
- with the exception that if ``I1`` is an interface that is
- provided by ``ob`` through the class's implementation,
- `ValueError` is raised.
-
- .. seealso:: `zope.interface.noLongerProvides`
- """
-
- def provider(*interfaces):
- """
- Declare interfaces provided directly by a class.
-
- .. seealso:: `zope.interface.provider`
- """
-
- def moduleProvides(*interfaces):
- """
- Declare interfaces provided by a module.
-
- This function is used in a module definition.
-
- The arguments are one or more interfaces or interface
- specifications (`IDeclaration` objects).
-
- The given interfaces (including the interfaces in the
- specifications) are used to create the module's direct-object
- interface specification. An error will be raised if the module
- already has an interface specification. In other words, it is
- an error to call this function more than once in a module
- definition.
-
- This function is provided for convenience. It provides a more
- convenient way to call `directlyProvides` for a module. For example::
-
- moduleImplements(I1)
-
- is equivalent to::
-
- directlyProvides(sys.modules[__name__], I1)
-
- .. seealso:: `zope.interface.moduleProvides`
- """
-
- def Declaration(*interfaces):
- """
- Create an interface specification.
-
- The arguments are one or more interfaces or interface
- specifications (`IDeclaration` objects).
-
- A new interface specification (`IDeclaration`) with the given
- interfaces is returned.
-
- .. seealso:: `zope.interface.Declaration`
- """
-
-class IAdapterRegistry(Interface):
- """Provide an interface-based registry for adapters
-
- This registry registers objects that are in some sense "from" a
- sequence of specification to an interface and a name.
-
- No specific semantics are assumed for the registered objects,
- however, the most common application will be to register factories
- that adapt objects providing required specifications to a provided
- interface.
- """
-
- def register(required, provided, name, value):
- """Register a value
-
- A value is registered for a *sequence* of required specifications, a
- provided interface, and a name, which must be text.
- """
-
- def registered(required, provided, name=''):
- """Return the component registered for the given interfaces and name
-
- name must be text.
-
- Unlike the lookup method, this methods won't retrieve
- components registered for more specific required interfaces or
- less specific provided interfaces.
-
- If no component was registered exactly for the given
- interfaces and name, then None is returned.
-
- """
-
- def lookup(required, provided, name='', default=None):
- """Lookup a value
-
- A value is looked up based on a *sequence* of required
- specifications, a provided interface, and a name, which must be
- text.
- """
-
- def queryMultiAdapter(objects, provided, name='', default=None):
- """Adapt a sequence of objects to a named, provided, interface
- """
-
- def lookup1(required, provided, name='', default=None):
- """Lookup a value using a single required interface
-
- A value is looked up based on a single required
- specifications, a provided interface, and a name, which must be
- text.
- """
-
- def queryAdapter(object, provided, name='', default=None): # pylint:disable=redefined-builtin
- """Adapt an object using a registered adapter factory.
- """
-
- def adapter_hook(provided, object, name='', default=None): # pylint:disable=redefined-builtin
- """Adapt an object using a registered adapter factory.
-
- name must be text.
- """
-
- def lookupAll(required, provided):
- """Find all adapters from the required to the provided interfaces
-
- An iterable object is returned that provides name-value two-tuples.
- """
-
- def names(required, provided): # pylint:disable=arguments-differ
- """Return the names for which there are registered objects
- """
-
- def subscribe(required, provided, subscriber): # pylint:disable=arguments-differ
- """Register a subscriber
-
- A subscriber is registered for a *sequence* of required
- specifications, a provided interface, and a name.
-
- Multiple subscribers may be registered for the same (or
- equivalent) interfaces.
-
- .. versionchanged:: 5.1.1
- Correct the method signature to remove the ``name`` parameter.
- Subscribers have no names.
- """
-
- def subscribed(required, provided, subscriber):
- """
- Check whether the object *subscriber* is registered directly
- with this object via a previous call to
- ``subscribe(required, provided, subscriber)``.
-
- If the *subscriber*, or one equal to it, has been subscribed,
- for the given *required* sequence and *provided* interface,
- return that object. (This does not guarantee whether the *subscriber*
- itself is returned, or an object equal to it.)
-
- If it has not, return ``None``.
-
- Unlike :meth:`subscriptions`, this method won't retrieve
- components registered for more specific required interfaces or
- less specific provided interfaces.
-
- .. versionadded:: 5.3.0
- """
-
- def subscriptions(required, provided):
- """
- Get a sequence of subscribers.
-
- Subscribers for a sequence of *required* interfaces, and a *provided*
- interface are returned. This takes into account subscribers
- registered with this object, as well as those registered with
- base adapter registries in the resolution order, and interfaces that
- extend *provided*.
-
- .. versionchanged:: 5.1.1
- Correct the method signature to remove the ``name`` parameter.
- Subscribers have no names.
- """
-
- def subscribers(objects, provided):
- """
- Get a sequence of subscription **adapters**.
-
- This is like :meth:`subscriptions`, but calls the returned
- subscribers with *objects* (and optionally returns the results
- of those calls), instead of returning the subscribers directly.
-
- :param objects: A sequence of objects; they will be used to
- determine the *required* argument to :meth:`subscriptions`.
- :param provided: A single interface, or ``None``, to pass
- as the *provided* parameter to :meth:`subscriptions`.
- If an interface is given, the results of calling each returned
- subscriber with the the *objects* are collected and returned
- from this method; each result should be an object implementing
- the *provided* interface. If ``None``, the resulting subscribers
- are still called, but the results are ignored.
- :return: A sequence of the results of calling the subscribers
- if *provided* is not ``None``. If there are no registered
- subscribers, or *provided* is ``None``, this will be an empty
- sequence.
-
- .. versionchanged:: 5.1.1
- Correct the method signature to remove the ``name`` parameter.
- Subscribers have no names.
- """
-
-# begin formerly in zope.component
-
-class ComponentLookupError(LookupError):
- """A component could not be found."""
-
-class Invalid(Exception):
- """A component doesn't satisfy a promise."""
-
-class IObjectEvent(Interface):
- """An event related to an object.
-
- The object that generated this event is not necessarily the object
- referred to by location.
- """
-
- object = Attribute("The subject of the event.")
-
-
-@implementer(IObjectEvent)
-class ObjectEvent:
-
- def __init__(self, object): # pylint:disable=redefined-builtin
- self.object = object
-
-
-class IComponentLookup(Interface):
- """Component Manager for a Site
-
- This object manages the components registered at a particular site. The
- definition of a site is intentionally vague.
- """
-
- adapters = Attribute(
- "Adapter Registry to manage all registered adapters.")
-
- utilities = Attribute(
- "Adapter Registry to manage all registered utilities.")
-
- def queryAdapter(object, interface, name='', default=None): # pylint:disable=redefined-builtin
- """Look for a named adapter to an interface for an object
-
- If a matching adapter cannot be found, returns the default.
- """
-
- def getAdapter(object, interface, name=''): # pylint:disable=redefined-builtin
- """Look for a named adapter to an interface for an object
-
- If a matching adapter cannot be found, a `ComponentLookupError`
- is raised.
- """
-
- def queryMultiAdapter(objects, interface, name='', default=None):
- """Look for a multi-adapter to an interface for multiple objects
-
- If a matching adapter cannot be found, returns the default.
- """
-
- def getMultiAdapter(objects, interface, name=''):
- """Look for a multi-adapter to an interface for multiple objects
-
- If a matching adapter cannot be found, a `ComponentLookupError`
- is raised.
- """
-
- def getAdapters(objects, provided):
- """Look for all matching adapters to a provided interface for objects
-
- Return an iterable of name-adapter pairs for adapters that
- provide the given interface.
- """
-
- def subscribers(objects, provided):
- """Get subscribers
-
- Subscribers are returned that provide the provided interface
- and that depend on and are computed from the sequence of
- required objects.
- """
-
- def handle(*objects):
- """Call handlers for the given objects
-
- Handlers registered for the given objects are called.
- """
-
- def queryUtility(interface, name='', default=None):
- """Look up a utility that provides an interface.
-
- If one is not found, returns default.
- """
-
- def getUtilitiesFor(interface):
- """Look up the registered utilities that provide an interface.
-
- Returns an iterable of name-utility pairs.
- """
-
- def getAllUtilitiesRegisteredFor(interface):
- """Return all registered utilities for an interface
-
- This includes overridden utilities.
-
- An iterable of utility instances is returned. No names are
- returned.
- """
-
-class IRegistration(Interface):
- """A registration-information object
- """
-
- registry = Attribute("The registry having the registration")
-
- name = Attribute("The registration name")
-
- info = Attribute("""Information about the registration
-
- This is information deemed useful to people browsing the
- configuration of a system. It could, for example, include
- commentary or information about the source of the configuration.
- """)
-
-class IUtilityRegistration(IRegistration):
- """Information about the registration of a utility
- """
-
- factory = Attribute("The factory used to create the utility. Optional.")
- component = Attribute("The object registered")
- provided = Attribute("The interface provided by the component")
-
-class _IBaseAdapterRegistration(IRegistration):
- """Information about the registration of an adapter
- """
-
- factory = Attribute("The factory used to create adapters")
-
- required = Attribute("""The adapted interfaces
-
- This is a sequence of interfaces adapters by the registered
- factory. The factory will be caled with a sequence of objects, as
- positional arguments, that provide these interfaces.
- """)
-
- provided = Attribute("""The interface provided by the adapters.
-
- This interface is implemented by the factory
- """)
-
-class IAdapterRegistration(_IBaseAdapterRegistration):
- """Information about the registration of an adapter
- """
-
-class ISubscriptionAdapterRegistration(_IBaseAdapterRegistration):
- """Information about the registration of a subscription adapter
- """
-
-class IHandlerRegistration(IRegistration):
-
- handler = Attribute("An object called used to handle an event")
-
- required = Attribute("""The handled interfaces
-
- This is a sequence of interfaces handled by the registered
- handler. The handler will be caled with a sequence of objects, as
- positional arguments, that provide these interfaces.
- """)
-
-class IRegistrationEvent(IObjectEvent):
- """An event that involves a registration"""
-
-
-@implementer(IRegistrationEvent)
-class RegistrationEvent(ObjectEvent):
- """There has been a change in a registration
- """
- def __repr__(self):
- return "{} event:\n{!r}".format(self.__class__.__name__, self.object)
-
-class IRegistered(IRegistrationEvent):
- """A component or factory was registered
- """
-
-@implementer(IRegistered)
-class Registered(RegistrationEvent):
- pass
-
-class IUnregistered(IRegistrationEvent):
- """A component or factory was unregistered
- """
-
-@implementer(IUnregistered)
-class Unregistered(RegistrationEvent):
- """A component or factory was unregistered
- """
-
-
-class IComponentRegistry(Interface):
- """Register components
- """
-
- def registerUtility(component=None, provided=None, name='',
- info='', factory=None):
- """Register a utility
-
- :param factory:
- Factory for the component to be registered.
-
- :param component:
- The registered component
-
- :param provided:
- This is the interface provided by the utility. If the
- component provides a single interface, then this
- argument is optional and the component-implemented
- interface will be used.
-
- :param name:
- The utility name.
-
- :param info:
- An object that can be converted to a string to provide
- information about the registration.
-
- Only one of *component* and *factory* can be used.
-
- A `IRegistered` event is generated with an `IUtilityRegistration`.
- """
-
- def unregisterUtility(component=None, provided=None, name='',
- factory=None):
- """Unregister a utility
-
- :returns:
- A boolean is returned indicating whether the registry was
- changed. If the given *component* is None and there is no
- component registered, or if the given *component* is not
- None and is not registered, then the function returns
- False, otherwise it returns True.
-
- :param factory:
- Factory for the component to be unregistered.
-
- :param component:
- The registered component The given component can be
- None, in which case any component registered to provide
- the given provided interface with the given name is
- unregistered.
-
- :param provided:
- This is the interface provided by the utility. If the
- component is not None and provides a single interface,
- then this argument is optional and the
- component-implemented interface will be used.
-
- :param name:
- The utility name.
-
- Only one of *component* and *factory* can be used.
- An `IUnregistered` event is generated with an `IUtilityRegistration`.
- """
-
- def registeredUtilities():
- """Return an iterable of `IUtilityRegistration` instances.
-
- These registrations describe the current utility registrations
- in the object.
- """
-
- def registerAdapter(factory, required=None, provided=None, name='',
- info=''):
- """Register an adapter factory
-
- :param factory:
- The object used to compute the adapter
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If omitted, then the value of the factory's
- ``__component_adapts__`` attribute will be used. The
- ``__component_adapts__`` attribute is
- normally set in class definitions using
- the `.adapter`
- decorator. If the factory doesn't have a
- ``__component_adapts__`` adapts attribute, then this
- argument is required.
-
- :param provided:
- This is the interface provided by the adapter and
- implemented by the factory. If the factory
- implements a single interface, then this argument is
- optional and the factory-implemented interface will be
- used.
-
- :param name:
- The adapter name.
-
- :param info:
- An object that can be converted to a string to provide
- information about the registration.
-
- A `IRegistered` event is generated with an `IAdapterRegistration`.
- """
-
- def unregisterAdapter(factory=None, required=None,
- provided=None, name=''):
- """Unregister an adapter factory
-
- :returns:
- A boolean is returned indicating whether the registry was
- changed. If the given component is None and there is no
- component registered, or if the given component is not
- None and is not registered, then the function returns
- False, otherwise it returns True.
-
- :param factory:
- This is the object used to compute the adapter. The
- factory can be None, in which case any factory
- registered to implement the given provided interface
- for the given required specifications with the given
- name is unregistered.
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If the factory is not None and the required
- arguments is omitted, then the value of the factory's
- __component_adapts__ attribute will be used. The
- __component_adapts__ attribute attribute is normally
- set in class definitions using adapts function, or for
- callables using the adapter decorator. If the factory
- is None or doesn't have a __component_adapts__ adapts
- attribute, then this argument is required.
-
- :param provided:
- This is the interface provided by the adapter and
- implemented by the factory. If the factory is not
- None and implements a single interface, then this
- argument is optional and the factory-implemented
- interface will be used.
-
- :param name:
- The adapter name.
-
- An `IUnregistered` event is generated with an `IAdapterRegistration`.
- """
-
- def registeredAdapters():
- """Return an iterable of `IAdapterRegistration` instances.
-
- These registrations describe the current adapter registrations
- in the object.
- """
-
- def registerSubscriptionAdapter(factory, required=None, provides=None,
- name='', info=''):
- """Register a subscriber factory
-
- :param factory:
- The object used to compute the adapter
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If omitted, then the value of the factory's
- ``__component_adapts__`` attribute will be used. The
- ``__component_adapts__`` attribute is
- normally set using the adapter
- decorator. If the factory doesn't have a
- ``__component_adapts__`` adapts attribute, then this
- argument is required.
-
- :param provided:
- This is the interface provided by the adapter and
- implemented by the factory. If the factory implements
- a single interface, then this argument is optional and
- the factory-implemented interface will be used.
-
- :param name:
- The adapter name.
-
- Currently, only the empty string is accepted. Other
- strings will be accepted in the future when support for
- named subscribers is added.
-
- :param info:
- An object that can be converted to a string to provide
- information about the registration.
-
- A `IRegistered` event is generated with an
- `ISubscriptionAdapterRegistration`.
- """
-
- def unregisterSubscriptionAdapter(factory=None, required=None,
- provides=None, name=''):
- """Unregister a subscriber factory.
-
- :returns:
- A boolean is returned indicating whether the registry was
- changed. If the given component is None and there is no
- component registered, or if the given component is not
- None and is not registered, then the function returns
- False, otherwise it returns True.
-
- :param factory:
- This is the object used to compute the adapter. The
- factory can be None, in which case any factories
- registered to implement the given provided interface
- for the given required specifications with the given
- name are unregistered.
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If omitted, then the value of the factory's
- ``__component_adapts__`` attribute will be used. The
- ``__component_adapts__`` attribute is
- normally set using the adapter
- decorator. If the factory doesn't have a
- ``__component_adapts__`` adapts attribute, then this
- argument is required.
-
- :param provided:
- This is the interface provided by the adapter and
- implemented by the factory. If the factory is not
- None implements a single interface, then this argument
- is optional and the factory-implemented interface will
- be used.
-
- :param name:
- The adapter name.
-
- Currently, only the empty string is accepted. Other
- strings will be accepted in the future when support for
- named subscribers is added.
-
- An `IUnregistered` event is generated with an
- `ISubscriptionAdapterRegistration`.
- """
-
- def registeredSubscriptionAdapters():
- """Return an iterable of `ISubscriptionAdapterRegistration` instances.
-
- These registrations describe the current subscription adapter
- registrations in the object.
- """
-
- def registerHandler(handler, required=None, name='', info=''):
- """Register a handler.
-
- A handler is a subscriber that doesn't compute an adapter
- but performs some function when called.
-
- :param handler:
- The object used to handle some event represented by
- the objects passed to it.
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If omitted, then the value of the factory's
- ``__component_adapts__`` attribute will be used. The
- ``__component_adapts__`` attribute is
- normally set using the adapter
- decorator. If the factory doesn't have a
- ``__component_adapts__`` adapts attribute, then this
- argument is required.
-
- :param name:
- The handler name.
-
- Currently, only the empty string is accepted. Other
- strings will be accepted in the future when support for
- named handlers is added.
-
- :param info:
- An object that can be converted to a string to provide
- information about the registration.
-
-
- A `IRegistered` event is generated with an `IHandlerRegistration`.
- """
-
- def unregisterHandler(handler=None, required=None, name=''):
- """Unregister a handler.
-
- A handler is a subscriber that doesn't compute an adapter
- but performs some function when called.
-
- :returns: A boolean is returned indicating whether the registry was
- changed.
-
- :param handler:
- This is the object used to handle some event
- represented by the objects passed to it. The handler
- can be None, in which case any handlers registered for
- the given required specifications with the given are
- unregistered.
-
- :param required:
- This is a sequence of specifications for objects to be
- adapted. If omitted, then the value of the factory's
- ``__component_adapts__`` attribute will be used. The
- ``__component_adapts__`` attribute is
- normally set using the adapter
- decorator. If the factory doesn't have a
- ``__component_adapts__`` adapts attribute, then this
- argument is required.
-
- :param name:
- The handler name.
-
- Currently, only the empty string is accepted. Other
- strings will be accepted in the future when support for
- named handlers is added.
-
- An `IUnregistered` event is generated with an `IHandlerRegistration`.
- """
-
- def registeredHandlers():
- """Return an iterable of `IHandlerRegistration` instances.
-
- These registrations describe the current handler registrations
- in the object.
- """
-
-
-class IComponents(IComponentLookup, IComponentRegistry):
- """Component registration and access
- """
-
-
-# end formerly in zope.component
diff --git a/resources/python/bin/3.7/linux/zope/interface/registry.py b/resources/python/bin/3.7/linux/zope/interface/registry.py
deleted file mode 100644
index a6a24fdd8..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/registry.py
+++ /dev/null
@@ -1,724 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Basic components support
-"""
-from collections import defaultdict
-
-
-try:
- from zope.event import notify
-except ImportError: # pragma: no cover
- def notify(*arg, **kw): pass
-
-from zope.interface.adapter import AdapterRegistry
-from zope.interface.declarations import implementedBy
-from zope.interface.declarations import implementer
-from zope.interface.declarations import implementer_only
-from zope.interface.declarations import providedBy
-from zope.interface.interface import Interface
-from zope.interface.interfaces import ComponentLookupError
-from zope.interface.interfaces import IAdapterRegistration
-from zope.interface.interfaces import IComponents
-from zope.interface.interfaces import IHandlerRegistration
-from zope.interface.interfaces import ISpecification
-from zope.interface.interfaces import ISubscriptionAdapterRegistration
-from zope.interface.interfaces import IUtilityRegistration
-from zope.interface.interfaces import Registered
-from zope.interface.interfaces import Unregistered
-
-
-__all__ = [
- # Components is public API, but
- # the *Registration classes are just implementations
- # of public interfaces.
- 'Components',
-]
-
-class _UnhashableComponentCounter:
- # defaultdict(int)-like object for unhashable components
-
- def __init__(self, otherdict):
- # [(component, count)]
- self._data = [item for item in otherdict.items()]
-
- def __getitem__(self, key):
- for component, count in self._data:
- if component == key:
- return count
- return 0
-
- def __setitem__(self, component, count):
- for i, data in enumerate(self._data):
- if data[0] == component:
- self._data[i] = component, count
- return
- self._data.append((component, count))
-
- def __delitem__(self, component):
- for i, data in enumerate(self._data):
- if data[0] == component:
- del self._data[i]
- return
- raise KeyError(component) # pragma: no cover
-
-def _defaultdict_int():
- return defaultdict(int)
-
-class _UtilityRegistrations:
-
- def __init__(self, utilities, utility_registrations):
- # {provided -> {component: count}}
- self._cache = defaultdict(_defaultdict_int)
- self._utilities = utilities
- self._utility_registrations = utility_registrations
-
- self.__populate_cache()
-
- def __populate_cache(self):
- for ((p, _), data) in iter(self._utility_registrations.items()):
- component = data[0]
- self.__cache_utility(p, component)
-
- def __cache_utility(self, provided, component):
- try:
- self._cache[provided][component] += 1
- except TypeError:
- # The component is not hashable, and we have a dict. Switch to a strategy
- # that doesn't use hashing.
- prov = self._cache[provided] = _UnhashableComponentCounter(self._cache[provided])
- prov[component] += 1
-
- def __uncache_utility(self, provided, component):
- provided = self._cache[provided]
- # It seems like this line could raise a TypeError if component isn't
- # hashable and we haven't yet switched to _UnhashableComponentCounter. However,
- # we can't actually get in that situation. In order to get here, we would
- # have had to cache the utility already which would have switched
- # the datastructure if needed.
- count = provided[component]
- count -= 1
- if count == 0:
- del provided[component]
- else:
- provided[component] = count
- return count > 0
-
- def _is_utility_subscribed(self, provided, component):
- try:
- return self._cache[provided][component] > 0
- except TypeError:
- # Not hashable and we're still using a dict
- return False
-
- def registerUtility(self, provided, name, component, info, factory):
- subscribed = self._is_utility_subscribed(provided, component)
-
- self._utility_registrations[(provided, name)] = component, info, factory
- self._utilities.register((), provided, name, component)
-
- if not subscribed:
- self._utilities.subscribe((), provided, component)
-
- self.__cache_utility(provided, component)
-
- def unregisterUtility(self, provided, name, component):
- del self._utility_registrations[(provided, name)]
- self._utilities.unregister((), provided, name)
-
- subscribed = self.__uncache_utility(provided, component)
-
- if not subscribed:
- self._utilities.unsubscribe((), provided, component)
-
-
-@implementer(IComponents)
-class Components:
-
- _v_utility_registrations_cache = None
-
- def __init__(self, name='', bases=()):
- # __init__ is used for test cleanup as well as initialization.
- # XXX add a separate API for test cleanup.
- assert isinstance(name, str)
- self.__name__ = name
- self._init_registries()
- self._init_registrations()
- self.__bases__ = tuple(bases)
- self._v_utility_registrations_cache = None
-
- def __repr__(self):
- return "<{} {}>".format(self.__class__.__name__, self.__name__)
-
- def __reduce__(self):
- # Mimic what a persistent.Persistent object does and elide
- # _v_ attributes so that they don't get saved in ZODB.
- # This allows us to store things that cannot be pickled in such
- # attributes.
- reduction = super().__reduce__()
- # (callable, args, state, listiter, dictiter)
- # We assume the state is always a dict; the last three items
- # are technically optional and can be missing or None.
- filtered_state = {k: v for k, v in reduction[2].items()
- if not k.startswith('_v_')}
- reduction = list(reduction)
- reduction[2] = filtered_state
- return tuple(reduction)
-
- def _init_registries(self):
- # Subclasses have never been required to call this method
- # if they override it, merely to fill in these two attributes.
- self.adapters = AdapterRegistry()
- self.utilities = AdapterRegistry()
-
- def _init_registrations(self):
- self._utility_registrations = {}
- self._adapter_registrations = {}
- self._subscription_registrations = []
- self._handler_registrations = []
-
- @property
- def _utility_registrations_cache(self):
- # We use a _v_ attribute internally so that data aren't saved in ZODB,
- # because this object cannot be pickled.
- cache = self._v_utility_registrations_cache
- if (cache is None
- or cache._utilities is not self.utilities
- or cache._utility_registrations is not self._utility_registrations):
- cache = self._v_utility_registrations_cache = _UtilityRegistrations(
- self.utilities,
- self._utility_registrations)
- return cache
-
- def _getBases(self):
- # Subclasses might override
- return self.__dict__.get('__bases__', ())
-
- def _setBases(self, bases):
- # Subclasses might override
- self.adapters.__bases__ = tuple([
- base.adapters for base in bases])
- self.utilities.__bases__ = tuple([
- base.utilities for base in bases])
- self.__dict__['__bases__'] = tuple(bases)
-
- __bases__ = property(
- lambda self: self._getBases(),
- lambda self, bases: self._setBases(bases),
- )
-
- def registerUtility(self, component=None, provided=None, name='',
- info='', event=True, factory=None):
- if factory:
- if component:
- raise TypeError("Can't specify factory and component.")
- component = factory()
-
- if provided is None:
- provided = _getUtilityProvided(component)
-
- if name == '':
- name = _getName(component)
-
- reg = self._utility_registrations.get((provided, name))
- if reg is not None:
- if reg[:2] == (component, info):
- # already registered
- return
- self.unregisterUtility(reg[0], provided, name)
-
- self._utility_registrations_cache.registerUtility(
- provided, name, component, info, factory)
-
- if event:
- notify(Registered(
- UtilityRegistration(self, provided, name, component, info,
- factory)
- ))
-
- def unregisterUtility(self, component=None, provided=None, name='',
- factory=None):
- if factory:
- if component:
- raise TypeError("Can't specify factory and component.")
- component = factory()
-
- if provided is None:
- if component is None:
- raise TypeError("Must specify one of component, factory and "
- "provided")
- provided = _getUtilityProvided(component)
-
- old = self._utility_registrations.get((provided, name))
- if (old is None) or ((component is not None) and
- (component != old[0])):
- return False
-
- if component is None:
- component = old[0]
-
- # Note that component is now the old thing registered
- self._utility_registrations_cache.unregisterUtility(
- provided, name, component)
-
- notify(Unregistered(
- UtilityRegistration(self, provided, name, component, *old[1:])
- ))
-
- return True
-
- def registeredUtilities(self):
- for ((provided, name), data
- ) in iter(self._utility_registrations.items()):
- yield UtilityRegistration(self, provided, name, *data)
-
- def queryUtility(self, provided, name='', default=None):
- return self.utilities.lookup((), provided, name, default)
-
- def getUtility(self, provided, name=''):
- utility = self.utilities.lookup((), provided, name)
- if utility is None:
- raise ComponentLookupError(provided, name)
- return utility
-
- def getUtilitiesFor(self, interface):
- yield from self.utilities.lookupAll((), interface)
-
- def getAllUtilitiesRegisteredFor(self, interface):
- return self.utilities.subscriptions((), interface)
-
- def registerAdapter(self, factory, required=None, provided=None,
- name='', info='', event=True):
- if provided is None:
- provided = _getAdapterProvided(factory)
- required = _getAdapterRequired(factory, required)
- if name == '':
- name = _getName(factory)
- self._adapter_registrations[(required, provided, name)
- ] = factory, info
- self.adapters.register(required, provided, name, factory)
-
- if event:
- notify(Registered(
- AdapterRegistration(self, required, provided, name,
- factory, info)
- ))
-
-
- def unregisterAdapter(self, factory=None,
- required=None, provided=None, name='',
- ):
- if provided is None:
- if factory is None:
- raise TypeError("Must specify one of factory and provided")
- provided = _getAdapterProvided(factory)
-
- if (required is None) and (factory is None):
- raise TypeError("Must specify one of factory and required")
-
- required = _getAdapterRequired(factory, required)
- old = self._adapter_registrations.get((required, provided, name))
- if (old is None) or ((factory is not None) and
- (factory != old[0])):
- return False
-
- del self._adapter_registrations[(required, provided, name)]
- self.adapters.unregister(required, provided, name)
-
- notify(Unregistered(
- AdapterRegistration(self, required, provided, name,
- *old)
- ))
-
- return True
-
- def registeredAdapters(self):
- for ((required, provided, name), (component, info)
- ) in iter(self._adapter_registrations.items()):
- yield AdapterRegistration(self, required, provided, name,
- component, info)
-
- def queryAdapter(self, object, interface, name='', default=None):
- return self.adapters.queryAdapter(object, interface, name, default)
-
- def getAdapter(self, object, interface, name=''):
- adapter = self.adapters.queryAdapter(object, interface, name)
- if adapter is None:
- raise ComponentLookupError(object, interface, name)
- return adapter
-
- def queryMultiAdapter(self, objects, interface, name='',
- default=None):
- return self.adapters.queryMultiAdapter(
- objects, interface, name, default)
-
- def getMultiAdapter(self, objects, interface, name=''):
- adapter = self.adapters.queryMultiAdapter(objects, interface, name)
- if adapter is None:
- raise ComponentLookupError(objects, interface, name)
- return adapter
-
- def getAdapters(self, objects, provided):
- for name, factory in self.adapters.lookupAll(
- list(map(providedBy, objects)),
- provided):
- adapter = factory(*objects)
- if adapter is not None:
- yield name, adapter
-
- def registerSubscriptionAdapter(self,
- factory, required=None, provided=None,
- name='', info='',
- event=True):
- if name:
- raise TypeError("Named subscribers are not yet supported")
- if provided is None:
- provided = _getAdapterProvided(factory)
- required = _getAdapterRequired(factory, required)
- self._subscription_registrations.append(
- (required, provided, name, factory, info)
- )
- self.adapters.subscribe(required, provided, factory)
-
- if event:
- notify(Registered(
- SubscriptionRegistration(self, required, provided, name,
- factory, info)
- ))
-
- def registeredSubscriptionAdapters(self):
- for data in self._subscription_registrations:
- yield SubscriptionRegistration(self, *data)
-
- def unregisterSubscriptionAdapter(self, factory=None,
- required=None, provided=None, name='',
- ):
- if name:
- raise TypeError("Named subscribers are not yet supported")
- if provided is None:
- if factory is None:
- raise TypeError("Must specify one of factory and provided")
- provided = _getAdapterProvided(factory)
-
- if (required is None) and (factory is None):
- raise TypeError("Must specify one of factory and required")
-
- required = _getAdapterRequired(factory, required)
-
- if factory is None:
- new = [(r, p, n, f, i)
- for (r, p, n, f, i)
- in self._subscription_registrations
- if not (r == required and p == provided)
- ]
- else:
- new = [(r, p, n, f, i)
- for (r, p, n, f, i)
- in self._subscription_registrations
- if not (r == required and p == provided and f == factory)
- ]
-
- if len(new) == len(self._subscription_registrations):
- return False
-
-
- self._subscription_registrations[:] = new
- self.adapters.unsubscribe(required, provided, factory)
-
- notify(Unregistered(
- SubscriptionRegistration(self, required, provided, name,
- factory, '')
- ))
-
- return True
-
- def subscribers(self, objects, provided):
- return self.adapters.subscribers(objects, provided)
-
- def registerHandler(self,
- factory, required=None,
- name='', info='',
- event=True):
- if name:
- raise TypeError("Named handlers are not yet supported")
- required = _getAdapterRequired(factory, required)
- self._handler_registrations.append(
- (required, name, factory, info)
- )
- self.adapters.subscribe(required, None, factory)
-
- if event:
- notify(Registered(
- HandlerRegistration(self, required, name, factory, info)
- ))
-
- def registeredHandlers(self):
- for data in self._handler_registrations:
- yield HandlerRegistration(self, *data)
-
- def unregisterHandler(self, factory=None, required=None, name=''):
- if name:
- raise TypeError("Named subscribers are not yet supported")
-
- if (required is None) and (factory is None):
- raise TypeError("Must specify one of factory and required")
-
- required = _getAdapterRequired(factory, required)
-
- if factory is None:
- new = [(r, n, f, i)
- for (r, n, f, i)
- in self._handler_registrations
- if r != required
- ]
- else:
- new = [(r, n, f, i)
- for (r, n, f, i)
- in self._handler_registrations
- if not (r == required and f == factory)
- ]
-
- if len(new) == len(self._handler_registrations):
- return False
-
- self._handler_registrations[:] = new
- self.adapters.unsubscribe(required, None, factory)
-
- notify(Unregistered(
- HandlerRegistration(self, required, name, factory, '')
- ))
-
- return True
-
- def handle(self, *objects):
- self.adapters.subscribers(objects, None)
-
- def rebuildUtilityRegistryFromLocalCache(self, rebuild=False):
- """
- Emergency maintenance method to rebuild the ``.utilities``
- registry from the local copy maintained in this object, or
- detect the need to do so.
-
- Most users will never need to call this, but it can be helpful
- in the event of suspected corruption.
-
- By default, this method only checks for corruption. To make it
- actually rebuild the registry, pass `True` for *rebuild*.
-
- :param bool rebuild: If set to `True` (not the default),
- this method will actually register and subscribe utilities
- in the registry as needed to synchronize with the local cache.
-
- :return: A dictionary that's meant as diagnostic data. The keys
- and values may change over time. When called with a false *rebuild*,
- the keys ``"needed_registered"`` and ``"needed_subscribed"`` will be
- non-zero if any corruption was detected, but that will not be corrected.
-
- .. versionadded:: 5.3.0
- """
- regs = dict(self._utility_registrations)
- utils = self.utilities
- needed_registered = 0
- did_not_register = 0
- needed_subscribed = 0
- did_not_subscribe = 0
-
-
- # Avoid the expensive change process during this; we'll call
- # it once at the end if needed.
- assert 'changed' not in utils.__dict__
- utils.changed = lambda _: None
-
- if rebuild:
- register = utils.register
- subscribe = utils.subscribe
- else:
- register = subscribe = lambda *args: None
-
- try:
- for (provided, name), (value, _info, _factory) in regs.items():
- if utils.registered((), provided, name) != value:
- register((), provided, name, value)
- needed_registered += 1
- else:
- did_not_register += 1
-
- if utils.subscribed((), provided, value) is None:
- needed_subscribed += 1
- subscribe((), provided, value)
- else:
- did_not_subscribe += 1
- finally:
- del utils.changed
- if rebuild and (needed_subscribed or needed_registered):
- utils.changed(utils)
-
- return {
- 'needed_registered': needed_registered,
- 'did_not_register': did_not_register,
- 'needed_subscribed': needed_subscribed,
- 'did_not_subscribe': did_not_subscribe
- }
-
-def _getName(component):
- try:
- return component.__component_name__
- except AttributeError:
- return ''
-
-def _getUtilityProvided(component):
- provided = list(providedBy(component))
- if len(provided) == 1:
- return provided[0]
- raise TypeError(
- "The utility doesn't provide a single interface "
- "and no provided interface was specified.")
-
-def _getAdapterProvided(factory):
- provided = list(implementedBy(factory))
- if len(provided) == 1:
- return provided[0]
- raise TypeError(
- "The adapter factory doesn't implement a single interface "
- "and no provided interface was specified.")
-
-def _getAdapterRequired(factory, required):
- if required is None:
- try:
- required = factory.__component_adapts__
- except AttributeError:
- raise TypeError(
- "The adapter factory doesn't have a __component_adapts__ "
- "attribute and no required specifications were specified"
- )
- elif ISpecification.providedBy(required):
- raise TypeError("the required argument should be a list of "
- "interfaces, not a single interface")
-
- result = []
- for r in required:
- if r is None:
- r = Interface
- elif not ISpecification.providedBy(r):
- if isinstance(r, type):
- r = implementedBy(r)
- else:
- raise TypeError("Required specification must be a "
- "specification or class, not %r" % type(r)
- )
- result.append(r)
- return tuple(result)
-
-
-@implementer(IUtilityRegistration)
-class UtilityRegistration:
-
- def __init__(self, registry, provided, name, component, doc, factory=None):
- (self.registry, self.provided, self.name, self.component, self.info,
- self.factory
- ) = registry, provided, name, component, doc, factory
-
- def __repr__(self):
- return '{}({!r}, {}, {!r}, {}, {!r}, {!r})'.format(
- self.__class__.__name__,
- self.registry,
- getattr(self.provided, '__name__', None), self.name,
- getattr(self.component, '__name__', repr(self.component)),
- self.factory, self.info,
- )
-
- def __hash__(self):
- return id(self)
-
- def __eq__(self, other):
- return repr(self) == repr(other)
-
- def __ne__(self, other):
- return repr(self) != repr(other)
-
- def __lt__(self, other):
- return repr(self) < repr(other)
-
- def __le__(self, other):
- return repr(self) <= repr(other)
-
- def __gt__(self, other):
- return repr(self) > repr(other)
-
- def __ge__(self, other):
- return repr(self) >= repr(other)
-
-@implementer(IAdapterRegistration)
-class AdapterRegistration:
-
- def __init__(self, registry, required, provided, name, component, doc):
- (self.registry, self.required, self.provided, self.name,
- self.factory, self.info
- ) = registry, required, provided, name, component, doc
-
- def __repr__(self):
- return '{}({!r}, {}, {}, {!r}, {}, {!r})'.format(
- self.__class__.__name__,
- self.registry,
- '[' + ", ".join([r.__name__ for r in self.required]) + ']',
- getattr(self.provided, '__name__', None), self.name,
- getattr(self.factory, '__name__', repr(self.factory)), self.info,
- )
-
- def __hash__(self):
- return id(self)
-
- def __eq__(self, other):
- return repr(self) == repr(other)
-
- def __ne__(self, other):
- return repr(self) != repr(other)
-
- def __lt__(self, other):
- return repr(self) < repr(other)
-
- def __le__(self, other):
- return repr(self) <= repr(other)
-
- def __gt__(self, other):
- return repr(self) > repr(other)
-
- def __ge__(self, other):
- return repr(self) >= repr(other)
-
-@implementer_only(ISubscriptionAdapterRegistration)
-class SubscriptionRegistration(AdapterRegistration):
- pass
-
-
-@implementer_only(IHandlerRegistration)
-class HandlerRegistration(AdapterRegistration):
-
- def __init__(self, registry, required, name, handler, doc):
- (self.registry, self.required, self.name, self.handler, self.info
- ) = registry, required, name, handler, doc
-
- @property
- def factory(self):
- return self.handler
-
- provided = None
-
- def __repr__(self):
- return '{}({!r}, {}, {!r}, {}, {!r})'.format(
- self.__class__.__name__,
- self.registry,
- '[' + ", ".join([r.__name__ for r in self.required]) + ']',
- self.name,
- getattr(self.factory, '__name__', repr(self.factory)), self.info,
- )
diff --git a/resources/python/bin/3.7/linux/zope/interface/ro.py b/resources/python/bin/3.7/linux/zope/interface/ro.py
deleted file mode 100644
index 52986483c..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/ro.py
+++ /dev/null
@@ -1,667 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-Compute a resolution order for an object and its bases.
-
-.. versionchanged:: 5.0
- The resolution order is now based on the same C3 order that Python
- uses for classes. In complex instances of multiple inheritance, this
- may result in a different ordering.
-
- In older versions, the ordering wasn't required to be C3 compliant,
- and for backwards compatibility, it still isn't. If the ordering
- isn't C3 compliant (if it is *inconsistent*), zope.interface will
- make a best guess to try to produce a reasonable resolution order.
- Still (just as before), the results in such cases may be
- surprising.
-
-.. rubric:: Environment Variables
-
-Due to the change in 5.0, certain environment variables can be used to control errors
-and warnings about inconsistent resolution orders. They are listed in priority order, with
-variables at the bottom generally overriding variables above them.
-
-ZOPE_INTERFACE_WARN_BAD_IRO
- If this is set to "1", then if there is at least one inconsistent resolution
- order discovered, a warning (:class:`InconsistentResolutionOrderWarning`) will
- be issued. Use the usual warning mechanisms to control this behaviour. The warning
- text will contain additional information on debugging.
-ZOPE_INTERFACE_TRACK_BAD_IRO
- If this is set to "1", then zope.interface will log information about each
- inconsistent resolution order discovered, and keep those details in memory in this module
- for later inspection.
-ZOPE_INTERFACE_STRICT_IRO
- If this is set to "1", any attempt to use :func:`ro` that would produce a non-C3
- ordering will fail by raising :class:`InconsistentResolutionOrderError`.
-
-.. important::
-
- ``ZOPE_INTERFACE_STRICT_IRO`` is intended to become the default in the future.
-
-There are two environment variables that are independent.
-
-ZOPE_INTERFACE_LOG_CHANGED_IRO
- If this is set to "1", then if the C3 resolution order is different from
- the legacy resolution order for any given object, a message explaining the differences
- will be logged. This is intended to be used for debugging complicated IROs.
-ZOPE_INTERFACE_USE_LEGACY_IRO
- If this is set to "1", then the C3 resolution order will *not* be used. The
- legacy IRO will be used instead. This is a temporary measure and will be removed in the
- future. It is intended to help during the transition.
- It implies ``ZOPE_INTERFACE_LOG_CHANGED_IRO``.
-
-.. rubric:: Debugging Behaviour Changes in zope.interface 5
-
-Most behaviour changes from zope.interface 4 to 5 are related to
-inconsistent resolution orders. ``ZOPE_INTERFACE_STRICT_IRO`` is the
-most effective tool to find such inconsistent resolution orders, and
-we recommend running your code with this variable set if at all
-possible. Doing so will ensure that all interface resolution orders
-are consistent, and if they're not, will immediately point the way to
-where this is violated.
-
-Occasionally, however, this may not be enough. This is because in some
-cases, a C3 ordering can be found (the resolution order is fully
-consistent) that is substantially different from the ad-hoc legacy
-ordering. In such cases, you may find that you get an unexpected value
-returned when adapting one or more objects to an interface. To debug
-this, *also* enable ``ZOPE_INTERFACE_LOG_CHANGED_IRO`` and examine the
-output. The main thing to look for is changes in the relative
-positions of interfaces for which there are registered adapters.
-"""
-__docformat__ = 'restructuredtext'
-
-__all__ = [
- 'ro',
- 'InconsistentResolutionOrderError',
- 'InconsistentResolutionOrderWarning',
-]
-
-__logger = None
-
-def _logger():
- global __logger # pylint:disable=global-statement
- if __logger is None:
- import logging
- __logger = logging.getLogger(__name__)
- return __logger
-
-def _legacy_mergeOrderings(orderings):
- """Merge multiple orderings so that within-ordering order is preserved
-
- Orderings are constrained in such a way that if an object appears
- in two or more orderings, then the suffix that begins with the
- object must be in both orderings.
-
- For example:
-
- >>> _mergeOrderings([
- ... ['x', 'y', 'z'],
- ... ['q', 'z'],
- ... [1, 3, 5],
- ... ['z']
- ... ])
- ['x', 'y', 'q', 1, 3, 5, 'z']
-
- """
-
- seen = set()
- result = []
- for ordering in reversed(orderings):
- for o in reversed(ordering):
- if o not in seen:
- seen.add(o)
- result.insert(0, o)
-
- return result
-
-def _legacy_flatten(begin):
- result = [begin]
- i = 0
- for ob in iter(result):
- i += 1
- # The recursive calls can be avoided by inserting the base classes
- # into the dynamically growing list directly after the currently
- # considered object; the iterator makes sure this will keep working
- # in the future, since it cannot rely on the length of the list
- # by definition.
- result[i:i] = ob.__bases__
- return result
-
-def _legacy_ro(ob):
- return _legacy_mergeOrderings([_legacy_flatten(ob)])
-
-###
-# Compare base objects using identity, not equality. This matches what
-# the CPython MRO algorithm does, and is *much* faster to boot: that,
-# plus some other small tweaks makes the difference between 25s and 6s
-# in loading 446 plone/zope interface.py modules (1925 InterfaceClass,
-# 1200 Implements, 1100 ClassProvides objects)
-###
-
-
-class InconsistentResolutionOrderWarning(PendingDeprecationWarning):
- """
- The warning issued when an invalid IRO is requested.
- """
-
-class InconsistentResolutionOrderError(TypeError):
- """
- The error raised when an invalid IRO is requested in strict mode.
- """
-
- def __init__(self, c3, base_tree_remaining):
- self.C = c3.leaf
- base_tree = c3.base_tree
- self.base_ros = {
- base: base_tree[i + 1]
- for i, base in enumerate(self.C.__bases__)
- }
- # Unfortunately, this doesn't necessarily directly match
- # up to any transformation on C.__bases__, because
- # if any were fully used up, they were removed already.
- self.base_tree_remaining = base_tree_remaining
-
- TypeError.__init__(self)
-
- def __str__(self):
- import pprint
- return "{}: For object {!r}.\nBase ROs:\n{}\nConflict Location:\n{}".format(
- self.__class__.__name__,
- self.C,
- pprint.pformat(self.base_ros),
- pprint.pformat(self.base_tree_remaining),
- )
-
-
-class _NamedBool(int): # cannot actually inherit bool
-
- def __new__(cls, val, name):
- inst = super(cls, _NamedBool).__new__(cls, val)
- inst.__name__ = name
- return inst
-
-
-class _ClassBoolFromEnv:
- """
- Non-data descriptor that reads a transformed environment variable
- as a boolean, and caches the result in the class.
- """
-
- def __get__(self, inst, klass):
- import os
- for cls in klass.__mro__:
- my_name = None
- for k in dir(klass):
- if k in cls.__dict__ and cls.__dict__[k] is self:
- my_name = k
- break
- if my_name is not None:
- break
- else: # pragma: no cover
- raise RuntimeError("Unable to find self")
-
- env_name = 'ZOPE_INTERFACE_' + my_name
- val = os.environ.get(env_name, '') == '1'
- val = _NamedBool(val, my_name)
- setattr(klass, my_name, val)
- setattr(klass, 'ORIG_' + my_name, self)
- return val
-
-
-class _StaticMRO:
- # A previously resolved MRO, supplied by the caller.
- # Used in place of calculating it.
-
- had_inconsistency = None # We don't know...
-
- def __init__(self, C, mro):
- self.leaf = C
- self.__mro = tuple(mro)
-
- def mro(self):
- return list(self.__mro)
-
-
-class C3:
- # Holds the shared state during computation of an MRO.
-
- @staticmethod
- def resolver(C, strict, base_mros):
- strict = strict if strict is not None else C3.STRICT_IRO
- factory = C3
- if strict:
- factory = _StrictC3
- elif C3.TRACK_BAD_IRO:
- factory = _TrackingC3
-
- memo = {}
- base_mros = base_mros or {}
- for base, mro in base_mros.items():
- assert base in C.__bases__
- memo[base] = _StaticMRO(base, mro)
-
- return factory(C, memo)
-
- __mro = None
- __legacy_ro = None
- direct_inconsistency = False
-
- def __init__(self, C, memo):
- self.leaf = C
- self.memo = memo
- kind = self.__class__
-
- base_resolvers = []
- for base in C.__bases__:
- if base not in memo:
- resolver = kind(base, memo)
- memo[base] = resolver
- base_resolvers.append(memo[base])
-
- self.base_tree = [
- [C]
- ] + [
- memo[base].mro() for base in C.__bases__
- ] + [
- list(C.__bases__)
- ]
-
- self.bases_had_inconsistency = any(base.had_inconsistency for base in base_resolvers)
-
- if len(C.__bases__) == 1:
- self.__mro = [C] + memo[C.__bases__[0]].mro()
-
- @property
- def had_inconsistency(self):
- return self.direct_inconsistency or self.bases_had_inconsistency
-
- @property
- def legacy_ro(self):
- if self.__legacy_ro is None:
- self.__legacy_ro = tuple(_legacy_ro(self.leaf))
- return list(self.__legacy_ro)
-
- TRACK_BAD_IRO = _ClassBoolFromEnv()
- STRICT_IRO = _ClassBoolFromEnv()
- WARN_BAD_IRO = _ClassBoolFromEnv()
- LOG_CHANGED_IRO = _ClassBoolFromEnv()
- USE_LEGACY_IRO = _ClassBoolFromEnv()
- BAD_IROS = ()
-
- def _warn_iro(self):
- if not self.WARN_BAD_IRO:
- # For the initial release, one must opt-in to see the warning.
- # In the future (2021?) seeing at least the first warning will
- # be the default
- return
- import warnings
- warnings.warn(
- "An inconsistent resolution order is being requested. "
- "(Interfaces should follow the Python class rules known as C3.) "
- "For backwards compatibility, zope.interface will allow this, "
- "making the best guess it can to produce as meaningful an order as possible. "
- "In the future this might be an error. Set the warning filter to error, or set "
- "the environment variable 'ZOPE_INTERFACE_TRACK_BAD_IRO' to '1' and examine "
- "ro.C3.BAD_IROS to debug, or set 'ZOPE_INTERFACE_STRICT_IRO' to raise exceptions.",
- InconsistentResolutionOrderWarning,
- )
-
- @staticmethod
- def _can_choose_base(base, base_tree_remaining):
- # From C3:
- # nothead = [s for s in nonemptyseqs if cand in s[1:]]
- for bases in base_tree_remaining:
- if not bases or bases[0] is base:
- continue
-
- for b in bases:
- if b is base:
- return False
- return True
-
- @staticmethod
- def _nonempty_bases_ignoring(base_tree, ignoring):
- return list(filter(None, [
- [b for b in bases if b is not ignoring]
- for bases
- in base_tree
- ]))
-
- def _choose_next_base(self, base_tree_remaining):
- """
- Return the next base.
-
- The return value will either fit the C3 constraints or be our best
- guess about what to do. If we cannot guess, this may raise an exception.
- """
- base = self._find_next_C3_base(base_tree_remaining)
- if base is not None:
- return base
- return self._guess_next_base(base_tree_remaining)
-
- def _find_next_C3_base(self, base_tree_remaining):
- """
- Return the next base that fits the constraints, or ``None`` if there isn't one.
- """
- for bases in base_tree_remaining:
- base = bases[0]
- if self._can_choose_base(base, base_tree_remaining):
- return base
- return None
-
- class _UseLegacyRO(Exception):
- pass
-
- def _guess_next_base(self, base_tree_remaining):
- # Narf. We may have an inconsistent order (we won't know for
- # sure until we check all the bases). Python cannot create
- # classes like this:
- #
- # class B1:
- # pass
- # class B2(B1):
- # pass
- # class C(B1, B2): # -> TypeError; this is like saying C(B1, B2, B1).
- # pass
- #
- # However, older versions of zope.interface were fine with this order.
- # A good example is ``providedBy(IOError())``. Because of the way
- # ``classImplements`` works, it winds up with ``__bases__`` ==
- # ``[IEnvironmentError, IIOError, IOSError, ]``
- # (on Python 3). But ``IEnvironmentError`` is a base of both ``IIOError``
- # and ``IOSError``. Previously, we would get a resolution order of
- # ``[IIOError, IOSError, IEnvironmentError, IStandardError, IException, Interface]``
- # but the standard Python algorithm would forbid creating that order entirely.
-
- # Unlike Python's MRO, we attempt to resolve the issue. A few
- # heuristics have been tried. One was:
- #
- # Strip off the first (highest priority) base of each direct
- # base one at a time and seeing if we can come to an agreement
- # with the other bases. (We're trying for a partial ordering
- # here.) This often resolves cases (such as the IOSError case
- # above), and frequently produces the same ordering as the
- # legacy MRO did. If we looked at all the highest priority
- # bases and couldn't find any partial ordering, then we strip
- # them *all* out and begin the C3 step again. We take care not
- # to promote a common root over all others.
- #
- # If we only did the first part, stripped off the first
- # element of the first item, we could resolve simple cases.
- # But it tended to fail badly. If we did the whole thing, it
- # could be extremely painful from a performance perspective
- # for deep/wide things like Zope's OFS.SimpleItem.Item. Plus,
- # anytime you get ExtensionClass.Base into the mix, you're
- # likely to wind up in trouble, because it messes with the MRO
- # of classes. Sigh.
- #
- # So now, we fall back to the old linearization (fast to compute).
- self._warn_iro()
- self.direct_inconsistency = InconsistentResolutionOrderError(self, base_tree_remaining)
- raise self._UseLegacyRO
-
- def _merge(self):
- # Returns a merged *list*.
- result = self.__mro = []
- base_tree_remaining = self.base_tree
- base = None
- while 1:
- # Take last picked base out of the base tree wherever it is.
- # This differs slightly from the standard Python MRO and is needed
- # because we have no other step that prevents duplicates
- # from coming in (e.g., in the inconsistent fallback path)
- base_tree_remaining = self._nonempty_bases_ignoring(base_tree_remaining, base)
-
- if not base_tree_remaining:
- return result
- try:
- base = self._choose_next_base(base_tree_remaining)
- except self._UseLegacyRO:
- self.__mro = self.legacy_ro
- return self.legacy_ro
-
- result.append(base)
-
- def mro(self):
- if self.__mro is None:
- self.__mro = tuple(self._merge())
- return list(self.__mro)
-
-
-class _StrictC3(C3):
- __slots__ = ()
- def _guess_next_base(self, base_tree_remaining):
- raise InconsistentResolutionOrderError(self, base_tree_remaining)
-
-
-class _TrackingC3(C3):
- __slots__ = ()
- def _guess_next_base(self, base_tree_remaining):
- import traceback
- bad_iros = C3.BAD_IROS
- if self.leaf not in bad_iros:
- if bad_iros == ():
- import weakref
-
- # This is a race condition, but it doesn't matter much.
- bad_iros = C3.BAD_IROS = weakref.WeakKeyDictionary()
- bad_iros[self.leaf] = t = (
- InconsistentResolutionOrderError(self, base_tree_remaining),
- traceback.format_stack()
- )
- _logger().warning("Tracking inconsistent IRO: %s", t[0])
- return C3._guess_next_base(self, base_tree_remaining)
-
-
-class _ROComparison:
- # Exists to compute and print a pretty string comparison
- # for differing ROs.
- # Since we're used in a logging context, and may actually never be printed,
- # this is a class so we can defer computing the diff until asked.
-
- # Components we use to build up the comparison report
- class Item:
- prefix = ' '
- def __init__(self, item):
- self.item = item
- def __str__(self):
- return "{}{}".format(
- self.prefix,
- self.item,
- )
-
- class Deleted(Item):
- prefix = '- '
-
- class Inserted(Item):
- prefix = '+ '
-
- Empty = str
-
- class ReplacedBy: # pragma: no cover
- prefix = '- '
- suffix = ''
- def __init__(self, chunk, total_count):
- self.chunk = chunk
- self.total_count = total_count
-
- def __iter__(self):
- lines = [
- self.prefix + str(item) + self.suffix
- for item in self.chunk
- ]
- while len(lines) < self.total_count:
- lines.append('')
-
- return iter(lines)
-
- class Replacing(ReplacedBy):
- prefix = "+ "
- suffix = ''
-
-
- _c3_report = None
- _legacy_report = None
-
- def __init__(self, c3, c3_ro, legacy_ro):
- self.c3 = c3
- self.c3_ro = c3_ro
- self.legacy_ro = legacy_ro
-
- def __move(self, from_, to_, chunk, operation):
- for x in chunk:
- to_.append(operation(x))
- from_.append(self.Empty())
-
- def _generate_report(self):
- if self._c3_report is None:
- import difflib
-
- # The opcodes we get describe how to turn 'a' into 'b'. So
- # the old one (legacy) needs to be first ('a')
- matcher = difflib.SequenceMatcher(None, self.legacy_ro, self.c3_ro)
- # The reports are equal length sequences. We're going for a
- # side-by-side diff.
- self._c3_report = c3_report = []
- self._legacy_report = legacy_report = []
- for opcode, leg1, leg2, c31, c32 in matcher.get_opcodes():
- c3_chunk = self.c3_ro[c31:c32]
- legacy_chunk = self.legacy_ro[leg1:leg2]
-
- if opcode == 'equal':
- # Guaranteed same length
- c3_report.extend(self.Item(x) for x in c3_chunk)
- legacy_report.extend(self.Item(x) for x in legacy_chunk)
- if opcode == 'delete':
- # Guaranteed same length
- assert not c3_chunk
- self.__move(c3_report, legacy_report, legacy_chunk, self.Deleted)
- if opcode == 'insert':
- # Guaranteed same length
- assert not legacy_chunk
- self.__move(legacy_report, c3_report, c3_chunk, self.Inserted)
- if opcode == 'replace': # pragma: no cover (How do you make it output this?)
- # Either side could be longer.
- chunk_size = max(len(c3_chunk), len(legacy_chunk))
- c3_report.extend(self.Replacing(c3_chunk, chunk_size))
- legacy_report.extend(self.ReplacedBy(legacy_chunk, chunk_size))
-
- return self._c3_report, self._legacy_report
-
- @property
- def _inconsistent_label(self):
- inconsistent = []
- if self.c3.direct_inconsistency:
- inconsistent.append('direct')
- if self.c3.bases_had_inconsistency:
- inconsistent.append('bases')
- return '+'.join(inconsistent) if inconsistent else 'no'
-
- def __str__(self):
- c3_report, legacy_report = self._generate_report()
- assert len(c3_report) == len(legacy_report)
-
- left_lines = [str(x) for x in legacy_report]
- right_lines = [str(x) for x in c3_report]
-
- # We have the same number of lines in the report; this is not
- # necessarily the same as the number of items in either RO.
- assert len(left_lines) == len(right_lines)
-
- padding = ' ' * 2
- max_left = max(len(x) for x in left_lines)
- max_right = max(len(x) for x in right_lines)
-
- left_title = 'Legacy RO (len={})'.format(len(self.legacy_ro))
-
- right_title = 'C3 RO (len={}; inconsistent={})'.format(
- len(self.c3_ro),
- self._inconsistent_label,
- )
- lines = [
- (padding + left_title.ljust(max_left) + padding + right_title.ljust(max_right)),
- padding + '=' * (max_left + len(padding) + max_right)
- ]
- lines += [
- padding + left.ljust(max_left) + padding + right
- for left, right in zip(left_lines, right_lines)
- ]
-
- return '\n'.join(lines)
-
-
-# Set to `Interface` once it is defined. This is used to
-# avoid logging false positives about changed ROs.
-_ROOT = None
-
-def ro(C, strict=None, base_mros=None, log_changed_ro=None, use_legacy_ro=None):
- """
- ro(C) -> list
-
- Compute the precedence list (mro) according to C3.
-
- :return: A fresh `list` object.
-
- .. versionchanged:: 5.0.0
- Add the *strict*, *log_changed_ro* and *use_legacy_ro*
- keyword arguments. These are provisional and likely to be
- removed in the future. They are most useful for testing.
- """
- # The ``base_mros`` argument is for internal optimization and
- # not documented.
- resolver = C3.resolver(C, strict, base_mros)
- mro = resolver.mro()
-
- log_changed = log_changed_ro if log_changed_ro is not None else resolver.LOG_CHANGED_IRO
- use_legacy = use_legacy_ro if use_legacy_ro is not None else resolver.USE_LEGACY_IRO
-
- if log_changed or use_legacy:
- legacy_ro = resolver.legacy_ro
- assert isinstance(legacy_ro, list)
- assert isinstance(mro, list)
- changed = legacy_ro != mro
- if changed:
- # Did only Interface move? The fix for issue #8 made that
- # somewhat common. It's almost certainly not a problem, though,
- # so allow ignoring it.
- legacy_without_root = [x for x in legacy_ro if x is not _ROOT]
- mro_without_root = [x for x in mro if x is not _ROOT]
- changed = legacy_without_root != mro_without_root
-
- if changed:
- comparison = _ROComparison(resolver, mro, legacy_ro)
- _logger().warning(
- "Object %r has different legacy and C3 MROs:\n%s",
- C, comparison
- )
- if resolver.had_inconsistency and legacy_ro == mro:
- comparison = _ROComparison(resolver, mro, legacy_ro)
- _logger().warning(
- "Object %r had inconsistent IRO and used the legacy RO:\n%s"
- "\nInconsistency entered at:\n%s",
- C, comparison, resolver.direct_inconsistency
- )
- if use_legacy:
- return legacy_ro
-
- return mro
-
-
-def is_consistent(C):
- """
- Check if the resolution order for *C*, as computed by :func:`ro`, is consistent
- according to C3.
- """
- return not C3.resolver(C, False, None).had_inconsistency
diff --git a/resources/python/bin/3.7/linux/zope/interface/verify.py b/resources/python/bin/3.7/linux/zope/interface/verify.py
deleted file mode 100644
index 0894d2d2f..000000000
--- a/resources/python/bin/3.7/linux/zope/interface/verify.py
+++ /dev/null
@@ -1,187 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Verify interface implementations
-"""
-import inspect
-import sys
-from types import FunctionType
-from types import MethodType
-
-from zope.interface.exceptions import BrokenImplementation
-from zope.interface.exceptions import BrokenMethodImplementation
-from zope.interface.exceptions import DoesNotImplement
-from zope.interface.exceptions import Invalid
-from zope.interface.exceptions import MultipleInvalid
-from zope.interface.interface import Method
-from zope.interface.interface import fromFunction
-from zope.interface.interface import fromMethod
-
-
-__all__ = [
- 'verifyObject',
- 'verifyClass',
-]
-
-# This will be monkey-patched when running under Zope 2, so leave this
-# here:
-MethodTypes = (MethodType, )
-
-
-def _verify(iface, candidate, tentative=False, vtype=None):
- """
- Verify that *candidate* might correctly provide *iface*.
-
- This involves:
-
- - Making sure the candidate claims that it provides the
- interface using ``iface.providedBy`` (unless *tentative* is `True`,
- in which case this step is skipped). This means that the candidate's class
- declares that it `implements ` the interface,
- or the candidate itself declares that it `provides `
- the interface
-
- - Making sure the candidate defines all the necessary methods
-
- - Making sure the methods have the correct signature (to the
- extent possible)
-
- - Making sure the candidate defines all the necessary attributes
-
- :return bool: Returns a true value if everything that could be
- checked passed.
- :raises zope.interface.Invalid: If any of the previous
- conditions does not hold.
-
- .. versionchanged:: 5.0
- If multiple methods or attributes are invalid, all such errors
- are collected and reported. Previously, only the first error was reported.
- As a special case, if only one such error is present, it is raised
- alone, like before.
- """
-
- if vtype == 'c':
- tester = iface.implementedBy
- else:
- tester = iface.providedBy
-
- excs = []
- if not tentative and not tester(candidate):
- excs.append(DoesNotImplement(iface, candidate))
-
- for name, desc in iface.namesAndDescriptions(all=True):
- try:
- _verify_element(iface, name, desc, candidate, vtype)
- except Invalid as e:
- excs.append(e)
-
- if excs:
- if len(excs) == 1:
- raise excs[0]
- raise MultipleInvalid(iface, candidate, excs)
-
- return True
-
-def _verify_element(iface, name, desc, candidate, vtype):
- # Here the `desc` is either an `Attribute` or `Method` instance
- try:
- attr = getattr(candidate, name)
- except AttributeError:
- if (not isinstance(desc, Method)) and vtype == 'c':
- # We can't verify non-methods on classes, since the
- # class may provide attrs in it's __init__.
- return
- # TODO: This should use ``raise...from``
- raise BrokenImplementation(iface, desc, candidate)
-
- if not isinstance(desc, Method):
- # If it's not a method, there's nothing else we can test
- return
-
- if inspect.ismethoddescriptor(attr) or inspect.isbuiltin(attr):
- # The first case is what you get for things like ``dict.pop``
- # on CPython (e.g., ``verifyClass(IFullMapping, dict))``). The
- # second case is what you get for things like ``dict().pop`` on
- # CPython (e.g., ``verifyObject(IFullMapping, dict()))``.
- # In neither case can we get a signature, so there's nothing
- # to verify. Even the inspect module gives up and raises
- # ValueError: no signature found. The ``__text_signature__`` attribute
- # isn't typically populated either.
- #
- # Note that on PyPy 2 or 3 (up through 7.3 at least), these are
- # not true for things like ``dict.pop`` (but might be true for C extensions?)
- return
-
- if isinstance(attr, FunctionType):
- if isinstance(candidate, type) and vtype == 'c':
- # This is an "unbound method".
- # Only unwrap this if we're verifying implementedBy;
- # otherwise we can unwrap @staticmethod on classes that directly
- # provide an interface.
- meth = fromFunction(attr, iface, name=name, imlevel=1)
- else:
- # Nope, just a normal function
- meth = fromFunction(attr, iface, name=name)
- elif (isinstance(attr, MethodTypes)
- and type(attr.__func__) is FunctionType):
- meth = fromMethod(attr, iface, name)
- elif isinstance(attr, property) and vtype == 'c':
- # Without an instance we cannot be sure it's not a
- # callable.
- # TODO: This should probably check inspect.isdatadescriptor(),
- # a more general form than ``property``
- return
-
- else:
- if not callable(attr):
- raise BrokenMethodImplementation(desc, "implementation is not a method",
- attr, iface, candidate)
- # sigh, it's callable, but we don't know how to introspect it, so
- # we have to give it a pass.
- return
-
- # Make sure that the required and implemented method signatures are
- # the same.
- mess = _incompat(desc.getSignatureInfo(), meth.getSignatureInfo())
- if mess:
- raise BrokenMethodImplementation(desc, mess, attr, iface, candidate)
-
-
-
-def verifyClass(iface, candidate, tentative=False):
- """
- Verify that the *candidate* might correctly provide *iface*.
- """
- return _verify(iface, candidate, tentative, vtype='c')
-
-def verifyObject(iface, candidate, tentative=False):
- return _verify(iface, candidate, tentative, vtype='o')
-
-verifyObject.__doc__ = _verify.__doc__
-
-_MSG_TOO_MANY = 'implementation requires too many arguments'
-
-def _incompat(required, implemented):
- #if (required['positional'] !=
- # implemented['positional'][:len(required['positional'])]
- # and implemented['kwargs'] is None):
- # return 'imlementation has different argument names'
- if len(implemented['required']) > len(required['required']):
- return _MSG_TOO_MANY
- if ((len(implemented['positional']) < len(required['positional']))
- and not implemented['varargs']):
- return "implementation doesn't allow enough arguments"
- if required['kwargs'] and not implemented['kwargs']:
- return "implementation doesn't support keyword arguments"
- if required['varargs'] and not implemented['varargs']:
- return "implementation doesn't support variable arguments"
diff --git a/resources/python/bin/3.7/mac/_cffi_backend.cpython-37m-darwin.so b/resources/python/bin/3.7/mac/_cffi_backend.cpython-37m-darwin.so
deleted file mode 100755
index 3ed2d7147..000000000
Binary files a/resources/python/bin/3.7/mac/_cffi_backend.cpython-37m-darwin.so and /dev/null differ
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/INSTALLER b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/LICENSE b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/LICENSE
deleted file mode 100644
index 29225eee9..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-
-Except when otherwise stated (look for LICENSE files in directories or
-information at the beginning of each file) all software and
-documentation is licensed as follows:
-
- The MIT License
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/METADATA b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/METADATA
deleted file mode 100644
index 538e67914..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/METADATA
+++ /dev/null
@@ -1,34 +0,0 @@
-Metadata-Version: 2.1
-Name: cffi
-Version: 1.15.1
-Summary: Foreign Function Interface for Python calling C code.
-Home-page: http://cffi.readthedocs.org
-Author: Armin Rigo, Maciej Fijalkowski
-Author-email: python-cffi@googlegroups.com
-License: MIT
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: License :: OSI Approved :: MIT License
-License-File: LICENSE
-Requires-Dist: pycparser
-
-
-CFFI
-====
-
-Foreign Function Interface for Python calling C code.
-Please see the `Documentation `_.
-
-Contact
--------
-
-`Mailing list `_
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/RECORD b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/RECORD
deleted file mode 100644
index e7eb022ad..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/RECORD
+++ /dev/null
@@ -1,45 +0,0 @@
-_cffi_backend.cpython-37m-darwin.so,sha256=OUrCk4lE63r1qjb--21arFxXz21VBPvMJg1LOzt8cyg,218744
-cffi-1.15.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-cffi-1.15.1.dist-info/LICENSE,sha256=BLgPWwd7vtaICM_rreteNSPyqMmpZJXFh72W3x6sKjM,1294
-cffi-1.15.1.dist-info/METADATA,sha256=KP4G3WmavRgDGwD2b8Y_eDsM1YeV6ckcG6Alz3-D8VY,1144
-cffi-1.15.1.dist-info/RECORD,,
-cffi-1.15.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cffi-1.15.1.dist-info/WHEEL,sha256=t-yJnV7ncEuoOkGIUUhH14bb9iMbJ4DANdZCkJ-k_2s,110
-cffi-1.15.1.dist-info/entry_points.txt,sha256=y6jTxnyeuLnL-XJcDv8uML3n6wyYiGRg8MTp_QGJ9Ho,75
-cffi-1.15.1.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19
-cffi/__init__.py,sha256=6xB_tafGvhhM5Xvj0Ova3oPC2SEhVlLTEObVLnazeiM,513
-cffi/__pycache__/__init__.cpython-37.pyc,,
-cffi/__pycache__/api.cpython-37.pyc,,
-cffi/__pycache__/backend_ctypes.cpython-37.pyc,,
-cffi/__pycache__/cffi_opcode.cpython-37.pyc,,
-cffi/__pycache__/commontypes.cpython-37.pyc,,
-cffi/__pycache__/cparser.cpython-37.pyc,,
-cffi/__pycache__/error.cpython-37.pyc,,
-cffi/__pycache__/ffiplatform.cpython-37.pyc,,
-cffi/__pycache__/lock.cpython-37.pyc,,
-cffi/__pycache__/model.cpython-37.pyc,,
-cffi/__pycache__/pkgconfig.cpython-37.pyc,,
-cffi/__pycache__/recompiler.cpython-37.pyc,,
-cffi/__pycache__/setuptools_ext.cpython-37.pyc,,
-cffi/__pycache__/vengine_cpy.cpython-37.pyc,,
-cffi/__pycache__/vengine_gen.cpython-37.pyc,,
-cffi/__pycache__/verifier.cpython-37.pyc,,
-cffi/_cffi_errors.h,sha256=zQXt7uR_m8gUW-fI2hJg0KoSkJFwXv8RGUkEDZ177dQ,3908
-cffi/_cffi_include.h,sha256=tKnA1rdSoPHp23FnDL1mDGwFo-Uj6fXfA6vA6kcoEUc,14800
-cffi/_embedding.h,sha256=9tnjF44QRobR8z0FGqAmAZY-wMSBOae1SUPqHccowqc,17680
-cffi/api.py,sha256=yxJalIePbr1mz_WxAHokSwyP5CVYde44m-nolHnbJNo,42064
-cffi/backend_ctypes.py,sha256=h5ZIzLc6BFVXnGyc9xPqZWUS7qGy7yFSDqXe68Sa8z4,42454
-cffi/cffi_opcode.py,sha256=v9RdD_ovA8rCtqsC95Ivki5V667rAOhGgs3fb2q9xpM,5724
-cffi/commontypes.py,sha256=QS4uxCDI7JhtTyjh1hlnCA-gynmaszWxJaRRLGkJa1A,2689
-cffi/cparser.py,sha256=rO_1pELRw1gI1DE1m4gi2ik5JMfpxouAACLXpRPlVEA,44231
-cffi/error.py,sha256=v6xTiS4U0kvDcy4h_BDRo5v39ZQuj-IMRYLv5ETddZs,877
-cffi/ffiplatform.py,sha256=HMXqR8ks2wtdsNxGaWpQ_PyqIvtiuos_vf1qKCy-cwg,4046
-cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747
-cffi/model.py,sha256=_GH_UF1Rn9vC4AvmgJm6qj7RUXXG3eqKPc8bPxxyBKE,21768
-cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976
-cffi/pkgconfig.py,sha256=LP1w7vmWvmKwyqLaU1Z243FOWGNQMrgMUZrvgFuOlco,4374
-cffi/recompiler.py,sha256=YgVYTh2CrXIobo-vMk7_K9mwAXdd_LqB4-IbYABQ488,64598
-cffi/setuptools_ext.py,sha256=RUR17N5f8gpiQBBlXL34P9FtOu1mhHIaAf3WJlg5S4I,8931
-cffi/vengine_cpy.py,sha256=YglN8YS-UaHEv2k2cxgotNWE87dHX20-68EyKoiKUYA,43320
-cffi/vengine_gen.py,sha256=5dX7s1DU6pTBOMI6oTVn_8Bnmru_lj932B6b4v29Hlg,26684
-cffi/verifier.py,sha256=ESwuXWXtXrKEagCKveLRDjFzLNCyaKdqAgAlKREcyhY,11253
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/REQUESTED b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/REQUESTED
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/WHEEL b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/WHEEL
deleted file mode 100644
index 1f2fa4a0d..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.1)
-Root-Is-Purelib: false
-Tag: cp37-cp37m-macosx_10_9_x86_64
-
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/entry_points.txt b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/entry_points.txt
deleted file mode 100644
index 4b0274f23..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/entry_points.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-[distutils.setup_keywords]
-cffi_modules = cffi.setuptools_ext:cffi_modules
diff --git a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/top_level.txt b/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/top_level.txt
deleted file mode 100644
index f64577957..000000000
--- a/resources/python/bin/3.7/mac/cffi-1.15.1.dist-info/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-_cffi_backend
-cffi
diff --git a/resources/python/bin/3.7/mac/cffi/__init__.py b/resources/python/bin/3.7/mac/cffi/__init__.py
deleted file mode 100644
index 90e2e6559..000000000
--- a/resources/python/bin/3.7/mac/cffi/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError',
- 'FFIError']
-
-from .api import FFI
-from .error import CDefError, FFIError, VerificationError, VerificationMissing
-from .error import PkgConfigError
-
-__version__ = "1.15.1"
-__version_info__ = (1, 15, 1)
-
-# The verifier module file names are based on the CRC32 of a string that
-# contains the following version number. It may be older than __version__
-# if nothing is clearly incompatible.
-__version_verifier_modules__ = "0.8.6"
diff --git a/resources/python/bin/3.7/mac/cffi/_cffi_errors.h b/resources/python/bin/3.7/mac/cffi/_cffi_errors.h
deleted file mode 100644
index 158e05903..000000000
--- a/resources/python/bin/3.7/mac/cffi/_cffi_errors.h
+++ /dev/null
@@ -1,149 +0,0 @@
-#ifndef CFFI_MESSAGEBOX
-# ifdef _MSC_VER
-# define CFFI_MESSAGEBOX 1
-# else
-# define CFFI_MESSAGEBOX 0
-# endif
-#endif
-
-
-#if CFFI_MESSAGEBOX
-/* Windows only: logic to take the Python-CFFI embedding logic
- initialization errors and display them in a background thread
- with MessageBox. The idea is that if the whole program closes
- as a result of this problem, then likely it is already a console
- program and you can read the stderr output in the console too.
- If it is not a console program, then it will likely show its own
- dialog to complain, or generally not abruptly close, and for this
- case the background thread should stay alive.
-*/
-static void *volatile _cffi_bootstrap_text;
-
-static PyObject *_cffi_start_error_capture(void)
-{
- PyObject *result = NULL;
- PyObject *x, *m, *bi;
-
- if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text,
- (void *)1, NULL) != NULL)
- return (PyObject *)1;
-
- m = PyImport_AddModule("_cffi_error_capture");
- if (m == NULL)
- goto error;
-
- result = PyModule_GetDict(m);
- if (result == NULL)
- goto error;
-
-#if PY_MAJOR_VERSION >= 3
- bi = PyImport_ImportModule("builtins");
-#else
- bi = PyImport_ImportModule("__builtin__");
-#endif
- if (bi == NULL)
- goto error;
- PyDict_SetItemString(result, "__builtins__", bi);
- Py_DECREF(bi);
-
- x = PyRun_String(
- "import sys\n"
- "class FileLike:\n"
- " def write(self, x):\n"
- " try:\n"
- " of.write(x)\n"
- " except: pass\n"
- " self.buf += x\n"
- " def flush(self):\n"
- " pass\n"
- "fl = FileLike()\n"
- "fl.buf = ''\n"
- "of = sys.stderr\n"
- "sys.stderr = fl\n"
- "def done():\n"
- " sys.stderr = of\n"
- " return fl.buf\n", /* make sure the returned value stays alive */
- Py_file_input,
- result, result);
- Py_XDECREF(x);
-
- error:
- if (PyErr_Occurred())
- {
- PyErr_WriteUnraisable(Py_None);
- PyErr_Clear();
- }
- return result;
-}
-
-#pragma comment(lib, "user32.lib")
-
-static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored)
-{
- Sleep(666); /* may be interrupted if the whole process is closing */
-#if PY_MAJOR_VERSION >= 3
- MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text,
- L"Python-CFFI error",
- MB_OK | MB_ICONERROR);
-#else
- MessageBoxA(NULL, (char *)_cffi_bootstrap_text,
- "Python-CFFI error",
- MB_OK | MB_ICONERROR);
-#endif
- _cffi_bootstrap_text = NULL;
- return 0;
-}
-
-static void _cffi_stop_error_capture(PyObject *ecap)
-{
- PyObject *s;
- void *text;
-
- if (ecap == (PyObject *)1)
- return;
-
- if (ecap == NULL)
- goto error;
-
- s = PyRun_String("done()", Py_eval_input, ecap, ecap);
- if (s == NULL)
- goto error;
-
- /* Show a dialog box, but in a background thread, and
- never show multiple dialog boxes at once. */
-#if PY_MAJOR_VERSION >= 3
- text = PyUnicode_AsWideCharString(s, NULL);
-#else
- text = PyString_AsString(s);
-#endif
-
- _cffi_bootstrap_text = text;
-
- if (text != NULL)
- {
- HANDLE h;
- h = CreateThread(NULL, 0, _cffi_bootstrap_dialog,
- NULL, 0, NULL);
- if (h != NULL)
- CloseHandle(h);
- }
- /* decref the string, but it should stay alive as 'fl.buf'
- in the small module above. It will really be freed only if
- we later get another similar error. So it's a leak of at
- most one copy of the small module. That's fine for this
- situation which is usually a "fatal error" anyway. */
- Py_DECREF(s);
- PyErr_Clear();
- return;
-
- error:
- _cffi_bootstrap_text = NULL;
- PyErr_Clear();
-}
-
-#else
-
-static PyObject *_cffi_start_error_capture(void) { return NULL; }
-static void _cffi_stop_error_capture(PyObject *ecap) { }
-
-#endif
diff --git a/resources/python/bin/3.7/mac/cffi/_cffi_include.h b/resources/python/bin/3.7/mac/cffi/_cffi_include.h
deleted file mode 100644
index e4c0a6724..000000000
--- a/resources/python/bin/3.7/mac/cffi/_cffi_include.h
+++ /dev/null
@@ -1,385 +0,0 @@
-#define _CFFI_
-
-/* We try to define Py_LIMITED_API before including Python.h.
-
- Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and
- Py_REF_DEBUG are not defined. This is a best-effort approximation:
- we can learn about Py_DEBUG from pyconfig.h, but it is unclear if
- the same works for the other two macros. Py_DEBUG implies them,
- but not the other way around.
-
- The implementation is messy (issue #350): on Windows, with _MSC_VER,
- we have to define Py_LIMITED_API even before including pyconfig.h.
- In that case, we guess what pyconfig.h will do to the macros above,
- and check our guess after the #include.
-
- Note that on Windows, with CPython 3.x, you need >= 3.5 and virtualenv
- version >= 16.0.0. With older versions of either, you don't get a
- copy of PYTHON3.DLL in the virtualenv. We can't check the version of
- CPython *before* we even include pyconfig.h. ffi.set_source() puts
- a ``#define _CFFI_NO_LIMITED_API'' at the start of this file if it is
- running on Windows < 3.5, as an attempt at fixing it, but that's
- arguably wrong because it may not be the target version of Python.
- Still better than nothing I guess. As another workaround, you can
- remove the definition of Py_LIMITED_API here.
-
- See also 'py_limited_api' in cffi/setuptools_ext.py.
-*/
-#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API)
-# ifdef _MSC_VER
-# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
-# endif
-# include
- /* sanity-check: Py_LIMITED_API will cause crashes if any of these
- are also defined. Normally, the Python file PC/pyconfig.h does not
- cause any of these to be defined, with the exception that _DEBUG
- causes Py_DEBUG. Double-check that. */
-# ifdef Py_LIMITED_API
-# if defined(Py_DEBUG)
-# error "pyconfig.h unexpectedly defines Py_DEBUG, but Py_LIMITED_API is set"
-# endif
-# if defined(Py_TRACE_REFS)
-# error "pyconfig.h unexpectedly defines Py_TRACE_REFS, but Py_LIMITED_API is set"
-# endif
-# if defined(Py_REF_DEBUG)
-# error "pyconfig.h unexpectedly defines Py_REF_DEBUG, but Py_LIMITED_API is set"
-# endif
-# endif
-# else
-# include
-# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API)
-# define Py_LIMITED_API
-# endif
-# endif
-#endif
-
-#include
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include
-#include "parse_c_type.h"
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-
-#ifdef __GNUC__
-# define _CFFI_UNUSED_FN __attribute__((unused))
-#else
-# define _CFFI_UNUSED_FN /* nothing */
-#endif
-
-#ifdef __cplusplus
-# ifndef _Bool
- typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */
-# endif
-#endif
-
-/********** CPython-specific section **********/
-#ifndef PYPY_VERSION
-
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
-#define _cffi_from_c_double PyFloat_FromDouble
-#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
-#define _cffi_from_c_ulong PyLong_FromUnsignedLong
-#define _cffi_from_c_longlong PyLong_FromLongLong
-#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
-#define _cffi_from_c__Bool PyBool_FromLong
-
-#define _cffi_to_c_double PyFloat_AsDouble
-#define _cffi_to_c_float PyFloat_AsDouble
-
-#define _cffi_from_c_int(x, type) \
- (((type)-1) > 0 ? /* unsigned */ \
- (sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- sizeof(type) == sizeof(long) ? \
- PyLong_FromUnsignedLong((unsigned long)x) : \
- PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
- (sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- PyLong_FromLongLong((long long)x)))
-
-#define _cffi_to_c_int(o, type) \
- ((type)( \
- sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
- : (type)_cffi_to_c_i8(o)) : \
- sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
- : (type)_cffi_to_c_i16(o)) : \
- sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
- : (type)_cffi_to_c_i32(o)) : \
- sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
- : (type)_cffi_to_c_i64(o)) : \
- (Py_FatalError("unsupported size for type " #type), (type)0)))
-
-#define _cffi_to_c_i8 \
- ((int(*)(PyObject *))_cffi_exports[1])
-#define _cffi_to_c_u8 \
- ((int(*)(PyObject *))_cffi_exports[2])
-#define _cffi_to_c_i16 \
- ((int(*)(PyObject *))_cffi_exports[3])
-#define _cffi_to_c_u16 \
- ((int(*)(PyObject *))_cffi_exports[4])
-#define _cffi_to_c_i32 \
- ((int(*)(PyObject *))_cffi_exports[5])
-#define _cffi_to_c_u32 \
- ((unsigned int(*)(PyObject *))_cffi_exports[6])
-#define _cffi_to_c_i64 \
- ((long long(*)(PyObject *))_cffi_exports[7])
-#define _cffi_to_c_u64 \
- ((unsigned long long(*)(PyObject *))_cffi_exports[8])
-#define _cffi_to_c_char \
- ((int(*)(PyObject *))_cffi_exports[9])
-#define _cffi_from_c_pointer \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10])
-#define _cffi_to_c_pointer \
- ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11])
-#define _cffi_get_struct_layout \
- not used any more
-#define _cffi_restore_errno \
- ((void(*)(void))_cffi_exports[13])
-#define _cffi_save_errno \
- ((void(*)(void))_cffi_exports[14])
-#define _cffi_from_c_char \
- ((PyObject *(*)(char))_cffi_exports[15])
-#define _cffi_from_c_deref \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16])
-#define _cffi_to_c \
- ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17])
-#define _cffi_from_c_struct \
- ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18])
-#define _cffi_to_c_wchar_t \
- ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19])
-#define _cffi_from_c_wchar_t \
- ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20])
-#define _cffi_to_c_long_double \
- ((long double(*)(PyObject *))_cffi_exports[21])
-#define _cffi_to_c__Bool \
- ((_Bool(*)(PyObject *))_cffi_exports[22])
-#define _cffi_prepare_pointer_call_argument \
- ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \
- PyObject *, char **))_cffi_exports[23])
-#define _cffi_convert_array_from_object \
- ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24])
-#define _CFFI_CPIDX 25
-#define _cffi_call_python \
- ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX])
-#define _cffi_to_c_wchar3216_t \
- ((int(*)(PyObject *))_cffi_exports[26])
-#define _cffi_from_c_wchar3216_t \
- ((PyObject *(*)(int))_cffi_exports[27])
-#define _CFFI_NUM_EXPORTS 28
-
-struct _cffi_ctypedescr;
-
-static void *_cffi_exports[_CFFI_NUM_EXPORTS];
-
-#define _cffi_type(index) ( \
- assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \
- (struct _cffi_ctypedescr *)_cffi_types[index])
-
-static PyObject *_cffi_init(const char *module_name, Py_ssize_t version,
- const struct _cffi_type_context_s *ctx)
-{
- PyObject *module, *o_arg, *new_module;
- void *raw[] = {
- (void *)module_name,
- (void *)version,
- (void *)_cffi_exports,
- (void *)ctx,
- };
-
- module = PyImport_ImportModule("_cffi_backend");
- if (module == NULL)
- goto failure;
-
- o_arg = PyLong_FromVoidPtr((void *)raw);
- if (o_arg == NULL)
- goto failure;
-
- new_module = PyObject_CallMethod(
- module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg);
-
- Py_DECREF(o_arg);
- Py_DECREF(module);
- return new_module;
-
- failure:
- Py_XDECREF(module);
- return NULL;
-}
-
-
-#ifdef HAVE_WCHAR_H
-typedef wchar_t _cffi_wchar_t;
-#else
-typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */
-#endif
-
-_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o)
-{
- if (sizeof(_cffi_wchar_t) == 2)
- return (uint16_t)_cffi_to_c_wchar_t(o);
- else
- return (uint16_t)_cffi_to_c_wchar3216_t(o);
-}
-
-_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x)
-{
- if (sizeof(_cffi_wchar_t) == 2)
- return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
- else
- return _cffi_from_c_wchar3216_t((int)x);
-}
-
-_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o)
-{
- if (sizeof(_cffi_wchar_t) == 4)
- return (int)_cffi_to_c_wchar_t(o);
- else
- return (int)_cffi_to_c_wchar3216_t(o);
-}
-
-_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x)
-{
- if (sizeof(_cffi_wchar_t) == 4)
- return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
- else
- return _cffi_from_c_wchar3216_t((int)x);
-}
-
-union _cffi_union_alignment_u {
- unsigned char m_char;
- unsigned short m_short;
- unsigned int m_int;
- unsigned long m_long;
- unsigned long long m_longlong;
- float m_float;
- double m_double;
- long double m_longdouble;
-};
-
-struct _cffi_freeme_s {
- struct _cffi_freeme_s *next;
- union _cffi_union_alignment_u alignment;
-};
-
-_CFFI_UNUSED_FN static int
-_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg,
- char **output_data, Py_ssize_t datasize,
- struct _cffi_freeme_s **freeme)
-{
- char *p;
- if (datasize < 0)
- return -1;
-
- p = *output_data;
- if (p == NULL) {
- struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc(
- offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize);
- if (fp == NULL)
- return -1;
- fp->next = *freeme;
- *freeme = fp;
- p = *output_data = (char *)&fp->alignment;
- }
- memset((void *)p, 0, (size_t)datasize);
- return _cffi_convert_array_from_object(p, ctptr, arg);
-}
-
-_CFFI_UNUSED_FN static void
-_cffi_free_array_arguments(struct _cffi_freeme_s *freeme)
-{
- do {
- void *p = (void *)freeme;
- freeme = freeme->next;
- PyObject_Free(p);
- } while (freeme != NULL);
-}
-
-/********** end CPython-specific section **********/
-#else
-_CFFI_UNUSED_FN
-static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *);
-# define _cffi_call_python _cffi_call_python_org
-#endif
-
-
-#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0]))
-
-#define _cffi_prim_int(size, sign) \
- ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \
- (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \
- (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \
- (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \
- _CFFI__UNKNOWN_PRIM)
-
-#define _cffi_prim_float(size) \
- ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \
- (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \
- (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \
- _CFFI__UNKNOWN_FLOAT_PRIM)
-
-#define _cffi_check_int(got, got_nonpos, expected) \
- ((got_nonpos) == (expected <= 0) && \
- (got) == (unsigned long long)expected)
-
-#ifdef MS_WIN32
-# define _cffi_stdcall __stdcall
-#else
-# define _cffi_stdcall /* nothing */
-#endif
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/resources/python/bin/3.7/mac/cffi/_embedding.h b/resources/python/bin/3.7/mac/cffi/_embedding.h
deleted file mode 100644
index 8e8df882d..000000000
--- a/resources/python/bin/3.7/mac/cffi/_embedding.h
+++ /dev/null
@@ -1,528 +0,0 @@
-
-/***** Support code for embedding *****/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#if defined(_WIN32)
-# define CFFI_DLLEXPORT __declspec(dllexport)
-#elif defined(__GNUC__)
-# define CFFI_DLLEXPORT __attribute__((visibility("default")))
-#else
-# define CFFI_DLLEXPORT /* nothing */
-#endif
-
-
-/* There are two global variables of type _cffi_call_python_fnptr:
-
- * _cffi_call_python, which we declare just below, is the one called
- by ``extern "Python"`` implementations.
-
- * _cffi_call_python_org, which on CPython is actually part of the
- _cffi_exports[] array, is the function pointer copied from
- _cffi_backend. If _cffi_start_python() fails, then this is set
- to NULL; otherwise, it should never be NULL.
-
- After initialization is complete, both are equal. However, the
- first one remains equal to &_cffi_start_and_call_python until the
- very end of initialization, when we are (or should be) sure that
- concurrent threads also see a completely initialized world, and
- only then is it changed.
-*/
-#undef _cffi_call_python
-typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *);
-static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *);
-static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python;
-
-
-#ifndef _MSC_VER
- /* --- Assuming a GCC not infinitely old --- */
-# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n)
-# define cffi_write_barrier() __sync_synchronize()
-# if !defined(__amd64__) && !defined(__x86_64__) && \
- !defined(__i386__) && !defined(__i386)
-# define cffi_read_barrier() __sync_synchronize()
-# else
-# define cffi_read_barrier() (void)0
-# endif
-#else
- /* --- Windows threads version --- */
-# include
-# define cffi_compare_and_swap(l,o,n) \
- (InterlockedCompareExchangePointer(l,n,o) == (o))
-# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0)
-# define cffi_read_barrier() (void)0
-static volatile LONG _cffi_dummy;
-#endif
-
-#ifdef WITH_THREAD
-# ifndef _MSC_VER
-# include
- static pthread_mutex_t _cffi_embed_startup_lock;
-# else
- static CRITICAL_SECTION _cffi_embed_startup_lock;
-# endif
- static char _cffi_embed_startup_lock_ready = 0;
-#endif
-
-static void _cffi_acquire_reentrant_mutex(void)
-{
- static void *volatile lock = NULL;
-
- while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) {
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: pthread_mutex_init() should be very fast, and
- this is only run at start-up anyway. */
- }
-
-#ifdef WITH_THREAD
- if (!_cffi_embed_startup_lock_ready) {
-# ifndef _MSC_VER
- pthread_mutexattr_t attr;
- pthread_mutexattr_init(&attr);
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&_cffi_embed_startup_lock, &attr);
-# else
- InitializeCriticalSection(&_cffi_embed_startup_lock);
-# endif
- _cffi_embed_startup_lock_ready = 1;
- }
-#endif
-
- while (!cffi_compare_and_swap(&lock, (void *)1, NULL))
- ;
-
-#ifndef _MSC_VER
- pthread_mutex_lock(&_cffi_embed_startup_lock);
-#else
- EnterCriticalSection(&_cffi_embed_startup_lock);
-#endif
-}
-
-static void _cffi_release_reentrant_mutex(void)
-{
-#ifndef _MSC_VER
- pthread_mutex_unlock(&_cffi_embed_startup_lock);
-#else
- LeaveCriticalSection(&_cffi_embed_startup_lock);
-#endif
-}
-
-
-/********** CPython-specific section **********/
-#ifndef PYPY_VERSION
-
-#include "_cffi_errors.h"
-
-
-#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX]
-
-PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */
-
-static void _cffi_py_initialize(void)
-{
- /* XXX use initsigs=0, which "skips initialization registration of
- signal handlers, which might be useful when Python is
- embedded" according to the Python docs. But review and think
- if it should be a user-controllable setting.
-
- XXX we should also give a way to write errors to a buffer
- instead of to stderr.
-
- XXX if importing 'site' fails, CPython (any version) calls
- exit(). Should we try to work around this behavior here?
- */
- Py_InitializeEx(0);
-}
-
-static int _cffi_initialize_python(void)
-{
- /* This initializes Python, imports _cffi_backend, and then the
- present .dll/.so is set up as a CPython C extension module.
- */
- int result;
- PyGILState_STATE state;
- PyObject *pycode=NULL, *global_dict=NULL, *x;
- PyObject *builtins;
-
- state = PyGILState_Ensure();
-
- /* Call the initxxx() function from the present module. It will
- create and initialize us as a CPython extension module, instead
- of letting the startup Python code do it---it might reimport
- the same .dll/.so and get maybe confused on some platforms.
- It might also have troubles locating the .dll/.so again for all
- I know.
- */
- (void)_CFFI_PYTHON_STARTUP_FUNC();
- if (PyErr_Occurred())
- goto error;
-
- /* Now run the Python code provided to ffi.embedding_init_code().
- */
- pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE,
- "",
- Py_file_input);
- if (pycode == NULL)
- goto error;
- global_dict = PyDict_New();
- if (global_dict == NULL)
- goto error;
- builtins = PyEval_GetBuiltins();
- if (builtins == NULL)
- goto error;
- if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0)
- goto error;
- x = PyEval_EvalCode(
-#if PY_MAJOR_VERSION < 3
- (PyCodeObject *)
-#endif
- pycode, global_dict, global_dict);
- if (x == NULL)
- goto error;
- Py_DECREF(x);
-
- /* Done! Now if we've been called from
- _cffi_start_and_call_python() in an ``extern "Python"``, we can
- only hope that the Python code did correctly set up the
- corresponding @ffi.def_extern() function. Otherwise, the
- general logic of ``extern "Python"`` functions (inside the
- _cffi_backend module) will find that the reference is still
- missing and print an error.
- */
- result = 0;
- done:
- Py_XDECREF(pycode);
- Py_XDECREF(global_dict);
- PyGILState_Release(state);
- return result;
-
- error:;
- {
- /* Print as much information as potentially useful.
- Debugging load-time failures with embedding is not fun
- */
- PyObject *ecap;
- PyObject *exception, *v, *tb, *f, *modules, *mod;
- PyErr_Fetch(&exception, &v, &tb);
- ecap = _cffi_start_error_capture();
- f = PySys_GetObject((char *)"stderr");
- if (f != NULL && f != Py_None) {
- PyFile_WriteString(
- "Failed to initialize the Python-CFFI embedding logic:\n\n", f);
- }
-
- if (exception != NULL) {
- PyErr_NormalizeException(&exception, &v, &tb);
- PyErr_Display(exception, v, tb);
- }
- Py_XDECREF(exception);
- Py_XDECREF(v);
- Py_XDECREF(tb);
-
- if (f != NULL && f != Py_None) {
- PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
- "\ncompiled with cffi version: 1.15.1"
- "\n_cffi_backend module: ", f);
- modules = PyImport_GetModuleDict();
- mod = PyDict_GetItemString(modules, "_cffi_backend");
- if (mod == NULL) {
- PyFile_WriteString("not loaded", f);
- }
- else {
- v = PyObject_GetAttrString(mod, "__file__");
- PyFile_WriteObject(v, f, 0);
- Py_XDECREF(v);
- }
- PyFile_WriteString("\nsys.path: ", f);
- PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0);
- PyFile_WriteString("\n\n", f);
- }
- _cffi_stop_error_capture(ecap);
- }
- result = -1;
- goto done;
-}
-
-#if PY_VERSION_HEX < 0x03080000
-PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */
-#endif
-
-static int _cffi_carefully_make_gil(void)
-{
- /* This does the basic initialization of Python. It can be called
- completely concurrently from unrelated threads. It assumes
- that we don't hold the GIL before (if it exists), and we don't
- hold it afterwards.
-
- (What it really does used to be completely different in Python 2
- and Python 3, with the Python 2 solution avoiding the spin-lock
- around the Py_InitializeEx() call. However, after recent changes
- to CPython 2.7 (issue #358) it no longer works. So we use the
- Python 3 solution everywhere.)
-
- This initializes Python by calling Py_InitializeEx().
- Important: this must not be called concurrently at all.
- So we use a global variable as a simple spin lock. This global
- variable must be from 'libpythonX.Y.so', not from this
- cffi-based extension module, because it must be shared from
- different cffi-based extension modules.
-
- In Python < 3.8, we choose
- _PyParser_TokenNames[0] as a completely arbitrary pointer value
- that is never written to. The default is to point to the
- string "ENDMARKER". We change it temporarily to point to the
- next character in that string. (Yes, I know it's REALLY
- obscure.)
-
- In Python >= 3.8, this string array is no longer writable, so
- instead we pick PyCapsuleType.tp_version_tag. We can't change
- Python < 3.8 because someone might use a mixture of cffi
- embedded modules, some of which were compiled before this file
- changed.
- */
-
-#ifdef WITH_THREAD
-# if PY_VERSION_HEX < 0x03080000
- char *volatile *lock = (char *volatile *)_PyParser_TokenNames;
- char *old_value, *locked_value;
-
- while (1) { /* spin loop */
- old_value = *lock;
- locked_value = old_value + 1;
- if (old_value[0] == 'E') {
- assert(old_value[1] == 'N');
- if (cffi_compare_and_swap(lock, old_value, locked_value))
- break;
- }
- else {
- assert(old_value[0] == 'N');
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: PyEval_InitThreads() should be very fast, and
- this is only run at start-up anyway. */
- }
- }
-# else
- int volatile *lock = (int volatile *)&PyCapsule_Type.tp_version_tag;
- int old_value, locked_value;
- assert(!(PyCapsule_Type.tp_flags & Py_TPFLAGS_HAVE_VERSION_TAG));
-
- while (1) { /* spin loop */
- old_value = *lock;
- locked_value = -42;
- if (old_value == 0) {
- if (cffi_compare_and_swap(lock, old_value, locked_value))
- break;
- }
- else {
- assert(old_value == locked_value);
- /* should ideally do a spin loop instruction here, but
- hard to do it portably and doesn't really matter I
- think: PyEval_InitThreads() should be very fast, and
- this is only run at start-up anyway. */
- }
- }
-# endif
-#endif
-
- /* call Py_InitializeEx() */
- if (!Py_IsInitialized()) {
- _cffi_py_initialize();
-#if PY_VERSION_HEX < 0x03070000
- PyEval_InitThreads();
-#endif
- PyEval_SaveThread(); /* release the GIL */
- /* the returned tstate must be the one that has been stored into the
- autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */
- }
- else {
-#if PY_VERSION_HEX < 0x03070000
- /* PyEval_InitThreads() is always a no-op from CPython 3.7 */
- PyGILState_STATE state = PyGILState_Ensure();
- PyEval_InitThreads();
- PyGILState_Release(state);
-#endif
- }
-
-#ifdef WITH_THREAD
- /* release the lock */
- while (!cffi_compare_and_swap(lock, locked_value, old_value))
- ;
-#endif
-
- return 0;
-}
-
-/********** end CPython-specific section **********/
-
-
-#else
-
-
-/********** PyPy-specific section **********/
-
-PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */
-
-static struct _cffi_pypy_init_s {
- const char *name;
- void *func; /* function pointer */
- const char *code;
-} _cffi_pypy_init = {
- _CFFI_MODULE_NAME,
- _CFFI_PYTHON_STARTUP_FUNC,
- _CFFI_PYTHON_STARTUP_CODE,
-};
-
-extern int pypy_carefully_make_gil(const char *);
-extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *);
-
-static int _cffi_carefully_make_gil(void)
-{
- return pypy_carefully_make_gil(_CFFI_MODULE_NAME);
-}
-
-static int _cffi_initialize_python(void)
-{
- return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init);
-}
-
-/********** end PyPy-specific section **********/
-
-
-#endif
-
-
-#ifdef __GNUC__
-__attribute__((noinline))
-#endif
-static _cffi_call_python_fnptr _cffi_start_python(void)
-{
- /* Delicate logic to initialize Python. This function can be
- called multiple times concurrently, e.g. when the process calls
- its first ``extern "Python"`` functions in multiple threads at
- once. It can also be called recursively, in which case we must
- ignore it. We also have to consider what occurs if several
- different cffi-based extensions reach this code in parallel
- threads---it is a different copy of the code, then, and we
- can't have any shared global variable unless it comes from
- 'libpythonX.Y.so'.
-
- Idea:
-
- * _cffi_carefully_make_gil(): "carefully" call
- PyEval_InitThreads() (possibly with Py_InitializeEx() first).
-
- * then we use a (local) custom lock to make sure that a call to this
- cffi-based extension will wait if another call to the *same*
- extension is running the initialization in another thread.
- It is reentrant, so that a recursive call will not block, but
- only one from a different thread.
-
- * then we grab the GIL and (Python 2) we call Py_InitializeEx().
- At this point, concurrent calls to Py_InitializeEx() are not
- possible: we have the GIL.
-
- * do the rest of the specific initialization, which may
- temporarily release the GIL but not the custom lock.
- Only release the custom lock when we are done.
- */
- static char called = 0;
-
- if (_cffi_carefully_make_gil() != 0)
- return NULL;
-
- _cffi_acquire_reentrant_mutex();
-
- /* Here the GIL exists, but we don't have it. We're only protected
- from concurrency by the reentrant mutex. */
-
- /* This file only initializes the embedded module once, the first
- time this is called, even if there are subinterpreters. */
- if (!called) {
- called = 1; /* invoke _cffi_initialize_python() only once,
- but don't set '_cffi_call_python' right now,
- otherwise concurrent threads won't call
- this function at all (we need them to wait) */
- if (_cffi_initialize_python() == 0) {
- /* now initialization is finished. Switch to the fast-path. */
-
- /* We would like nobody to see the new value of
- '_cffi_call_python' without also seeing the rest of the
- data initialized. However, this is not possible. But
- the new value of '_cffi_call_python' is the function
- 'cffi_call_python()' from _cffi_backend. So: */
- cffi_write_barrier();
- /* ^^^ we put a write barrier here, and a corresponding
- read barrier at the start of cffi_call_python(). This
- ensures that after that read barrier, we see everything
- done here before the write barrier.
- */
-
- assert(_cffi_call_python_org != NULL);
- _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org;
- }
- else {
- /* initialization failed. Reset this to NULL, even if it was
- already set to some other value. Future calls to
- _cffi_start_python() are still forced to occur, and will
- always return NULL from now on. */
- _cffi_call_python_org = NULL;
- }
- }
-
- _cffi_release_reentrant_mutex();
-
- return (_cffi_call_python_fnptr)_cffi_call_python_org;
-}
-
-static
-void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args)
-{
- _cffi_call_python_fnptr fnptr;
- int current_err = errno;
-#ifdef _MSC_VER
- int current_lasterr = GetLastError();
-#endif
- fnptr = _cffi_start_python();
- if (fnptr == NULL) {
- fprintf(stderr, "function %s() called, but initialization code "
- "failed. Returning 0.\n", externpy->name);
- memset(args, 0, externpy->size_of_result);
- }
-#ifdef _MSC_VER
- SetLastError(current_lasterr);
-#endif
- errno = current_err;
-
- if (fnptr != NULL)
- fnptr(externpy, args);
-}
-
-
-/* The cffi_start_python() function makes sure Python is initialized
- and our cffi module is set up. It can be called manually from the
- user C code. The same effect is obtained automatically from any
- dll-exported ``extern "Python"`` function. This function returns
- -1 if initialization failed, 0 if all is OK. */
-_CFFI_UNUSED_FN
-static int cffi_start_python(void)
-{
- if (_cffi_call_python == &_cffi_start_and_call_python) {
- if (_cffi_start_python() == NULL)
- return -1;
- }
- cffi_read_barrier();
- return 0;
-}
-
-#undef cffi_compare_and_swap
-#undef cffi_write_barrier
-#undef cffi_read_barrier
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/resources/python/bin/3.7/mac/cffi/api.py b/resources/python/bin/3.7/mac/cffi/api.py
deleted file mode 100644
index 999a8aefc..000000000
--- a/resources/python/bin/3.7/mac/cffi/api.py
+++ /dev/null
@@ -1,965 +0,0 @@
-import sys, types
-from .lock import allocate_lock
-from .error import CDefError
-from . import model
-
-try:
- callable
-except NameError:
- # Python 3.1
- from collections import Callable
- callable = lambda x: isinstance(x, Callable)
-
-try:
- basestring
-except NameError:
- # Python 3.x
- basestring = str
-
-_unspecified = object()
-
-
-
-class FFI(object):
- r'''
- The main top-level class that you instantiate once, or once per module.
-
- Example usage:
-
- ffi = FFI()
- ffi.cdef("""
- int printf(const char *, ...);
- """)
-
- C = ffi.dlopen(None) # standard library
- -or-
- C = ffi.verify() # use a C compiler: verify the decl above is right
-
- C.printf("hello, %s!\n", ffi.new("char[]", "world"))
- '''
-
- def __init__(self, backend=None):
- """Create an FFI instance. The 'backend' argument is used to
- select a non-default backend, mostly for tests.
- """
- if backend is None:
- # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with
- # _cffi_backend.so compiled.
- import _cffi_backend as backend
- from . import __version__
- if backend.__version__ != __version__:
- # bad version! Try to be as explicit as possible.
- if hasattr(backend, '__file__'):
- # CPython
- raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. When we import the top-level '_cffi_backend' extension module, we get version %s, located in %r. The two versions should be equal; check your installation." % (
- __version__, __file__,
- backend.__version__, backend.__file__))
- else:
- # PyPy
- raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. This interpreter comes with a built-in '_cffi_backend' module, which is version %s. The two versions should be equal; check your installation." % (
- __version__, __file__, backend.__version__))
- # (If you insist you can also try to pass the option
- # 'backend=backend_ctypes.CTypesBackend()', but don't
- # rely on it! It's probably not going to work well.)
-
- from . import cparser
- self._backend = backend
- self._lock = allocate_lock()
- self._parser = cparser.Parser()
- self._cached_btypes = {}
- self._parsed_types = types.ModuleType('parsed_types').__dict__
- self._new_types = types.ModuleType('new_types').__dict__
- self._function_caches = []
- self._libraries = []
- self._cdefsources = []
- self._included_ffis = []
- self._windows_unicode = None
- self._init_once_cache = {}
- self._cdef_version = None
- self._embedding = None
- self._typecache = model.get_typecache(backend)
- if hasattr(backend, 'set_ffi'):
- backend.set_ffi(self)
- for name in list(backend.__dict__):
- if name.startswith('RTLD_'):
- setattr(self, name, getattr(backend, name))
- #
- with self._lock:
- self.BVoidP = self._get_cached_btype(model.voidp_type)
- self.BCharA = self._get_cached_btype(model.char_array_type)
- if isinstance(backend, types.ModuleType):
- # _cffi_backend: attach these constants to the class
- if not hasattr(FFI, 'NULL'):
- FFI.NULL = self.cast(self.BVoidP, 0)
- FFI.CData, FFI.CType = backend._get_types()
- else:
- # ctypes backend: attach these constants to the instance
- self.NULL = self.cast(self.BVoidP, 0)
- self.CData, self.CType = backend._get_types()
- self.buffer = backend.buffer
-
- def cdef(self, csource, override=False, packed=False, pack=None):
- """Parse the given C source. This registers all declared functions,
- types, and global variables. The functions and global variables can
- then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'.
- The types can be used in 'ffi.new()' and other functions.
- If 'packed' is specified as True, all structs declared inside this
- cdef are packed, i.e. laid out without any field alignment at all.
- Alternatively, 'pack' can be a small integer, and requests for
- alignment greater than that are ignored (pack=1 is equivalent to
- packed=True).
- """
- self._cdef(csource, override=override, packed=packed, pack=pack)
-
- def embedding_api(self, csource, packed=False, pack=None):
- self._cdef(csource, packed=packed, pack=pack, dllexport=True)
- if self._embedding is None:
- self._embedding = ''
-
- def _cdef(self, csource, override=False, **options):
- if not isinstance(csource, str): # unicode, on Python 2
- if not isinstance(csource, basestring):
- raise TypeError("cdef() argument must be a string")
- csource = csource.encode('ascii')
- with self._lock:
- self._cdef_version = object()
- self._parser.parse(csource, override=override, **options)
- self._cdefsources.append(csource)
- if override:
- for cache in self._function_caches:
- cache.clear()
- finishlist = self._parser._recomplete
- if finishlist:
- self._parser._recomplete = []
- for tp in finishlist:
- tp.finish_backend_type(self, finishlist)
-
- def dlopen(self, name, flags=0):
- """Load and return a dynamic library identified by 'name'.
- The standard C library can be loaded by passing None.
- Note that functions and types declared by 'ffi.cdef()' are not
- linked to a particular library, just like C headers; in the
- library we only look for the actual (untyped) symbols.
- """
- if not (isinstance(name, basestring) or
- name is None or
- isinstance(name, self.CData)):
- raise TypeError("dlopen(name): name must be a file name, None, "
- "or an already-opened 'void *' handle")
- with self._lock:
- lib, function_cache = _make_ffi_library(self, name, flags)
- self._function_caches.append(function_cache)
- self._libraries.append(lib)
- return lib
-
- def dlclose(self, lib):
- """Close a library obtained with ffi.dlopen(). After this call,
- access to functions or variables from the library will fail
- (possibly with a segmentation fault).
- """
- type(lib).__cffi_close__(lib)
-
- def _typeof_locked(self, cdecl):
- # call me with the lock!
- key = cdecl
- if key in self._parsed_types:
- return self._parsed_types[key]
- #
- if not isinstance(cdecl, str): # unicode, on Python 2
- cdecl = cdecl.encode('ascii')
- #
- type = self._parser.parse_type(cdecl)
- really_a_function_type = type.is_raw_function
- if really_a_function_type:
- type = type.as_function_pointer()
- btype = self._get_cached_btype(type)
- result = btype, really_a_function_type
- self._parsed_types[key] = result
- return result
-
- def _typeof(self, cdecl, consider_function_as_funcptr=False):
- # string -> ctype object
- try:
- result = self._parsed_types[cdecl]
- except KeyError:
- with self._lock:
- result = self._typeof_locked(cdecl)
- #
- btype, really_a_function_type = result
- if really_a_function_type and not consider_function_as_funcptr:
- raise CDefError("the type %r is a function type, not a "
- "pointer-to-function type" % (cdecl,))
- return btype
-
- def typeof(self, cdecl):
- """Parse the C type given as a string and return the
- corresponding object.
- It can also be used on 'cdata' instance to get its C type.
- """
- if isinstance(cdecl, basestring):
- return self._typeof(cdecl)
- if isinstance(cdecl, self.CData):
- return self._backend.typeof(cdecl)
- if isinstance(cdecl, types.BuiltinFunctionType):
- res = _builtin_function_type(cdecl)
- if res is not None:
- return res
- if (isinstance(cdecl, types.FunctionType)
- and hasattr(cdecl, '_cffi_base_type')):
- with self._lock:
- return self._get_cached_btype(cdecl._cffi_base_type)
- raise TypeError(type(cdecl))
-
- def sizeof(self, cdecl):
- """Return the size in bytes of the argument. It can be a
- string naming a C type, or a 'cdata' instance.
- """
- if isinstance(cdecl, basestring):
- BType = self._typeof(cdecl)
- return self._backend.sizeof(BType)
- else:
- return self._backend.sizeof(cdecl)
-
- def alignof(self, cdecl):
- """Return the natural alignment size in bytes of the C type
- given as a string.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.alignof(cdecl)
-
- def offsetof(self, cdecl, *fields_or_indexes):
- """Return the offset of the named field inside the given
- structure or array, which must be given as a C type name.
- You can give several field names in case of nested structures.
- You can also give numeric values which correspond to array
- items, in case of an array type.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._typeoffsetof(cdecl, *fields_or_indexes)[1]
-
- def new(self, cdecl, init=None):
- """Allocate an instance according to the specified C type and
- return a pointer to it. The specified C type must be either a
- pointer or an array: ``new('X *')`` allocates an X and returns
- a pointer to it, whereas ``new('X[n]')`` allocates an array of
- n X'es and returns an array referencing it (which works
- mostly like a pointer, like in C). You can also use
- ``new('X[]', n)`` to allocate an array of a non-constant
- length n.
-
- The memory is initialized following the rules of declaring a
- global variable in C: by default it is zero-initialized, but
- an explicit initializer can be given which can be used to
- fill all or part of the memory.
-
- When the returned object goes out of scope, the memory
- is freed. In other words the returned object has
- ownership of the value of type 'cdecl' that it points to. This
- means that the raw data can be used as long as this object is
- kept alive, but must not be used for a longer time. Be careful
- about that when copying the pointer to the memory somewhere
- else, e.g. into another structure.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.newp(cdecl, init)
-
- def new_allocator(self, alloc=None, free=None,
- should_clear_after_alloc=True):
- """Return a new allocator, i.e. a function that behaves like ffi.new()
- but uses the provided low-level 'alloc' and 'free' functions.
-
- 'alloc' is called with the size as argument. If it returns NULL, a
- MemoryError is raised. 'free' is called with the result of 'alloc'
- as argument. Both can be either Python function or directly C
- functions. If 'free' is None, then no free function is called.
- If both 'alloc' and 'free' are None, the default is used.
-
- If 'should_clear_after_alloc' is set to False, then the memory
- returned by 'alloc' is assumed to be already cleared (or you are
- fine with garbage); otherwise CFFI will clear it.
- """
- compiled_ffi = self._backend.FFI()
- allocator = compiled_ffi.new_allocator(alloc, free,
- should_clear_after_alloc)
- def allocate(cdecl, init=None):
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return allocator(cdecl, init)
- return allocate
-
- def cast(self, cdecl, source):
- """Similar to a C cast: returns an instance of the named C
- type initialized with the given 'source'. The source is
- casted between integers or pointers of any type.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.cast(cdecl, source)
-
- def string(self, cdata, maxlen=-1):
- """Return a Python string (or unicode string) from the 'cdata'.
- If 'cdata' is a pointer or array of characters or bytes, returns
- the null-terminated string. The returned string extends until
- the first null character, or at most 'maxlen' characters. If
- 'cdata' is an array then 'maxlen' defaults to its length.
-
- If 'cdata' is a pointer or array of wchar_t, returns a unicode
- string following the same rules.
-
- If 'cdata' is a single character or byte or a wchar_t, returns
- it as a string or unicode string.
-
- If 'cdata' is an enum, returns the value of the enumerator as a
- string, or 'NUMBER' if the value is out of range.
- """
- return self._backend.string(cdata, maxlen)
-
- def unpack(self, cdata, length):
- """Unpack an array of C data of the given length,
- returning a Python string/unicode/list.
-
- If 'cdata' is a pointer to 'char', returns a byte string.
- It does not stop at the first null. This is equivalent to:
- ffi.buffer(cdata, length)[:]
-
- If 'cdata' is a pointer to 'wchar_t', returns a unicode string.
- 'length' is measured in wchar_t's; it is not the size in bytes.
-
- If 'cdata' is a pointer to anything else, returns a list of
- 'length' items. This is a faster equivalent to:
- [cdata[i] for i in range(length)]
- """
- return self._backend.unpack(cdata, length)
-
- #def buffer(self, cdata, size=-1):
- # """Return a read-write buffer object that references the raw C data
- # pointed to by the given 'cdata'. The 'cdata' must be a pointer or
- # an array. Can be passed to functions expecting a buffer, or directly
- # manipulated with:
- #
- # buf[:] get a copy of it in a regular string, or
- # buf[idx] as a single character
- # buf[:] = ...
- # buf[idx] = ... change the content
- # """
- # note that 'buffer' is a type, set on this instance by __init__
-
- def from_buffer(self, cdecl, python_buffer=_unspecified,
- require_writable=False):
- """Return a cdata of the given type pointing to the data of the
- given Python object, which must support the buffer interface.
- Note that this is not meant to be used on the built-in types
- str or unicode (you can build 'char[]' arrays explicitly)
- but only on objects containing large quantities of raw data
- in some other format, like 'array.array' or numpy arrays.
-
- The first argument is optional and default to 'char[]'.
- """
- if python_buffer is _unspecified:
- cdecl, python_buffer = self.BCharA, cdecl
- elif isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- return self._backend.from_buffer(cdecl, python_buffer,
- require_writable)
-
- def memmove(self, dest, src, n):
- """ffi.memmove(dest, src, n) copies n bytes of memory from src to dest.
-
- Like the C function memmove(), the memory areas may overlap;
- apart from that it behaves like the C function memcpy().
-
- 'src' can be any cdata ptr or array, or any Python buffer object.
- 'dest' can be any cdata ptr or array, or a writable Python buffer
- object. The size to copy, 'n', is always measured in bytes.
-
- Unlike other methods, this one supports all Python buffer including
- byte strings and bytearrays---but it still does not support
- non-contiguous buffers.
- """
- return self._backend.memmove(dest, src, n)
-
- def callback(self, cdecl, python_callable=None, error=None, onerror=None):
- """Return a callback object or a decorator making such a
- callback object. 'cdecl' must name a C function pointer type.
- The callback invokes the specified 'python_callable' (which may
- be provided either directly or via a decorator). Important: the
- callback object must be manually kept alive for as long as the
- callback may be invoked from the C level.
- """
- def callback_decorator_wrap(python_callable):
- if not callable(python_callable):
- raise TypeError("the 'python_callable' argument "
- "is not callable")
- return self._backend.callback(cdecl, python_callable,
- error, onerror)
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl, consider_function_as_funcptr=True)
- if python_callable is None:
- return callback_decorator_wrap # decorator mode
- else:
- return callback_decorator_wrap(python_callable) # direct mode
-
- def getctype(self, cdecl, replace_with=''):
- """Return a string giving the C type 'cdecl', which may be itself
- a string or a object. If 'replace_with' is given, it gives
- extra text to append (or insert for more complicated C types), like
- a variable name, or '*' to get actually the C type 'pointer-to-cdecl'.
- """
- if isinstance(cdecl, basestring):
- cdecl = self._typeof(cdecl)
- replace_with = replace_with.strip()
- if (replace_with.startswith('*')
- and '&[' in self._backend.getcname(cdecl, '&')):
- replace_with = '(%s)' % replace_with
- elif replace_with and not replace_with[0] in '[(':
- replace_with = ' ' + replace_with
- return self._backend.getcname(cdecl, replace_with)
-
- def gc(self, cdata, destructor, size=0):
- """Return a new cdata object that points to the same
- data. Later, when this new cdata object is garbage-collected,
- 'destructor(old_cdata_object)' will be called.
-
- The optional 'size' gives an estimate of the size, used to
- trigger the garbage collection more eagerly. So far only used
- on PyPy. It tells the GC that the returned object keeps alive
- roughly 'size' bytes of external memory.
- """
- return self._backend.gcp(cdata, destructor, size)
-
- def _get_cached_btype(self, type):
- assert self._lock.acquire(False) is False
- # call me with the lock!
- try:
- BType = self._cached_btypes[type]
- except KeyError:
- finishlist = []
- BType = type.get_cached_btype(self, finishlist)
- for type in finishlist:
- type.finish_backend_type(self, finishlist)
- return BType
-
- def verify(self, source='', tmpdir=None, **kwargs):
- """Verify that the current ffi signatures compile on this
- machine, and return a dynamic library object. The dynamic
- library can be used to call functions and access global
- variables declared in this 'ffi'. The library is compiled
- by the C compiler: it gives you C-level API compatibility
- (including calling macros). This is unlike 'ffi.dlopen()',
- which requires binary compatibility in the signatures.
- """
- from .verifier import Verifier, _caller_dir_pycache
- #
- # If set_unicode(True) was called, insert the UNICODE and
- # _UNICODE macro declarations
- if self._windows_unicode:
- self._apply_windows_unicode(kwargs)
- #
- # Set the tmpdir here, and not in Verifier.__init__: it picks
- # up the caller's directory, which we want to be the caller of
- # ffi.verify(), as opposed to the caller of Veritier().
- tmpdir = tmpdir or _caller_dir_pycache()
- #
- # Make a Verifier() and use it to load the library.
- self.verifier = Verifier(self, source, tmpdir, **kwargs)
- lib = self.verifier.load_library()
- #
- # Save the loaded library for keep-alive purposes, even
- # if the caller doesn't keep it alive itself (it should).
- self._libraries.append(lib)
- return lib
-
- def _get_errno(self):
- return self._backend.get_errno()
- def _set_errno(self, errno):
- self._backend.set_errno(errno)
- errno = property(_get_errno, _set_errno, None,
- "the value of 'errno' from/to the C calls")
-
- def getwinerror(self, code=-1):
- return self._backend.getwinerror(code)
-
- def _pointer_to(self, ctype):
- with self._lock:
- return model.pointer_cache(self, ctype)
-
- def addressof(self, cdata, *fields_or_indexes):
- """Return the address of a .
- If 'fields_or_indexes' are given, returns the address of that
- field or array item in the structure or array, recursively in
- case of nested structures.
- """
- try:
- ctype = self._backend.typeof(cdata)
- except TypeError:
- if '__addressof__' in type(cdata).__dict__:
- return type(cdata).__addressof__(cdata, *fields_or_indexes)
- raise
- if fields_or_indexes:
- ctype, offset = self._typeoffsetof(ctype, *fields_or_indexes)
- else:
- if ctype.kind == "pointer":
- raise TypeError("addressof(pointer)")
- offset = 0
- ctypeptr = self._pointer_to(ctype)
- return self._backend.rawaddressof(ctypeptr, cdata, offset)
-
- def _typeoffsetof(self, ctype, field_or_index, *fields_or_indexes):
- ctype, offset = self._backend.typeoffsetof(ctype, field_or_index)
- for field1 in fields_or_indexes:
- ctype, offset1 = self._backend.typeoffsetof(ctype, field1, 1)
- offset += offset1
- return ctype, offset
-
- def include(self, ffi_to_include):
- """Includes the typedefs, structs, unions and enums defined
- in another FFI instance. Usage is similar to a #include in C,
- where a part of the program might include types defined in
- another part for its own usage. Note that the include()
- method has no effect on functions, constants and global
- variables, which must anyway be accessed directly from the
- lib object returned by the original FFI instance.
- """
- if not isinstance(ffi_to_include, FFI):
- raise TypeError("ffi.include() expects an argument that is also of"
- " type cffi.FFI, not %r" % (
- type(ffi_to_include).__name__,))
- if ffi_to_include is self:
- raise ValueError("self.include(self)")
- with ffi_to_include._lock:
- with self._lock:
- self._parser.include(ffi_to_include._parser)
- self._cdefsources.append('[')
- self._cdefsources.extend(ffi_to_include._cdefsources)
- self._cdefsources.append(']')
- self._included_ffis.append(ffi_to_include)
-
- def new_handle(self, x):
- return self._backend.newp_handle(self.BVoidP, x)
-
- def from_handle(self, x):
- return self._backend.from_handle(x)
-
- def release(self, x):
- self._backend.release(x)
-
- def set_unicode(self, enabled_flag):
- """Windows: if 'enabled_flag' is True, enable the UNICODE and
- _UNICODE defines in C, and declare the types like TCHAR and LPTCSTR
- to be (pointers to) wchar_t. If 'enabled_flag' is False,
- declare these types to be (pointers to) plain 8-bit characters.
- This is mostly for backward compatibility; you usually want True.
- """
- if self._windows_unicode is not None:
- raise ValueError("set_unicode() can only be called once")
- enabled_flag = bool(enabled_flag)
- if enabled_flag:
- self.cdef("typedef wchar_t TBYTE;"
- "typedef wchar_t TCHAR;"
- "typedef const wchar_t *LPCTSTR;"
- "typedef const wchar_t *PCTSTR;"
- "typedef wchar_t *LPTSTR;"
- "typedef wchar_t *PTSTR;"
- "typedef TBYTE *PTBYTE;"
- "typedef TCHAR *PTCHAR;")
- else:
- self.cdef("typedef char TBYTE;"
- "typedef char TCHAR;"
- "typedef const char *LPCTSTR;"
- "typedef const char *PCTSTR;"
- "typedef char *LPTSTR;"
- "typedef char *PTSTR;"
- "typedef TBYTE *PTBYTE;"
- "typedef TCHAR *PTCHAR;")
- self._windows_unicode = enabled_flag
-
- def _apply_windows_unicode(self, kwds):
- defmacros = kwds.get('define_macros', ())
- if not isinstance(defmacros, (list, tuple)):
- raise TypeError("'define_macros' must be a list or tuple")
- defmacros = list(defmacros) + [('UNICODE', '1'),
- ('_UNICODE', '1')]
- kwds['define_macros'] = defmacros
-
- def _apply_embedding_fix(self, kwds):
- # must include an argument like "-lpython2.7" for the compiler
- def ensure(key, value):
- lst = kwds.setdefault(key, [])
- if value not in lst:
- lst.append(value)
- #
- if '__pypy__' in sys.builtin_module_names:
- import os
- if sys.platform == "win32":
- # we need 'libpypy-c.lib'. Current distributions of
- # pypy (>= 4.1) contain it as 'libs/python27.lib'.
- pythonlib = "python{0[0]}{0[1]}".format(sys.version_info)
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'libs'))
- else:
- # we need 'libpypy-c.{so,dylib}', which should be by
- # default located in 'sys.prefix/bin' for installed
- # systems.
- if sys.version_info < (3,):
- pythonlib = "pypy-c"
- else:
- pythonlib = "pypy3-c"
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'bin'))
- # On uninstalled pypy's, the libpypy-c is typically found in
- # .../pypy/goal/.
- if hasattr(sys, 'prefix'):
- ensure('library_dirs', os.path.join(sys.prefix, 'pypy', 'goal'))
- else:
- if sys.platform == "win32":
- template = "python%d%d"
- if hasattr(sys, 'gettotalrefcount'):
- template += '_d'
- else:
- try:
- import sysconfig
- except ImportError: # 2.6
- from distutils import sysconfig
- template = "python%d.%d"
- if sysconfig.get_config_var('DEBUG_EXT'):
- template += sysconfig.get_config_var('DEBUG_EXT')
- pythonlib = (template %
- (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
- if hasattr(sys, 'abiflags'):
- pythonlib += sys.abiflags
- ensure('libraries', pythonlib)
- if sys.platform == "win32":
- ensure('extra_link_args', '/MANIFEST')
-
- def set_source(self, module_name, source, source_extension='.c', **kwds):
- import os
- if hasattr(self, '_assigned_source'):
- raise ValueError("set_source() cannot be called several times "
- "per ffi object")
- if not isinstance(module_name, basestring):
- raise TypeError("'module_name' must be a string")
- if os.sep in module_name or (os.altsep and os.altsep in module_name):
- raise ValueError("'module_name' must not contain '/': use a dotted "
- "name to make a 'package.module' location")
- self._assigned_source = (str(module_name), source,
- source_extension, kwds)
-
- def set_source_pkgconfig(self, module_name, pkgconfig_libs, source,
- source_extension='.c', **kwds):
- from . import pkgconfig
- if not isinstance(pkgconfig_libs, list):
- raise TypeError("the pkgconfig_libs argument must be a list "
- "of package names")
- kwds2 = pkgconfig.flags_from_pkgconfig(pkgconfig_libs)
- pkgconfig.merge_flags(kwds, kwds2)
- self.set_source(module_name, source, source_extension, **kwds)
-
- def distutils_extension(self, tmpdir='build', verbose=True):
- from distutils.dir_util import mkpath
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- if hasattr(self, 'verifier'): # fallback, 'tmpdir' ignored
- return self.verifier.get_extension()
- raise ValueError("set_source() must be called before"
- " distutils_extension()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is None:
- raise TypeError("distutils_extension() is only for C extension "
- "modules, not for dlopen()-style pure Python "
- "modules")
- mkpath(tmpdir)
- ext, updated = recompile(self, module_name,
- source, tmpdir=tmpdir, extradir=tmpdir,
- source_extension=source_extension,
- call_c_compiler=False, **kwds)
- if verbose:
- if updated:
- sys.stderr.write("regenerated: %r\n" % (ext.sources[0],))
- else:
- sys.stderr.write("not modified: %r\n" % (ext.sources[0],))
- return ext
-
- def emit_c_code(self, filename):
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before emit_c_code()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is None:
- raise TypeError("emit_c_code() is only for C extension modules, "
- "not for dlopen()-style pure Python modules")
- recompile(self, module_name, source,
- c_file=filename, call_c_compiler=False, **kwds)
-
- def emit_python_code(self, filename):
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before emit_c_code()")
- module_name, source, source_extension, kwds = self._assigned_source
- if source is not None:
- raise TypeError("emit_python_code() is only for dlopen()-style "
- "pure Python modules, not for C extension modules")
- recompile(self, module_name, source,
- c_file=filename, call_c_compiler=False, **kwds)
-
- def compile(self, tmpdir='.', verbose=0, target=None, debug=None):
- """The 'target' argument gives the final file name of the
- compiled DLL. Use '*' to force distutils' choice, suitable for
- regular CPython C API modules. Use a file name ending in '.*'
- to ask for the system's default extension for dynamic libraries
- (.so/.dll/.dylib).
-
- The default is '*' when building a non-embedded C API extension,
- and (module_name + '.*') when building an embedded library.
- """
- from .recompiler import recompile
- #
- if not hasattr(self, '_assigned_source'):
- raise ValueError("set_source() must be called before compile()")
- module_name, source, source_extension, kwds = self._assigned_source
- return recompile(self, module_name, source, tmpdir=tmpdir,
- target=target, source_extension=source_extension,
- compiler_verbose=verbose, debug=debug, **kwds)
-
- def init_once(self, func, tag):
- # Read _init_once_cache[tag], which is either (False, lock) if
- # we're calling the function now in some thread, or (True, result).
- # Don't call setdefault() in most cases, to avoid allocating and
- # immediately freeing a lock; but still use setdefaut() to avoid
- # races.
- try:
- x = self._init_once_cache[tag]
- except KeyError:
- x = self._init_once_cache.setdefault(tag, (False, allocate_lock()))
- # Common case: we got (True, result), so we return the result.
- if x[0]:
- return x[1]
- # Else, it's a lock. Acquire it to serialize the following tests.
- with x[1]:
- # Read again from _init_once_cache the current status.
- x = self._init_once_cache[tag]
- if x[0]:
- return x[1]
- # Call the function and store the result back.
- result = func()
- self._init_once_cache[tag] = (True, result)
- return result
-
- def embedding_init_code(self, pysource):
- if self._embedding:
- raise ValueError("embedding_init_code() can only be called once")
- # fix 'pysource' before it gets dumped into the C file:
- # - remove empty lines at the beginning, so it starts at "line 1"
- # - dedent, if all non-empty lines are indented
- # - check for SyntaxErrors
- import re
- match = re.match(r'\s*\n', pysource)
- if match:
- pysource = pysource[match.end():]
- lines = pysource.splitlines() or ['']
- prefix = re.match(r'\s*', lines[0]).group()
- for i in range(1, len(lines)):
- line = lines[i]
- if line.rstrip():
- while not line.startswith(prefix):
- prefix = prefix[:-1]
- i = len(prefix)
- lines = [line[i:]+'\n' for line in lines]
- pysource = ''.join(lines)
- #
- compile(pysource, "cffi_init", "exec")
- #
- self._embedding = pysource
-
- def def_extern(self, *args, **kwds):
- raise ValueError("ffi.def_extern() is only available on API-mode FFI "
- "objects")
-
- def list_types(self):
- """Returns the user type names known to this FFI instance.
- This returns a tuple containing three lists of names:
- (typedef_names, names_of_structs, names_of_unions)
- """
- typedefs = []
- structs = []
- unions = []
- for key in self._parser._declarations:
- if key.startswith('typedef '):
- typedefs.append(key[8:])
- elif key.startswith('struct '):
- structs.append(key[7:])
- elif key.startswith('union '):
- unions.append(key[6:])
- typedefs.sort()
- structs.sort()
- unions.sort()
- return (typedefs, structs, unions)
-
-
-def _load_backend_lib(backend, name, flags):
- import os
- if not isinstance(name, basestring):
- if sys.platform != "win32" or name is not None:
- return backend.load_library(name, flags)
- name = "c" # Windows: load_library(None) fails, but this works
- # on Python 2 (backward compatibility hack only)
- first_error = None
- if '.' in name or '/' in name or os.sep in name:
- try:
- return backend.load_library(name, flags)
- except OSError as e:
- first_error = e
- import ctypes.util
- path = ctypes.util.find_library(name)
- if path is None:
- if name == "c" and sys.platform == "win32" and sys.version_info >= (3,):
- raise OSError("dlopen(None) cannot work on Windows for Python 3 "
- "(see http://bugs.python.org/issue23606)")
- msg = ("ctypes.util.find_library() did not manage "
- "to locate a library called %r" % (name,))
- if first_error is not None:
- msg = "%s. Additionally, %s" % (first_error, msg)
- raise OSError(msg)
- return backend.load_library(path, flags)
-
-def _make_ffi_library(ffi, libname, flags):
- backend = ffi._backend
- backendlib = _load_backend_lib(backend, libname, flags)
- #
- def accessor_function(name):
- key = 'function ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- value = backendlib.load_function(BType, name)
- library.__dict__[name] = value
- #
- def accessor_variable(name):
- key = 'variable ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- read_variable = backendlib.read_variable
- write_variable = backendlib.write_variable
- setattr(FFILibrary, name, property(
- lambda self: read_variable(BType, name),
- lambda self, value: write_variable(BType, name, value)))
- #
- def addressof_var(name):
- try:
- return addr_variables[name]
- except KeyError:
- with ffi._lock:
- if name not in addr_variables:
- key = 'variable ' + name
- tp, _ = ffi._parser._declarations[key]
- BType = ffi._get_cached_btype(tp)
- if BType.kind != 'array':
- BType = model.pointer_cache(ffi, BType)
- p = backendlib.load_function(BType, name)
- addr_variables[name] = p
- return addr_variables[name]
- #
- def accessor_constant(name):
- raise NotImplementedError("non-integer constant '%s' cannot be "
- "accessed from a dlopen() library" % (name,))
- #
- def accessor_int_constant(name):
- library.__dict__[name] = ffi._parser._int_constants[name]
- #
- accessors = {}
- accessors_version = [False]
- addr_variables = {}
- #
- def update_accessors():
- if accessors_version[0] is ffi._cdef_version:
- return
- #
- for key, (tp, _) in ffi._parser._declarations.items():
- if not isinstance(tp, model.EnumType):
- tag, name = key.split(' ', 1)
- if tag == 'function':
- accessors[name] = accessor_function
- elif tag == 'variable':
- accessors[name] = accessor_variable
- elif tag == 'constant':
- accessors[name] = accessor_constant
- else:
- for i, enumname in enumerate(tp.enumerators):
- def accessor_enum(name, tp=tp, i=i):
- tp.check_not_partial()
- library.__dict__[name] = tp.enumvalues[i]
- accessors[enumname] = accessor_enum
- for name in ffi._parser._int_constants:
- accessors.setdefault(name, accessor_int_constant)
- accessors_version[0] = ffi._cdef_version
- #
- def make_accessor(name):
- with ffi._lock:
- if name in library.__dict__ or name in FFILibrary.__dict__:
- return # added by another thread while waiting for the lock
- if name not in accessors:
- update_accessors()
- if name not in accessors:
- raise AttributeError(name)
- accessors[name](name)
- #
- class FFILibrary(object):
- def __getattr__(self, name):
- make_accessor(name)
- return getattr(self, name)
- def __setattr__(self, name, value):
- try:
- property = getattr(self.__class__, name)
- except AttributeError:
- make_accessor(name)
- setattr(self, name, value)
- else:
- property.__set__(self, value)
- def __dir__(self):
- with ffi._lock:
- update_accessors()
- return accessors.keys()
- def __addressof__(self, name):
- if name in library.__dict__:
- return library.__dict__[name]
- if name in FFILibrary.__dict__:
- return addressof_var(name)
- make_accessor(name)
- if name in library.__dict__:
- return library.__dict__[name]
- if name in FFILibrary.__dict__:
- return addressof_var(name)
- raise AttributeError("cffi library has no function or "
- "global variable named '%s'" % (name,))
- def __cffi_close__(self):
- backendlib.close_lib()
- self.__dict__.clear()
- #
- if isinstance(libname, basestring):
- try:
- if not isinstance(libname, str): # unicode, on Python 2
- libname = libname.encode('utf-8')
- FFILibrary.__name__ = 'FFILibrary_%s' % libname
- except UnicodeError:
- pass
- library = FFILibrary()
- return library, library.__dict__
-
-def _builtin_function_type(func):
- # a hack to make at least ffi.typeof(builtin_function) work,
- # if the builtin function was obtained by 'vengine_cpy'.
- import sys
- try:
- module = sys.modules[func.__module__]
- ffi = module._cffi_original_ffi
- types_of_builtin_funcs = module._cffi_types_of_builtin_funcs
- tp = types_of_builtin_funcs[func]
- except (KeyError, AttributeError, TypeError):
- return None
- else:
- with ffi._lock:
- return ffi._get_cached_btype(tp)
diff --git a/resources/python/bin/3.7/mac/cffi/backend_ctypes.py b/resources/python/bin/3.7/mac/cffi/backend_ctypes.py
deleted file mode 100644
index e7956a79c..000000000
--- a/resources/python/bin/3.7/mac/cffi/backend_ctypes.py
+++ /dev/null
@@ -1,1121 +0,0 @@
-import ctypes, ctypes.util, operator, sys
-from . import model
-
-if sys.version_info < (3,):
- bytechr = chr
-else:
- unicode = str
- long = int
- xrange = range
- bytechr = lambda num: bytes([num])
-
-class CTypesType(type):
- pass
-
-class CTypesData(object):
- __metaclass__ = CTypesType
- __slots__ = ['__weakref__']
- __name__ = ''
-
- def __init__(self, *args):
- raise TypeError("cannot instantiate %r" % (self.__class__,))
-
- @classmethod
- def _newp(cls, init):
- raise TypeError("expected a pointer or array ctype, got '%s'"
- % (cls._get_c_name(),))
-
- @staticmethod
- def _to_ctypes(value):
- raise TypeError
-
- @classmethod
- def _arg_to_ctypes(cls, *value):
- try:
- ctype = cls._ctype
- except AttributeError:
- raise TypeError("cannot create an instance of %r" % (cls,))
- if value:
- res = cls._to_ctypes(*value)
- if not isinstance(res, ctype):
- res = cls._ctype(res)
- else:
- res = cls._ctype()
- return res
-
- @classmethod
- def _create_ctype_obj(cls, init):
- if init is None:
- return cls._arg_to_ctypes()
- else:
- return cls._arg_to_ctypes(init)
-
- @staticmethod
- def _from_ctypes(ctypes_value):
- raise TypeError
-
- @classmethod
- def _get_c_name(cls, replace_with=''):
- return cls._reftypename.replace(' &', replace_with)
-
- @classmethod
- def _fix_class(cls):
- cls.__name__ = 'CData<%s>' % (cls._get_c_name(),)
- cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),)
- cls.__module__ = 'ffi'
-
- def _get_own_repr(self):
- raise NotImplementedError
-
- def _addr_repr(self, address):
- if address == 0:
- return 'NULL'
- else:
- if address < 0:
- address += 1 << (8*ctypes.sizeof(ctypes.c_void_p))
- return '0x%x' % address
-
- def __repr__(self, c_name=None):
- own = self._get_own_repr()
- return '' % (c_name or self._get_c_name(), own)
-
- def _convert_to_address(self, BClass):
- if BClass is None:
- raise TypeError("cannot convert %r to an address" % (
- self._get_c_name(),))
- else:
- raise TypeError("cannot convert %r to %r" % (
- self._get_c_name(), BClass._get_c_name()))
-
- @classmethod
- def _get_size(cls):
- return ctypes.sizeof(cls._ctype)
-
- def _get_size_of_instance(self):
- return ctypes.sizeof(self._ctype)
-
- @classmethod
- def _cast_from(cls, source):
- raise TypeError("cannot cast to %r" % (cls._get_c_name(),))
-
- def _cast_to_integer(self):
- return self._convert_to_address(None)
-
- @classmethod
- def _alignment(cls):
- return ctypes.alignment(cls._ctype)
-
- def __iter__(self):
- raise TypeError("cdata %r does not support iteration" % (
- self._get_c_name()),)
-
- def _make_cmp(name):
- cmpfunc = getattr(operator, name)
- def cmp(self, other):
- v_is_ptr = not isinstance(self, CTypesGenericPrimitive)
- w_is_ptr = (isinstance(other, CTypesData) and
- not isinstance(other, CTypesGenericPrimitive))
- if v_is_ptr and w_is_ptr:
- return cmpfunc(self._convert_to_address(None),
- other._convert_to_address(None))
- elif v_is_ptr or w_is_ptr:
- return NotImplemented
- else:
- if isinstance(self, CTypesGenericPrimitive):
- self = self._value
- if isinstance(other, CTypesGenericPrimitive):
- other = other._value
- return cmpfunc(self, other)
- cmp.func_name = name
- return cmp
-
- __eq__ = _make_cmp('__eq__')
- __ne__ = _make_cmp('__ne__')
- __lt__ = _make_cmp('__lt__')
- __le__ = _make_cmp('__le__')
- __gt__ = _make_cmp('__gt__')
- __ge__ = _make_cmp('__ge__')
-
- def __hash__(self):
- return hash(self._convert_to_address(None))
-
- def _to_string(self, maxlen):
- raise TypeError("string(): %r" % (self,))
-
-
-class CTypesGenericPrimitive(CTypesData):
- __slots__ = []
-
- def __hash__(self):
- return hash(self._value)
-
- def _get_own_repr(self):
- return repr(self._from_ctypes(self._value))
-
-
-class CTypesGenericArray(CTypesData):
- __slots__ = []
-
- @classmethod
- def _newp(cls, init):
- return cls(init)
-
- def __iter__(self):
- for i in xrange(len(self)):
- yield self[i]
-
- def _get_own_repr(self):
- return self._addr_repr(ctypes.addressof(self._blob))
-
-
-class CTypesGenericPtr(CTypesData):
- __slots__ = ['_address', '_as_ctype_ptr']
- _automatic_casts = False
- kind = "pointer"
-
- @classmethod
- def _newp(cls, init):
- return cls(init)
-
- @classmethod
- def _cast_from(cls, source):
- if source is None:
- address = 0
- elif isinstance(source, CTypesData):
- address = source._cast_to_integer()
- elif isinstance(source, (int, long)):
- address = source
- else:
- raise TypeError("bad type for cast to %r: %r" %
- (cls, type(source).__name__))
- return cls._new_pointer_at(address)
-
- @classmethod
- def _new_pointer_at(cls, address):
- self = cls.__new__(cls)
- self._address = address
- self._as_ctype_ptr = ctypes.cast(address, cls._ctype)
- return self
-
- def _get_own_repr(self):
- try:
- return self._addr_repr(self._address)
- except AttributeError:
- return '???'
-
- def _cast_to_integer(self):
- return self._address
-
- def __nonzero__(self):
- return bool(self._address)
- __bool__ = __nonzero__
-
- @classmethod
- def _to_ctypes(cls, value):
- if not isinstance(value, CTypesData):
- raise TypeError("unexpected %s object" % type(value).__name__)
- address = value._convert_to_address(cls)
- return ctypes.cast(address, cls._ctype)
-
- @classmethod
- def _from_ctypes(cls, ctypes_ptr):
- address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0
- return cls._new_pointer_at(address)
-
- @classmethod
- def _initialize(cls, ctypes_ptr, value):
- if value:
- ctypes_ptr.contents = cls._to_ctypes(value).contents
-
- def _convert_to_address(self, BClass):
- if (BClass in (self.__class__, None) or BClass._automatic_casts
- or self._automatic_casts):
- return self._address
- else:
- return CTypesData._convert_to_address(self, BClass)
-
-
-class CTypesBaseStructOrUnion(CTypesData):
- __slots__ = ['_blob']
-
- @classmethod
- def _create_ctype_obj(cls, init):
- # may be overridden
- raise TypeError("cannot instantiate opaque type %s" % (cls,))
-
- def _get_own_repr(self):
- return self._addr_repr(ctypes.addressof(self._blob))
-
- @classmethod
- def _offsetof(cls, fieldname):
- return getattr(cls._ctype, fieldname).offset
-
- def _convert_to_address(self, BClass):
- if getattr(BClass, '_BItem', None) is self.__class__:
- return ctypes.addressof(self._blob)
- else:
- return CTypesData._convert_to_address(self, BClass)
-
- @classmethod
- def _from_ctypes(cls, ctypes_struct_or_union):
- self = cls.__new__(cls)
- self._blob = ctypes_struct_or_union
- return self
-
- @classmethod
- def _to_ctypes(cls, value):
- return value._blob
-
- def __repr__(self, c_name=None):
- return CTypesData.__repr__(self, c_name or self._get_c_name(' &'))
-
-
-class CTypesBackend(object):
-
- PRIMITIVE_TYPES = {
- 'char': ctypes.c_char,
- 'short': ctypes.c_short,
- 'int': ctypes.c_int,
- 'long': ctypes.c_long,
- 'long long': ctypes.c_longlong,
- 'signed char': ctypes.c_byte,
- 'unsigned char': ctypes.c_ubyte,
- 'unsigned short': ctypes.c_ushort,
- 'unsigned int': ctypes.c_uint,
- 'unsigned long': ctypes.c_ulong,
- 'unsigned long long': ctypes.c_ulonglong,
- 'float': ctypes.c_float,
- 'double': ctypes.c_double,
- '_Bool': ctypes.c_bool,
- }
-
- for _name in ['unsigned long long', 'unsigned long',
- 'unsigned int', 'unsigned short', 'unsigned char']:
- _size = ctypes.sizeof(PRIMITIVE_TYPES[_name])
- PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_void_p):
- PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_size_t):
- PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name]
-
- for _name in ['long long', 'long', 'int', 'short', 'signed char']:
- _size = ctypes.sizeof(PRIMITIVE_TYPES[_name])
- PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_void_p):
- PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name]
- PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name]
- if _size == ctypes.sizeof(ctypes.c_size_t):
- PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name]
-
-
- def __init__(self):
- self.RTLD_LAZY = 0 # not supported anyway by ctypes
- self.RTLD_NOW = 0
- self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL
- self.RTLD_LOCAL = ctypes.RTLD_LOCAL
-
- def set_ffi(self, ffi):
- self.ffi = ffi
-
- def _get_types(self):
- return CTypesData, CTypesType
-
- def load_library(self, path, flags=0):
- cdll = ctypes.CDLL(path, flags)
- return CTypesLibrary(self, cdll)
-
- def new_void_type(self):
- class CTypesVoid(CTypesData):
- __slots__ = []
- _reftypename = 'void &'
- @staticmethod
- def _from_ctypes(novalue):
- return None
- @staticmethod
- def _to_ctypes(novalue):
- if novalue is not None:
- raise TypeError("None expected, got %s object" %
- (type(novalue).__name__,))
- return None
- CTypesVoid._fix_class()
- return CTypesVoid
-
- def new_primitive_type(self, name):
- if name == 'wchar_t':
- raise NotImplementedError(name)
- ctype = self.PRIMITIVE_TYPES[name]
- if name == 'char':
- kind = 'char'
- elif name in ('float', 'double'):
- kind = 'float'
- else:
- if name in ('signed char', 'unsigned char'):
- kind = 'byte'
- elif name == '_Bool':
- kind = 'bool'
- else:
- kind = 'int'
- is_signed = (ctype(-1).value == -1)
- #
- def _cast_source_to_int(source):
- if isinstance(source, (int, long, float)):
- source = int(source)
- elif isinstance(source, CTypesData):
- source = source._cast_to_integer()
- elif isinstance(source, bytes):
- source = ord(source)
- elif source is None:
- source = 0
- else:
- raise TypeError("bad type for cast to %r: %r" %
- (CTypesPrimitive, type(source).__name__))
- return source
- #
- kind1 = kind
- class CTypesPrimitive(CTypesGenericPrimitive):
- __slots__ = ['_value']
- _ctype = ctype
- _reftypename = '%s &' % name
- kind = kind1
-
- def __init__(self, value):
- self._value = value
-
- @staticmethod
- def _create_ctype_obj(init):
- if init is None:
- return ctype()
- return ctype(CTypesPrimitive._to_ctypes(init))
-
- if kind == 'int' or kind == 'byte':
- @classmethod
- def _cast_from(cls, source):
- source = _cast_source_to_int(source)
- source = ctype(source).value # cast within range
- return cls(source)
- def __int__(self):
- return self._value
-
- if kind == 'bool':
- @classmethod
- def _cast_from(cls, source):
- if not isinstance(source, (int, long, float)):
- source = _cast_source_to_int(source)
- return cls(bool(source))
- def __int__(self):
- return int(self._value)
-
- if kind == 'char':
- @classmethod
- def _cast_from(cls, source):
- source = _cast_source_to_int(source)
- source = bytechr(source & 0xFF)
- return cls(source)
- def __int__(self):
- return ord(self._value)
-
- if kind == 'float':
- @classmethod
- def _cast_from(cls, source):
- if isinstance(source, float):
- pass
- elif isinstance(source, CTypesGenericPrimitive):
- if hasattr(source, '__float__'):
- source = float(source)
- else:
- source = int(source)
- else:
- source = _cast_source_to_int(source)
- source = ctype(source).value # fix precision
- return cls(source)
- def __int__(self):
- return int(self._value)
- def __float__(self):
- return self._value
-
- _cast_to_integer = __int__
-
- if kind == 'int' or kind == 'byte' or kind == 'bool':
- @staticmethod
- def _to_ctypes(x):
- if not isinstance(x, (int, long)):
- if isinstance(x, CTypesData):
- x = int(x)
- else:
- raise TypeError("integer expected, got %s" %
- type(x).__name__)
- if ctype(x).value != x:
- if not is_signed and x < 0:
- raise OverflowError("%s: negative integer" % name)
- else:
- raise OverflowError("%s: integer out of bounds"
- % name)
- return x
-
- if kind == 'char':
- @staticmethod
- def _to_ctypes(x):
- if isinstance(x, bytes) and len(x) == 1:
- return x
- if isinstance(x, CTypesPrimitive): # >
- return x._value
- raise TypeError("character expected, got %s" %
- type(x).__name__)
- def __nonzero__(self):
- return ord(self._value) != 0
- else:
- def __nonzero__(self):
- return self._value != 0
- __bool__ = __nonzero__
-
- if kind == 'float':
- @staticmethod
- def _to_ctypes(x):
- if not isinstance(x, (int, long, float, CTypesData)):
- raise TypeError("float expected, got %s" %
- type(x).__name__)
- return ctype(x).value
-
- @staticmethod
- def _from_ctypes(value):
- return getattr(value, 'value', value)
-
- @staticmethod
- def _initialize(blob, init):
- blob.value = CTypesPrimitive._to_ctypes(init)
-
- if kind == 'char':
- def _to_string(self, maxlen):
- return self._value
- if kind == 'byte':
- def _to_string(self, maxlen):
- return chr(self._value & 0xff)
- #
- CTypesPrimitive._fix_class()
- return CTypesPrimitive
-
- def new_pointer_type(self, BItem):
- getbtype = self.ffi._get_cached_btype
- if BItem is getbtype(model.PrimitiveType('char')):
- kind = 'charp'
- elif BItem in (getbtype(model.PrimitiveType('signed char')),
- getbtype(model.PrimitiveType('unsigned char'))):
- kind = 'bytep'
- elif BItem is getbtype(model.void_type):
- kind = 'voidp'
- else:
- kind = 'generic'
- #
- class CTypesPtr(CTypesGenericPtr):
- __slots__ = ['_own']
- if kind == 'charp':
- __slots__ += ['__as_strbuf']
- _BItem = BItem
- if hasattr(BItem, '_ctype'):
- _ctype = ctypes.POINTER(BItem._ctype)
- _bitem_size = ctypes.sizeof(BItem._ctype)
- else:
- _ctype = ctypes.c_void_p
- if issubclass(BItem, CTypesGenericArray):
- _reftypename = BItem._get_c_name('(* &)')
- else:
- _reftypename = BItem._get_c_name(' * &')
-
- def __init__(self, init):
- ctypeobj = BItem._create_ctype_obj(init)
- if kind == 'charp':
- self.__as_strbuf = ctypes.create_string_buffer(
- ctypeobj.value + b'\x00')
- self._as_ctype_ptr = ctypes.cast(
- self.__as_strbuf, self._ctype)
- else:
- self._as_ctype_ptr = ctypes.pointer(ctypeobj)
- self._address = ctypes.cast(self._as_ctype_ptr,
- ctypes.c_void_p).value
- self._own = True
-
- def __add__(self, other):
- if isinstance(other, (int, long)):
- return self._new_pointer_at(self._address +
- other * self._bitem_size)
- else:
- return NotImplemented
-
- def __sub__(self, other):
- if isinstance(other, (int, long)):
- return self._new_pointer_at(self._address -
- other * self._bitem_size)
- elif type(self) is type(other):
- return (self._address - other._address) // self._bitem_size
- else:
- return NotImplemented
-
- def __getitem__(self, index):
- if getattr(self, '_own', False) and index != 0:
- raise IndexError
- return BItem._from_ctypes(self._as_ctype_ptr[index])
-
- def __setitem__(self, index, value):
- self._as_ctype_ptr[index] = BItem._to_ctypes(value)
-
- if kind == 'charp' or kind == 'voidp':
- @classmethod
- def _arg_to_ctypes(cls, *value):
- if value and isinstance(value[0], bytes):
- return ctypes.c_char_p(value[0])
- else:
- return super(CTypesPtr, cls)._arg_to_ctypes(*value)
-
- if kind == 'charp' or kind == 'bytep':
- def _to_string(self, maxlen):
- if maxlen < 0:
- maxlen = sys.maxsize
- p = ctypes.cast(self._as_ctype_ptr,
- ctypes.POINTER(ctypes.c_char))
- n = 0
- while n < maxlen and p[n] != b'\x00':
- n += 1
- return b''.join([p[i] for i in range(n)])
-
- def _get_own_repr(self):
- if getattr(self, '_own', False):
- return 'owning %d bytes' % (
- ctypes.sizeof(self._as_ctype_ptr.contents),)
- return super(CTypesPtr, self)._get_own_repr()
- #
- if (BItem is self.ffi._get_cached_btype(model.void_type) or
- BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))):
- CTypesPtr._automatic_casts = True
- #
- CTypesPtr._fix_class()
- return CTypesPtr
-
- def new_array_type(self, CTypesPtr, length):
- if length is None:
- brackets = ' &[]'
- else:
- brackets = ' &[%d]' % length
- BItem = CTypesPtr._BItem
- getbtype = self.ffi._get_cached_btype
- if BItem is getbtype(model.PrimitiveType('char')):
- kind = 'char'
- elif BItem in (getbtype(model.PrimitiveType('signed char')),
- getbtype(model.PrimitiveType('unsigned char'))):
- kind = 'byte'
- else:
- kind = 'generic'
- #
- class CTypesArray(CTypesGenericArray):
- __slots__ = ['_blob', '_own']
- if length is not None:
- _ctype = BItem._ctype * length
- else:
- __slots__.append('_ctype')
- _reftypename = BItem._get_c_name(brackets)
- _declared_length = length
- _CTPtr = CTypesPtr
-
- def __init__(self, init):
- if length is None:
- if isinstance(init, (int, long)):
- len1 = init
- init = None
- elif kind == 'char' and isinstance(init, bytes):
- len1 = len(init) + 1 # extra null
- else:
- init = tuple(init)
- len1 = len(init)
- self._ctype = BItem._ctype * len1
- self._blob = self._ctype()
- self._own = True
- if init is not None:
- self._initialize(self._blob, init)
-
- @staticmethod
- def _initialize(blob, init):
- if isinstance(init, bytes):
- init = [init[i:i+1] for i in range(len(init))]
- else:
- if isinstance(init, CTypesGenericArray):
- if (len(init) != len(blob) or
- not isinstance(init, CTypesArray)):
- raise TypeError("length/type mismatch: %s" % (init,))
- init = tuple(init)
- if len(init) > len(blob):
- raise IndexError("too many initializers")
- addr = ctypes.cast(blob, ctypes.c_void_p).value
- PTR = ctypes.POINTER(BItem._ctype)
- itemsize = ctypes.sizeof(BItem._ctype)
- for i, value in enumerate(init):
- p = ctypes.cast(addr + i * itemsize, PTR)
- BItem._initialize(p.contents, value)
-
- def __len__(self):
- return len(self._blob)
-
- def __getitem__(self, index):
- if not (0 <= index < len(self._blob)):
- raise IndexError
- return BItem._from_ctypes(self._blob[index])
-
- def __setitem__(self, index, value):
- if not (0 <= index < len(self._blob)):
- raise IndexError
- self._blob[index] = BItem._to_ctypes(value)
-
- if kind == 'char' or kind == 'byte':
- def _to_string(self, maxlen):
- if maxlen < 0:
- maxlen = len(self._blob)
- p = ctypes.cast(self._blob,
- ctypes.POINTER(ctypes.c_char))
- n = 0
- while n < maxlen and p[n] != b'\x00':
- n += 1
- return b''.join([p[i] for i in range(n)])
-
- def _get_own_repr(self):
- if getattr(self, '_own', False):
- return 'owning %d bytes' % (ctypes.sizeof(self._blob),)
- return super(CTypesArray, self)._get_own_repr()
-
- def _convert_to_address(self, BClass):
- if BClass in (CTypesPtr, None) or BClass._automatic_casts:
- return ctypes.addressof(self._blob)
- else:
- return CTypesData._convert_to_address(self, BClass)
-
- @staticmethod
- def _from_ctypes(ctypes_array):
- self = CTypesArray.__new__(CTypesArray)
- self._blob = ctypes_array
- return self
-
- @staticmethod
- def _arg_to_ctypes(value):
- return CTypesPtr._arg_to_ctypes(value)
-
- def __add__(self, other):
- if isinstance(other, (int, long)):
- return CTypesPtr._new_pointer_at(
- ctypes.addressof(self._blob) +
- other * ctypes.sizeof(BItem._ctype))
- else:
- return NotImplemented
-
- @classmethod
- def _cast_from(cls, source):
- raise NotImplementedError("casting to %r" % (
- cls._get_c_name(),))
- #
- CTypesArray._fix_class()
- return CTypesArray
-
- def _new_struct_or_union(self, kind, name, base_ctypes_class):
- #
- class struct_or_union(base_ctypes_class):
- pass
- struct_or_union.__name__ = '%s_%s' % (kind, name)
- kind1 = kind
- #
- class CTypesStructOrUnion(CTypesBaseStructOrUnion):
- __slots__ = ['_blob']
- _ctype = struct_or_union
- _reftypename = '%s &' % (name,)
- _kind = kind = kind1
- #
- CTypesStructOrUnion._fix_class()
- return CTypesStructOrUnion
-
- def new_struct_type(self, name):
- return self._new_struct_or_union('struct', name, ctypes.Structure)
-
- def new_union_type(self, name):
- return self._new_struct_or_union('union', name, ctypes.Union)
-
- def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp,
- totalsize=-1, totalalignment=-1, sflags=0,
- pack=0):
- if totalsize >= 0 or totalalignment >= 0:
- raise NotImplementedError("the ctypes backend of CFFI does not support "
- "structures completed by verify(); please "
- "compile and install the _cffi_backend module.")
- struct_or_union = CTypesStructOrUnion._ctype
- fnames = [fname for (fname, BField, bitsize) in fields]
- btypes = [BField for (fname, BField, bitsize) in fields]
- bitfields = [bitsize for (fname, BField, bitsize) in fields]
- #
- bfield_types = {}
- cfields = []
- for (fname, BField, bitsize) in fields:
- if bitsize < 0:
- cfields.append((fname, BField._ctype))
- bfield_types[fname] = BField
- else:
- cfields.append((fname, BField._ctype, bitsize))
- bfield_types[fname] = Ellipsis
- if sflags & 8:
- struct_or_union._pack_ = 1
- elif pack:
- struct_or_union._pack_ = pack
- struct_or_union._fields_ = cfields
- CTypesStructOrUnion._bfield_types = bfield_types
- #
- @staticmethod
- def _create_ctype_obj(init):
- result = struct_or_union()
- if init is not None:
- initialize(result, init)
- return result
- CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj
- #
- def initialize(blob, init):
- if is_union:
- if len(init) > 1:
- raise ValueError("union initializer: %d items given, but "
- "only one supported (use a dict if needed)"
- % (len(init),))
- if not isinstance(init, dict):
- if isinstance(init, (bytes, unicode)):
- raise TypeError("union initializer: got a str")
- init = tuple(init)
- if len(init) > len(fnames):
- raise ValueError("too many values for %s initializer" %
- CTypesStructOrUnion._get_c_name())
- init = dict(zip(fnames, init))
- addr = ctypes.addressof(blob)
- for fname, value in init.items():
- BField, bitsize = name2fieldtype[fname]
- assert bitsize < 0, \
- "not implemented: initializer with bit fields"
- offset = CTypesStructOrUnion._offsetof(fname)
- PTR = ctypes.POINTER(BField._ctype)
- p = ctypes.cast(addr + offset, PTR)
- BField._initialize(p.contents, value)
- is_union = CTypesStructOrUnion._kind == 'union'
- name2fieldtype = dict(zip(fnames, zip(btypes, bitfields)))
- #
- for fname, BField, bitsize in fields:
- if fname == '':
- raise NotImplementedError("nested anonymous structs/unions")
- if hasattr(CTypesStructOrUnion, fname):
- raise ValueError("the field name %r conflicts in "
- "the ctypes backend" % fname)
- if bitsize < 0:
- def getter(self, fname=fname, BField=BField,
- offset=CTypesStructOrUnion._offsetof(fname),
- PTR=ctypes.POINTER(BField._ctype)):
- addr = ctypes.addressof(self._blob)
- p = ctypes.cast(addr + offset, PTR)
- return BField._from_ctypes(p.contents)
- def setter(self, value, fname=fname, BField=BField):
- setattr(self._blob, fname, BField._to_ctypes(value))
- #
- if issubclass(BField, CTypesGenericArray):
- setter = None
- if BField._declared_length == 0:
- def getter(self, fname=fname, BFieldPtr=BField._CTPtr,
- offset=CTypesStructOrUnion._offsetof(fname),
- PTR=ctypes.POINTER(BField._ctype)):
- addr = ctypes.addressof(self._blob)
- p = ctypes.cast(addr + offset, PTR)
- return BFieldPtr._from_ctypes(p)
- #
- else:
- def getter(self, fname=fname, BField=BField):
- return BField._from_ctypes(getattr(self._blob, fname))
- def setter(self, value, fname=fname, BField=BField):
- # xxx obscure workaround
- value = BField._to_ctypes(value)
- oldvalue = getattr(self._blob, fname)
- setattr(self._blob, fname, value)
- if value != getattr(self._blob, fname):
- setattr(self._blob, fname, oldvalue)
- raise OverflowError("value too large for bitfield")
- setattr(CTypesStructOrUnion, fname, property(getter, setter))
- #
- CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp))
- for fname in fnames:
- if hasattr(CTypesPtr, fname):
- raise ValueError("the field name %r conflicts in "
- "the ctypes backend" % fname)
- def getter(self, fname=fname):
- return getattr(self[0], fname)
- def setter(self, value, fname=fname):
- setattr(self[0], fname, value)
- setattr(CTypesPtr, fname, property(getter, setter))
-
- def new_function_type(self, BArgs, BResult, has_varargs):
- nameargs = [BArg._get_c_name() for BArg in BArgs]
- if has_varargs:
- nameargs.append('...')
- nameargs = ', '.join(nameargs)
- #
- class CTypesFunctionPtr(CTypesGenericPtr):
- __slots__ = ['_own_callback', '_name']
- _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None),
- *[BArg._ctype for BArg in BArgs],
- use_errno=True)
- _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,))
-
- def __init__(self, init, error=None):
- # create a callback to the Python callable init()
- import traceback
- assert not has_varargs, "varargs not supported for callbacks"
- if getattr(BResult, '_ctype', None) is not None:
- error = BResult._from_ctypes(
- BResult._create_ctype_obj(error))
- else:
- error = None
- def callback(*args):
- args2 = []
- for arg, BArg in zip(args, BArgs):
- args2.append(BArg._from_ctypes(arg))
- try:
- res2 = init(*args2)
- res2 = BResult._to_ctypes(res2)
- except:
- traceback.print_exc()
- res2 = error
- if issubclass(BResult, CTypesGenericPtr):
- if res2:
- res2 = ctypes.cast(res2, ctypes.c_void_p).value
- # .value: http://bugs.python.org/issue1574593
- else:
- res2 = None
- #print repr(res2)
- return res2
- if issubclass(BResult, CTypesGenericPtr):
- # The only pointers callbacks can return are void*s:
- # http://bugs.python.org/issue5710
- callback_ctype = ctypes.CFUNCTYPE(
- ctypes.c_void_p,
- *[BArg._ctype for BArg in BArgs],
- use_errno=True)
- else:
- callback_ctype = CTypesFunctionPtr._ctype
- self._as_ctype_ptr = callback_ctype(callback)
- self._address = ctypes.cast(self._as_ctype_ptr,
- ctypes.c_void_p).value
- self._own_callback = init
-
- @staticmethod
- def _initialize(ctypes_ptr, value):
- if value:
- raise NotImplementedError("ctypes backend: not supported: "
- "initializers for function pointers")
-
- def __repr__(self):
- c_name = getattr(self, '_name', None)
- if c_name:
- i = self._reftypename.index('(* &)')
- if self._reftypename[i-1] not in ' )*':
- c_name = ' ' + c_name
- c_name = self._reftypename.replace('(* &)', c_name)
- return CTypesData.__repr__(self, c_name)
-
- def _get_own_repr(self):
- if getattr(self, '_own_callback', None) is not None:
- return 'calling %r' % (self._own_callback,)
- return super(CTypesFunctionPtr, self)._get_own_repr()
-
- def __call__(self, *args):
- if has_varargs:
- assert len(args) >= len(BArgs)
- extraargs = args[len(BArgs):]
- args = args[:len(BArgs)]
- else:
- assert len(args) == len(BArgs)
- ctypes_args = []
- for arg, BArg in zip(args, BArgs):
- ctypes_args.append(BArg._arg_to_ctypes(arg))
- if has_varargs:
- for i, arg in enumerate(extraargs):
- if arg is None:
- ctypes_args.append(ctypes.c_void_p(0)) # NULL
- continue
- if not isinstance(arg, CTypesData):
- raise TypeError(
- "argument %d passed in the variadic part "
- "needs to be a cdata object (got %s)" %
- (1 + len(BArgs) + i, type(arg).__name__))
- ctypes_args.append(arg._arg_to_ctypes(arg))
- result = self._as_ctype_ptr(*ctypes_args)
- return BResult._from_ctypes(result)
- #
- CTypesFunctionPtr._fix_class()
- return CTypesFunctionPtr
-
- def new_enum_type(self, name, enumerators, enumvalues, CTypesInt):
- assert isinstance(name, str)
- reverse_mapping = dict(zip(reversed(enumvalues),
- reversed(enumerators)))
- #
- class CTypesEnum(CTypesInt):
- __slots__ = []
- _reftypename = '%s &' % name
-
- def _get_own_repr(self):
- value = self._value
- try:
- return '%d: %s' % (value, reverse_mapping[value])
- except KeyError:
- return str(value)
-
- def _to_string(self, maxlen):
- value = self._value
- try:
- return reverse_mapping[value]
- except KeyError:
- return str(value)
- #
- CTypesEnum._fix_class()
- return CTypesEnum
-
- def get_errno(self):
- return ctypes.get_errno()
-
- def set_errno(self, value):
- ctypes.set_errno(value)
-
- def string(self, b, maxlen=-1):
- return b._to_string(maxlen)
-
- def buffer(self, bptr, size=-1):
- raise NotImplementedError("buffer() with ctypes backend")
-
- def sizeof(self, cdata_or_BType):
- if isinstance(cdata_or_BType, CTypesData):
- return cdata_or_BType._get_size_of_instance()
- else:
- assert issubclass(cdata_or_BType, CTypesData)
- return cdata_or_BType._get_size()
-
- def alignof(self, BType):
- assert issubclass(BType, CTypesData)
- return BType._alignment()
-
- def newp(self, BType, source):
- if not issubclass(BType, CTypesData):
- raise TypeError
- return BType._newp(source)
-
- def cast(self, BType, source):
- return BType._cast_from(source)
-
- def callback(self, BType, source, error, onerror):
- assert onerror is None # XXX not implemented
- return BType(source, error)
-
- _weakref_cache_ref = None
-
- def gcp(self, cdata, destructor, size=0):
- if self._weakref_cache_ref is None:
- import weakref
- class MyRef(weakref.ref):
- def __eq__(self, other):
- myref = self()
- return self is other or (
- myref is not None and myref is other())
- def __ne__(self, other):
- return not (self == other)
- def __hash__(self):
- try:
- return self._hash
- except AttributeError:
- self._hash = hash(self())
- return self._hash
- self._weakref_cache_ref = {}, MyRef
- weak_cache, MyRef = self._weakref_cache_ref
-
- if destructor is None:
- try:
- del weak_cache[MyRef(cdata)]
- except KeyError:
- raise TypeError("Can remove destructor only on a object "
- "previously returned by ffi.gc()")
- return None
-
- def remove(k):
- cdata, destructor = weak_cache.pop(k, (None, None))
- if destructor is not None:
- destructor(cdata)
-
- new_cdata = self.cast(self.typeof(cdata), cdata)
- assert new_cdata is not cdata
- weak_cache[MyRef(new_cdata, remove)] = (cdata, destructor)
- return new_cdata
-
- typeof = type
-
- def getcname(self, BType, replace_with):
- return BType._get_c_name(replace_with)
-
- def typeoffsetof(self, BType, fieldname, num=0):
- if isinstance(fieldname, str):
- if num == 0 and issubclass(BType, CTypesGenericPtr):
- BType = BType._BItem
- if not issubclass(BType, CTypesBaseStructOrUnion):
- raise TypeError("expected a struct or union ctype")
- BField = BType._bfield_types[fieldname]
- if BField is Ellipsis:
- raise TypeError("not supported for bitfields")
- return (BField, BType._offsetof(fieldname))
- elif isinstance(fieldname, (int, long)):
- if issubclass(BType, CTypesGenericArray):
- BType = BType._CTPtr
- if not issubclass(BType, CTypesGenericPtr):
- raise TypeError("expected an array or ptr ctype")
- BItem = BType._BItem
- offset = BItem._get_size() * fieldname
- if offset > sys.maxsize:
- raise OverflowError
- return (BItem, offset)
- else:
- raise TypeError(type(fieldname))
-
- def rawaddressof(self, BTypePtr, cdata, offset=None):
- if isinstance(cdata, CTypesBaseStructOrUnion):
- ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata))
- elif isinstance(cdata, CTypesGenericPtr):
- if offset is None or not issubclass(type(cdata)._BItem,
- CTypesBaseStructOrUnion):
- raise TypeError("unexpected cdata type")
- ptr = type(cdata)._to_ctypes(cdata)
- elif isinstance(cdata, CTypesGenericArray):
- ptr = type(cdata)._to_ctypes(cdata)
- else:
- raise TypeError("expected a ")
- if offset:
- ptr = ctypes.cast(
- ctypes.c_void_p(
- ctypes.cast(ptr, ctypes.c_void_p).value + offset),
- type(ptr))
- return BTypePtr._from_ctypes(ptr)
-
-
-class CTypesLibrary(object):
-
- def __init__(self, backend, cdll):
- self.backend = backend
- self.cdll = cdll
-
- def load_function(self, BType, name):
- c_func = getattr(self.cdll, name)
- funcobj = BType._from_ctypes(c_func)
- funcobj._name = name
- return funcobj
-
- def read_variable(self, BType, name):
- try:
- ctypes_obj = BType._ctype.in_dll(self.cdll, name)
- except AttributeError as e:
- raise NotImplementedError(e)
- return BType._from_ctypes(ctypes_obj)
-
- def write_variable(self, BType, name, value):
- new_ctypes_obj = BType._to_ctypes(value)
- ctypes_obj = BType._ctype.in_dll(self.cdll, name)
- ctypes.memmove(ctypes.addressof(ctypes_obj),
- ctypes.addressof(new_ctypes_obj),
- ctypes.sizeof(BType._ctype))
diff --git a/resources/python/bin/3.7/mac/cffi/cffi_opcode.py b/resources/python/bin/3.7/mac/cffi/cffi_opcode.py
deleted file mode 100644
index a0df98d1c..000000000
--- a/resources/python/bin/3.7/mac/cffi/cffi_opcode.py
+++ /dev/null
@@ -1,187 +0,0 @@
-from .error import VerificationError
-
-class CffiOp(object):
- def __init__(self, op, arg):
- self.op = op
- self.arg = arg
-
- def as_c_expr(self):
- if self.op is None:
- assert isinstance(self.arg, str)
- return '(_cffi_opcode_t)(%s)' % (self.arg,)
- classname = CLASS_NAME[self.op]
- return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg)
-
- def as_python_bytes(self):
- if self.op is None and self.arg.isdigit():
- value = int(self.arg) # non-negative: '-' not in self.arg
- if value >= 2**31:
- raise OverflowError("cannot emit %r: limited to 2**31-1"
- % (self.arg,))
- return format_four_bytes(value)
- if isinstance(self.arg, str):
- raise VerificationError("cannot emit to Python: %r" % (self.arg,))
- return format_four_bytes((self.arg << 8) | self.op)
-
- def __str__(self):
- classname = CLASS_NAME.get(self.op, self.op)
- return '(%s %s)' % (classname, self.arg)
-
-def format_four_bytes(num):
- return '\\x%02X\\x%02X\\x%02X\\x%02X' % (
- (num >> 24) & 0xFF,
- (num >> 16) & 0xFF,
- (num >> 8) & 0xFF,
- (num ) & 0xFF)
-
-OP_PRIMITIVE = 1
-OP_POINTER = 3
-OP_ARRAY = 5
-OP_OPEN_ARRAY = 7
-OP_STRUCT_UNION = 9
-OP_ENUM = 11
-OP_FUNCTION = 13
-OP_FUNCTION_END = 15
-OP_NOOP = 17
-OP_BITFIELD = 19
-OP_TYPENAME = 21
-OP_CPYTHON_BLTN_V = 23 # varargs
-OP_CPYTHON_BLTN_N = 25 # noargs
-OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg)
-OP_CONSTANT = 29
-OP_CONSTANT_INT = 31
-OP_GLOBAL_VAR = 33
-OP_DLOPEN_FUNC = 35
-OP_DLOPEN_CONST = 37
-OP_GLOBAL_VAR_F = 39
-OP_EXTERN_PYTHON = 41
-
-PRIM_VOID = 0
-PRIM_BOOL = 1
-PRIM_CHAR = 2
-PRIM_SCHAR = 3
-PRIM_UCHAR = 4
-PRIM_SHORT = 5
-PRIM_USHORT = 6
-PRIM_INT = 7
-PRIM_UINT = 8
-PRIM_LONG = 9
-PRIM_ULONG = 10
-PRIM_LONGLONG = 11
-PRIM_ULONGLONG = 12
-PRIM_FLOAT = 13
-PRIM_DOUBLE = 14
-PRIM_LONGDOUBLE = 15
-
-PRIM_WCHAR = 16
-PRIM_INT8 = 17
-PRIM_UINT8 = 18
-PRIM_INT16 = 19
-PRIM_UINT16 = 20
-PRIM_INT32 = 21
-PRIM_UINT32 = 22
-PRIM_INT64 = 23
-PRIM_UINT64 = 24
-PRIM_INTPTR = 25
-PRIM_UINTPTR = 26
-PRIM_PTRDIFF = 27
-PRIM_SIZE = 28
-PRIM_SSIZE = 29
-PRIM_INT_LEAST8 = 30
-PRIM_UINT_LEAST8 = 31
-PRIM_INT_LEAST16 = 32
-PRIM_UINT_LEAST16 = 33
-PRIM_INT_LEAST32 = 34
-PRIM_UINT_LEAST32 = 35
-PRIM_INT_LEAST64 = 36
-PRIM_UINT_LEAST64 = 37
-PRIM_INT_FAST8 = 38
-PRIM_UINT_FAST8 = 39
-PRIM_INT_FAST16 = 40
-PRIM_UINT_FAST16 = 41
-PRIM_INT_FAST32 = 42
-PRIM_UINT_FAST32 = 43
-PRIM_INT_FAST64 = 44
-PRIM_UINT_FAST64 = 45
-PRIM_INTMAX = 46
-PRIM_UINTMAX = 47
-PRIM_FLOATCOMPLEX = 48
-PRIM_DOUBLECOMPLEX = 49
-PRIM_CHAR16 = 50
-PRIM_CHAR32 = 51
-
-_NUM_PRIM = 52
-_UNKNOWN_PRIM = -1
-_UNKNOWN_FLOAT_PRIM = -2
-_UNKNOWN_LONG_DOUBLE = -3
-
-_IO_FILE_STRUCT = -1
-
-PRIMITIVE_TO_INDEX = {
- 'char': PRIM_CHAR,
- 'short': PRIM_SHORT,
- 'int': PRIM_INT,
- 'long': PRIM_LONG,
- 'long long': PRIM_LONGLONG,
- 'signed char': PRIM_SCHAR,
- 'unsigned char': PRIM_UCHAR,
- 'unsigned short': PRIM_USHORT,
- 'unsigned int': PRIM_UINT,
- 'unsigned long': PRIM_ULONG,
- 'unsigned long long': PRIM_ULONGLONG,
- 'float': PRIM_FLOAT,
- 'double': PRIM_DOUBLE,
- 'long double': PRIM_LONGDOUBLE,
- 'float _Complex': PRIM_FLOATCOMPLEX,
- 'double _Complex': PRIM_DOUBLECOMPLEX,
- '_Bool': PRIM_BOOL,
- 'wchar_t': PRIM_WCHAR,
- 'char16_t': PRIM_CHAR16,
- 'char32_t': PRIM_CHAR32,
- 'int8_t': PRIM_INT8,
- 'uint8_t': PRIM_UINT8,
- 'int16_t': PRIM_INT16,
- 'uint16_t': PRIM_UINT16,
- 'int32_t': PRIM_INT32,
- 'uint32_t': PRIM_UINT32,
- 'int64_t': PRIM_INT64,
- 'uint64_t': PRIM_UINT64,
- 'intptr_t': PRIM_INTPTR,
- 'uintptr_t': PRIM_UINTPTR,
- 'ptrdiff_t': PRIM_PTRDIFF,
- 'size_t': PRIM_SIZE,
- 'ssize_t': PRIM_SSIZE,
- 'int_least8_t': PRIM_INT_LEAST8,
- 'uint_least8_t': PRIM_UINT_LEAST8,
- 'int_least16_t': PRIM_INT_LEAST16,
- 'uint_least16_t': PRIM_UINT_LEAST16,
- 'int_least32_t': PRIM_INT_LEAST32,
- 'uint_least32_t': PRIM_UINT_LEAST32,
- 'int_least64_t': PRIM_INT_LEAST64,
- 'uint_least64_t': PRIM_UINT_LEAST64,
- 'int_fast8_t': PRIM_INT_FAST8,
- 'uint_fast8_t': PRIM_UINT_FAST8,
- 'int_fast16_t': PRIM_INT_FAST16,
- 'uint_fast16_t': PRIM_UINT_FAST16,
- 'int_fast32_t': PRIM_INT_FAST32,
- 'uint_fast32_t': PRIM_UINT_FAST32,
- 'int_fast64_t': PRIM_INT_FAST64,
- 'uint_fast64_t': PRIM_UINT_FAST64,
- 'intmax_t': PRIM_INTMAX,
- 'uintmax_t': PRIM_UINTMAX,
- }
-
-F_UNION = 0x01
-F_CHECK_FIELDS = 0x02
-F_PACKED = 0x04
-F_EXTERNAL = 0x08
-F_OPAQUE = 0x10
-
-G_FLAGS = dict([('_CFFI_' + _key, globals()[_key])
- for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED',
- 'F_EXTERNAL', 'F_OPAQUE']])
-
-CLASS_NAME = {}
-for _name, _value in list(globals().items()):
- if _name.startswith('OP_') and isinstance(_value, int):
- CLASS_NAME[_value] = _name[3:]
diff --git a/resources/python/bin/3.7/mac/cffi/commontypes.py b/resources/python/bin/3.7/mac/cffi/commontypes.py
deleted file mode 100644
index 8ec97c756..000000000
--- a/resources/python/bin/3.7/mac/cffi/commontypes.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import sys
-from . import model
-from .error import FFIError
-
-
-COMMON_TYPES = {}
-
-try:
- # fetch "bool" and all simple Windows types
- from _cffi_backend import _get_common_types
- _get_common_types(COMMON_TYPES)
-except ImportError:
- pass
-
-COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE')
-COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above
-
-for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES:
- if _type.endswith('_t'):
- COMMON_TYPES[_type] = _type
-del _type
-
-_CACHE = {}
-
-def resolve_common_type(parser, commontype):
- try:
- return _CACHE[commontype]
- except KeyError:
- cdecl = COMMON_TYPES.get(commontype, commontype)
- if not isinstance(cdecl, str):
- result, quals = cdecl, 0 # cdecl is already a BaseType
- elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES:
- result, quals = model.PrimitiveType(cdecl), 0
- elif cdecl == 'set-unicode-needed':
- raise FFIError("The Windows type %r is only available after "
- "you call ffi.set_unicode()" % (commontype,))
- else:
- if commontype == cdecl:
- raise FFIError(
- "Unsupported type: %r. Please look at "
- "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations "
- "and file an issue if you think this type should really "
- "be supported." % (commontype,))
- result, quals = parser.parse_type_and_quals(cdecl) # recursive
-
- assert isinstance(result, model.BaseTypeByIdentity)
- _CACHE[commontype] = result, quals
- return result, quals
-
-
-# ____________________________________________________________
-# extra types for Windows (most of them are in commontypes.c)
-
-
-def win_common_types():
- return {
- "UNICODE_STRING": model.StructType(
- "_UNICODE_STRING",
- ["Length",
- "MaximumLength",
- "Buffer"],
- [model.PrimitiveType("unsigned short"),
- model.PrimitiveType("unsigned short"),
- model.PointerType(model.PrimitiveType("wchar_t"))],
- [-1, -1, -1]),
- "PUNICODE_STRING": "UNICODE_STRING *",
- "PCUNICODE_STRING": "const UNICODE_STRING *",
-
- "TBYTE": "set-unicode-needed",
- "TCHAR": "set-unicode-needed",
- "LPCTSTR": "set-unicode-needed",
- "PCTSTR": "set-unicode-needed",
- "LPTSTR": "set-unicode-needed",
- "PTSTR": "set-unicode-needed",
- "PTBYTE": "set-unicode-needed",
- "PTCHAR": "set-unicode-needed",
- }
-
-if sys.platform == 'win32':
- COMMON_TYPES.update(win_common_types())
diff --git a/resources/python/bin/3.7/mac/cffi/cparser.py b/resources/python/bin/3.7/mac/cffi/cparser.py
deleted file mode 100644
index 74830e913..000000000
--- a/resources/python/bin/3.7/mac/cffi/cparser.py
+++ /dev/null
@@ -1,1006 +0,0 @@
-from . import model
-from .commontypes import COMMON_TYPES, resolve_common_type
-from .error import FFIError, CDefError
-try:
- from . import _pycparser as pycparser
-except ImportError:
- import pycparser
-import weakref, re, sys
-
-try:
- if sys.version_info < (3,):
- import thread as _thread
- else:
- import _thread
- lock = _thread.allocate_lock()
-except ImportError:
- lock = None
-
-def _workaround_for_static_import_finders():
- # Issue #392: packaging tools like cx_Freeze can not find these
- # because pycparser uses exec dynamic import. This is an obscure
- # workaround. This function is never called.
- import pycparser.yacctab
- import pycparser.lextab
-
-CDEF_SOURCE_STRING = ""
-_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$",
- re.DOTALL | re.MULTILINE)
-_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)"
- r"\b((?:[^\n\\]|\\.)*?)$",
- re.DOTALL | re.MULTILINE)
-_r_line_directive = re.compile(r"^[ \t]*#[ \t]*(?:line|\d+)\b.*$", re.MULTILINE)
-_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}")
-_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$")
-_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]")
-_r_words = re.compile(r"\w+|\S")
-_parser_cache = None
-_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE)
-_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b")
-_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b")
-_r_cdecl = re.compile(r"\b__cdecl\b")
-_r_extern_python = re.compile(r'\bextern\s*"'
- r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.')
-_r_star_const_space = re.compile( # matches "* const "
- r"[*]\s*((const|volatile|restrict)\b\s*)+")
-_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+"
- r"\.\.\.")
-_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.")
-
-def _get_parser():
- global _parser_cache
- if _parser_cache is None:
- _parser_cache = pycparser.CParser()
- return _parser_cache
-
-def _workaround_for_old_pycparser(csource):
- # Workaround for a pycparser issue (fixed between pycparser 2.10 and
- # 2.14): "char*const***" gives us a wrong syntax tree, the same as
- # for "char***(*const)". This means we can't tell the difference
- # afterwards. But "char(*const(***))" gives us the right syntax
- # tree. The issue only occurs if there are several stars in
- # sequence with no parenthesis inbetween, just possibly qualifiers.
- # Attempt to fix it by adding some parentheses in the source: each
- # time we see "* const" or "* const *", we add an opening
- # parenthesis before each star---the hard part is figuring out where
- # to close them.
- parts = []
- while True:
- match = _r_star_const_space.search(csource)
- if not match:
- break
- #print repr(''.join(parts)+csource), '=>',
- parts.append(csource[:match.start()])
- parts.append('('); closing = ')'
- parts.append(match.group()) # e.g. "* const "
- endpos = match.end()
- if csource.startswith('*', endpos):
- parts.append('('); closing += ')'
- level = 0
- i = endpos
- while i < len(csource):
- c = csource[i]
- if c == '(':
- level += 1
- elif c == ')':
- if level == 0:
- break
- level -= 1
- elif c in ',;=':
- if level == 0:
- break
- i += 1
- csource = csource[endpos:i] + closing + csource[i:]
- #print repr(''.join(parts)+csource)
- parts.append(csource)
- return ''.join(parts)
-
-def _preprocess_extern_python(csource):
- # input: `extern "Python" int foo(int);` or
- # `extern "Python" { int foo(int); }`
- # output:
- # void __cffi_extern_python_start;
- # int foo(int);
- # void __cffi_extern_python_stop;
- #
- # input: `extern "Python+C" int foo(int);`
- # output:
- # void __cffi_extern_python_plus_c_start;
- # int foo(int);
- # void __cffi_extern_python_stop;
- parts = []
- while True:
- match = _r_extern_python.search(csource)
- if not match:
- break
- endpos = match.end() - 1
- #print
- #print ''.join(parts)+csource
- #print '=>'
- parts.append(csource[:match.start()])
- if 'C' in match.group(1):
- parts.append('void __cffi_extern_python_plus_c_start; ')
- else:
- parts.append('void __cffi_extern_python_start; ')
- if csource[endpos] == '{':
- # grouping variant
- closing = csource.find('}', endpos)
- if closing < 0:
- raise CDefError("'extern \"Python\" {': no '}' found")
- if csource.find('{', endpos + 1, closing) >= 0:
- raise NotImplementedError("cannot use { } inside a block "
- "'extern \"Python\" { ... }'")
- parts.append(csource[endpos+1:closing])
- csource = csource[closing+1:]
- else:
- # non-grouping variant
- semicolon = csource.find(';', endpos)
- if semicolon < 0:
- raise CDefError("'extern \"Python\": no ';' found")
- parts.append(csource[endpos:semicolon+1])
- csource = csource[semicolon+1:]
- parts.append(' void __cffi_extern_python_stop;')
- #print ''.join(parts)+csource
- #print
- parts.append(csource)
- return ''.join(parts)
-
-def _warn_for_string_literal(csource):
- if '"' not in csource:
- return
- for line in csource.splitlines():
- if '"' in line and not line.lstrip().startswith('#'):
- import warnings
- warnings.warn("String literal found in cdef() or type source. "
- "String literals are ignored here, but you should "
- "remove them anyway because some character sequences "
- "confuse pre-parsing.")
- break
-
-def _warn_for_non_extern_non_static_global_variable(decl):
- if not decl.storage:
- import warnings
- warnings.warn("Global variable '%s' in cdef(): for consistency "
- "with C it should have a storage class specifier "
- "(usually 'extern')" % (decl.name,))
-
-def _remove_line_directives(csource):
- # _r_line_directive matches whole lines, without the final \n, if they
- # start with '#line' with some spacing allowed, or '#NUMBER'. This
- # function stores them away and replaces them with exactly the string
- # '#line@N', where N is the index in the list 'line_directives'.
- line_directives = []
- def replace(m):
- i = len(line_directives)
- line_directives.append(m.group())
- return '#line@%d' % i
- csource = _r_line_directive.sub(replace, csource)
- return csource, line_directives
-
-def _put_back_line_directives(csource, line_directives):
- def replace(m):
- s = m.group()
- if not s.startswith('#line@'):
- raise AssertionError("unexpected #line directive "
- "(should have been processed and removed")
- return line_directives[int(s[6:])]
- return _r_line_directive.sub(replace, csource)
-
-def _preprocess(csource):
- # First, remove the lines of the form '#line N "filename"' because
- # the "filename" part could confuse the rest
- csource, line_directives = _remove_line_directives(csource)
- # Remove comments. NOTE: this only work because the cdef() section
- # should not contain any string literals (except in line directives)!
- def replace_keeping_newlines(m):
- return ' ' + m.group().count('\n') * '\n'
- csource = _r_comment.sub(replace_keeping_newlines, csource)
- # Remove the "#define FOO x" lines
- macros = {}
- for match in _r_define.finditer(csource):
- macroname, macrovalue = match.groups()
- macrovalue = macrovalue.replace('\\\n', '').strip()
- macros[macroname] = macrovalue
- csource = _r_define.sub('', csource)
- #
- if pycparser.__version__ < '2.14':
- csource = _workaround_for_old_pycparser(csource)
- #
- # BIG HACK: replace WINAPI or __stdcall with "volatile const".
- # It doesn't make sense for the return type of a function to be
- # "volatile volatile const", so we abuse it to detect __stdcall...
- # Hack number 2 is that "int(volatile *fptr)();" is not valid C
- # syntax, so we place the "volatile" before the opening parenthesis.
- csource = _r_stdcall2.sub(' volatile volatile const(', csource)
- csource = _r_stdcall1.sub(' volatile volatile const ', csource)
- csource = _r_cdecl.sub(' ', csource)
- #
- # Replace `extern "Python"` with start/end markers
- csource = _preprocess_extern_python(csource)
- #
- # Now there should not be any string literal left; warn if we get one
- _warn_for_string_literal(csource)
- #
- # Replace "[...]" with "[__dotdotdotarray__]"
- csource = _r_partial_array.sub('[__dotdotdotarray__]', csource)
- #
- # Replace "...}" with "__dotdotdotNUM__}". This construction should
- # occur only at the end of enums; at the end of structs we have "...;}"
- # and at the end of vararg functions "...);". Also replace "=...[,}]"
- # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when
- # giving an unknown value.
- matches = list(_r_partial_enum.finditer(csource))
- for number, match in enumerate(reversed(matches)):
- p = match.start()
- if csource[p] == '=':
- p2 = csource.find('...', p, match.end())
- assert p2 > p
- csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number,
- csource[p2+3:])
- else:
- assert csource[p:p+3] == '...'
- csource = '%s __dotdotdot%d__ %s' % (csource[:p], number,
- csource[p+3:])
- # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__"
- csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource)
- # Replace "float ..." or "double..." with "__dotdotdotfloat__"
- csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource)
- # Replace all remaining "..." with the same name, "__dotdotdot__",
- # which is declared with a typedef for the purpose of C parsing.
- csource = csource.replace('...', ' __dotdotdot__ ')
- # Finally, put back the line directives
- csource = _put_back_line_directives(csource, line_directives)
- return csource, macros
-
-def _common_type_names(csource):
- # Look in the source for what looks like usages of types from the
- # list of common types. A "usage" is approximated here as the
- # appearance of the word, minus a "definition" of the type, which
- # is the last word in a "typedef" statement. Approximative only
- # but should be fine for all the common types.
- look_for_words = set(COMMON_TYPES)
- look_for_words.add(';')
- look_for_words.add(',')
- look_for_words.add('(')
- look_for_words.add(')')
- look_for_words.add('typedef')
- words_used = set()
- is_typedef = False
- paren = 0
- previous_word = ''
- for word in _r_words.findall(csource):
- if word in look_for_words:
- if word == ';':
- if is_typedef:
- words_used.discard(previous_word)
- look_for_words.discard(previous_word)
- is_typedef = False
- elif word == 'typedef':
- is_typedef = True
- paren = 0
- elif word == '(':
- paren += 1
- elif word == ')':
- paren -= 1
- elif word == ',':
- if is_typedef and paren == 0:
- words_used.discard(previous_word)
- look_for_words.discard(previous_word)
- else: # word in COMMON_TYPES
- words_used.add(word)
- previous_word = word
- return words_used
-
-
-class Parser(object):
-
- def __init__(self):
- self._declarations = {}
- self._included_declarations = set()
- self._anonymous_counter = 0
- self._structnode2type = weakref.WeakKeyDictionary()
- self._options = {}
- self._int_constants = {}
- self._recomplete = []
- self._uses_new_feature = None
-
- def _parse(self, csource):
- csource, macros = _preprocess(csource)
- # XXX: for more efficiency we would need to poke into the
- # internals of CParser... the following registers the
- # typedefs, because their presence or absence influences the
- # parsing itself (but what they are typedef'ed to plays no role)
- ctn = _common_type_names(csource)
- typenames = []
- for name in sorted(self._declarations):
- if name.startswith('typedef '):
- name = name[8:]
- typenames.append(name)
- ctn.discard(name)
- typenames += sorted(ctn)
- #
- csourcelines = []
- csourcelines.append('# 1 ""')
- for typename in typenames:
- csourcelines.append('typedef int %s;' % typename)
- csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,'
- ' __dotdotdot__;')
- # this forces pycparser to consider the following in the file
- # called from line 1
- csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,))
- csourcelines.append(csource)
- fullcsource = '\n'.join(csourcelines)
- if lock is not None:
- lock.acquire() # pycparser is not thread-safe...
- try:
- ast = _get_parser().parse(fullcsource)
- except pycparser.c_parser.ParseError as e:
- self.convert_pycparser_error(e, csource)
- finally:
- if lock is not None:
- lock.release()
- # csource will be used to find buggy source text
- return ast, macros, csource
-
- def _convert_pycparser_error(self, e, csource):
- # xxx look for ":NUM:" at the start of str(e)
- # and interpret that as a line number. This will not work if
- # the user gives explicit ``# NUM "FILE"`` directives.
- line = None
- msg = str(e)
- match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg)
- if match:
- linenum = int(match.group(1), 10)
- csourcelines = csource.splitlines()
- if 1 <= linenum <= len(csourcelines):
- line = csourcelines[linenum-1]
- return line
-
- def convert_pycparser_error(self, e, csource):
- line = self._convert_pycparser_error(e, csource)
-
- msg = str(e)
- if line:
- msg = 'cannot parse "%s"\n%s' % (line.strip(), msg)
- else:
- msg = 'parse error\n%s' % (msg,)
- raise CDefError(msg)
-
- def parse(self, csource, override=False, packed=False, pack=None,
- dllexport=False):
- if packed:
- if packed != True:
- raise ValueError("'packed' should be False or True; use "
- "'pack' to give another value")
- if pack:
- raise ValueError("cannot give both 'pack' and 'packed'")
- pack = 1
- elif pack:
- if pack & (pack - 1):
- raise ValueError("'pack' must be a power of two, not %r" %
- (pack,))
- else:
- pack = 0
- prev_options = self._options
- try:
- self._options = {'override': override,
- 'packed': pack,
- 'dllexport': dllexport}
- self._internal_parse(csource)
- finally:
- self._options = prev_options
-
- def _internal_parse(self, csource):
- ast, macros, csource = self._parse(csource)
- # add the macros
- self._process_macros(macros)
- # find the first "__dotdotdot__" and use that as a separator
- # between the repeated typedefs and the real csource
- iterator = iter(ast.ext)
- for decl in iterator:
- if decl.name == '__dotdotdot__':
- break
- else:
- assert 0
- current_decl = None
- #
- try:
- self._inside_extern_python = '__cffi_extern_python_stop'
- for decl in iterator:
- current_decl = decl
- if isinstance(decl, pycparser.c_ast.Decl):
- self._parse_decl(decl)
- elif isinstance(decl, pycparser.c_ast.Typedef):
- if not decl.name:
- raise CDefError("typedef does not declare any name",
- decl)
- quals = 0
- if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and
- decl.type.type.names[-1].startswith('__dotdotdot')):
- realtype = self._get_unknown_type(decl)
- elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and
- isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and
- isinstance(decl.type.type.type,
- pycparser.c_ast.IdentifierType) and
- decl.type.type.type.names[-1].startswith('__dotdotdot')):
- realtype = self._get_unknown_ptr_type(decl)
- else:
- realtype, quals = self._get_type_and_quals(
- decl.type, name=decl.name, partial_length_ok=True,
- typedef_example="*(%s *)0" % (decl.name,))
- self._declare('typedef ' + decl.name, realtype, quals=quals)
- elif decl.__class__.__name__ == 'Pragma':
- pass # skip pragma, only in pycparser 2.15
- else:
- raise CDefError("unexpected <%s>: this construct is valid "
- "C but not valid in cdef()" %
- decl.__class__.__name__, decl)
- except CDefError as e:
- if len(e.args) == 1:
- e.args = e.args + (current_decl,)
- raise
- except FFIError as e:
- msg = self._convert_pycparser_error(e, csource)
- if msg:
- e.args = (e.args[0] + "\n *** Err: %s" % msg,)
- raise
-
- def _add_constants(self, key, val):
- if key in self._int_constants:
- if self._int_constants[key] == val:
- return # ignore identical double declarations
- raise FFIError(
- "multiple declarations of constant: %s" % (key,))
- self._int_constants[key] = val
-
- def _add_integer_constant(self, name, int_str):
- int_str = int_str.lower().rstrip("ul")
- neg = int_str.startswith('-')
- if neg:
- int_str = int_str[1:]
- # "010" is not valid oct in py3
- if (int_str.startswith("0") and int_str != '0'
- and not int_str.startswith("0x")):
- int_str = "0o" + int_str[1:]
- pyvalue = int(int_str, 0)
- if neg:
- pyvalue = -pyvalue
- self._add_constants(name, pyvalue)
- self._declare('macro ' + name, pyvalue)
-
- def _process_macros(self, macros):
- for key, value in macros.items():
- value = value.strip()
- if _r_int_literal.match(value):
- self._add_integer_constant(key, value)
- elif value == '...':
- self._declare('macro ' + key, value)
- else:
- raise CDefError(
- 'only supports one of the following syntax:\n'
- ' #define %s ... (literally dot-dot-dot)\n'
- ' #define %s NUMBER (with NUMBER an integer'
- ' constant, decimal/hex/octal)\n'
- 'got:\n'
- ' #define %s %s'
- % (key, key, key, value))
-
- def _declare_function(self, tp, quals, decl):
- tp = self._get_type_pointer(tp, quals)
- if self._options.get('dllexport'):
- tag = 'dllexport_python '
- elif self._inside_extern_python == '__cffi_extern_python_start':
- tag = 'extern_python '
- elif self._inside_extern_python == '__cffi_extern_python_plus_c_start':
- tag = 'extern_python_plus_c '
- else:
- tag = 'function '
- self._declare(tag + decl.name, tp)
-
- def _parse_decl(self, decl):
- node = decl.type
- if isinstance(node, pycparser.c_ast.FuncDecl):
- tp, quals = self._get_type_and_quals(node, name=decl.name)
- assert isinstance(tp, model.RawFunctionType)
- self._declare_function(tp, quals, decl)
- else:
- if isinstance(node, pycparser.c_ast.Struct):
- self._get_struct_union_enum_type('struct', node)
- elif isinstance(node, pycparser.c_ast.Union):
- self._get_struct_union_enum_type('union', node)
- elif isinstance(node, pycparser.c_ast.Enum):
- self._get_struct_union_enum_type('enum', node)
- elif not decl.name:
- raise CDefError("construct does not declare any variable",
- decl)
- #
- if decl.name:
- tp, quals = self._get_type_and_quals(node,
- partial_length_ok=True)
- if tp.is_raw_function:
- self._declare_function(tp, quals, decl)
- elif (tp.is_integer_type() and
- hasattr(decl, 'init') and
- hasattr(decl.init, 'value') and
- _r_int_literal.match(decl.init.value)):
- self._add_integer_constant(decl.name, decl.init.value)
- elif (tp.is_integer_type() and
- isinstance(decl.init, pycparser.c_ast.UnaryOp) and
- decl.init.op == '-' and
- hasattr(decl.init.expr, 'value') and
- _r_int_literal.match(decl.init.expr.value)):
- self._add_integer_constant(decl.name,
- '-' + decl.init.expr.value)
- elif (tp is model.void_type and
- decl.name.startswith('__cffi_extern_python_')):
- # hack: `extern "Python"` in the C source is replaced
- # with "void __cffi_extern_python_start;" and
- # "void __cffi_extern_python_stop;"
- self._inside_extern_python = decl.name
- else:
- if self._inside_extern_python !='__cffi_extern_python_stop':
- raise CDefError(
- "cannot declare constants or "
- "variables with 'extern \"Python\"'")
- if (quals & model.Q_CONST) and not tp.is_array_type:
- self._declare('constant ' + decl.name, tp, quals=quals)
- else:
- _warn_for_non_extern_non_static_global_variable(decl)
- self._declare('variable ' + decl.name, tp, quals=quals)
-
- def parse_type(self, cdecl):
- return self.parse_type_and_quals(cdecl)[0]
-
- def parse_type_and_quals(self, cdecl):
- ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2]
- assert not macros
- exprnode = ast.ext[-1].type.args.params[0]
- if isinstance(exprnode, pycparser.c_ast.ID):
- raise CDefError("unknown identifier '%s'" % (exprnode.name,))
- return self._get_type_and_quals(exprnode.type)
-
- def _declare(self, name, obj, included=False, quals=0):
- if name in self._declarations:
- prevobj, prevquals = self._declarations[name]
- if prevobj is obj and prevquals == quals:
- return
- if not self._options.get('override'):
- raise FFIError(
- "multiple declarations of %s (for interactive usage, "
- "try cdef(xx, override=True))" % (name,))
- assert '__dotdotdot__' not in name.split()
- self._declarations[name] = (obj, quals)
- if included:
- self._included_declarations.add(obj)
-
- def _extract_quals(self, type):
- quals = 0
- if isinstance(type, (pycparser.c_ast.TypeDecl,
- pycparser.c_ast.PtrDecl)):
- if 'const' in type.quals:
- quals |= model.Q_CONST
- if 'volatile' in type.quals:
- quals |= model.Q_VOLATILE
- if 'restrict' in type.quals:
- quals |= model.Q_RESTRICT
- return quals
-
- def _get_type_pointer(self, type, quals, declname=None):
- if isinstance(type, model.RawFunctionType):
- return type.as_function_pointer()
- if (isinstance(type, model.StructOrUnionOrEnum) and
- type.name.startswith('$') and type.name[1:].isdigit() and
- type.forcename is None and declname is not None):
- return model.NamedPointerType(type, declname, quals)
- return model.PointerType(type, quals)
-
- def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False,
- typedef_example=None):
- # first, dereference typedefs, if we have it already parsed, we're good
- if (isinstance(typenode, pycparser.c_ast.TypeDecl) and
- isinstance(typenode.type, pycparser.c_ast.IdentifierType) and
- len(typenode.type.names) == 1 and
- ('typedef ' + typenode.type.names[0]) in self._declarations):
- tp, quals = self._declarations['typedef ' + typenode.type.names[0]]
- quals |= self._extract_quals(typenode)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.ArrayDecl):
- # array type
- if typenode.dim is None:
- length = None
- else:
- length = self._parse_constant(
- typenode.dim, partial_length_ok=partial_length_ok)
- # a hack: in 'typedef int foo_t[...][...];', don't use '...' as
- # the length but use directly the C expression that would be
- # generated by recompiler.py. This lets the typedef be used in
- # many more places within recompiler.py
- if typedef_example is not None:
- if length == '...':
- length = '_cffi_array_len(%s)' % (typedef_example,)
- typedef_example = "*" + typedef_example
- #
- tp, quals = self._get_type_and_quals(typenode.type,
- partial_length_ok=partial_length_ok,
- typedef_example=typedef_example)
- return model.ArrayType(tp, length), quals
- #
- if isinstance(typenode, pycparser.c_ast.PtrDecl):
- # pointer type
- itemtype, itemquals = self._get_type_and_quals(typenode.type)
- tp = self._get_type_pointer(itemtype, itemquals, declname=name)
- quals = self._extract_quals(typenode)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.TypeDecl):
- quals = self._extract_quals(typenode)
- type = typenode.type
- if isinstance(type, pycparser.c_ast.IdentifierType):
- # assume a primitive type. get it from .names, but reduce
- # synonyms to a single chosen combination
- names = list(type.names)
- if names != ['signed', 'char']: # keep this unmodified
- prefixes = {}
- while names:
- name = names[0]
- if name in ('short', 'long', 'signed', 'unsigned'):
- prefixes[name] = prefixes.get(name, 0) + 1
- del names[0]
- else:
- break
- # ignore the 'signed' prefix below, and reorder the others
- newnames = []
- for prefix in ('unsigned', 'short', 'long'):
- for i in range(prefixes.get(prefix, 0)):
- newnames.append(prefix)
- if not names:
- names = ['int'] # implicitly
- if names == ['int']: # but kill it if 'short' or 'long'
- if 'short' in prefixes or 'long' in prefixes:
- names = []
- names = newnames + names
- ident = ' '.join(names)
- if ident == 'void':
- return model.void_type, quals
- if ident == '__dotdotdot__':
- raise FFIError(':%d: bad usage of "..."' %
- typenode.coord.line)
- tp0, quals0 = resolve_common_type(self, ident)
- return tp0, (quals | quals0)
- #
- if isinstance(type, pycparser.c_ast.Struct):
- # 'struct foobar'
- tp = self._get_struct_union_enum_type('struct', type, name)
- return tp, quals
- #
- if isinstance(type, pycparser.c_ast.Union):
- # 'union foobar'
- tp = self._get_struct_union_enum_type('union', type, name)
- return tp, quals
- #
- if isinstance(type, pycparser.c_ast.Enum):
- # 'enum foobar'
- tp = self._get_struct_union_enum_type('enum', type, name)
- return tp, quals
- #
- if isinstance(typenode, pycparser.c_ast.FuncDecl):
- # a function type
- return self._parse_function_type(typenode, name), 0
- #
- # nested anonymous structs or unions end up here
- if isinstance(typenode, pycparser.c_ast.Struct):
- return self._get_struct_union_enum_type('struct', typenode, name,
- nested=True), 0
- if isinstance(typenode, pycparser.c_ast.Union):
- return self._get_struct_union_enum_type('union', typenode, name,
- nested=True), 0
- #
- raise FFIError(":%d: bad or unsupported type declaration" %
- typenode.coord.line)
-
- def _parse_function_type(self, typenode, funcname=None):
- params = list(getattr(typenode.args, 'params', []))
- for i, arg in enumerate(params):
- if not hasattr(arg, 'type'):
- raise CDefError("%s arg %d: unknown type '%s'"
- " (if you meant to use the old C syntax of giving"
- " untyped arguments, it is not supported)"
- % (funcname or 'in expression', i + 1,
- getattr(arg, 'name', '?')))
- ellipsis = (
- len(params) > 0 and
- isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and
- isinstance(params[-1].type.type,
- pycparser.c_ast.IdentifierType) and
- params[-1].type.type.names == ['__dotdotdot__'])
- if ellipsis:
- params.pop()
- if not params:
- raise CDefError(
- "%s: a function with only '(...)' as argument"
- " is not correct C" % (funcname or 'in expression'))
- args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type))
- for argdeclnode in params]
- if not ellipsis and args == [model.void_type]:
- args = []
- result, quals = self._get_type_and_quals(typenode.type)
- # the 'quals' on the result type are ignored. HACK: we absure them
- # to detect __stdcall functions: we textually replace "__stdcall"
- # with "volatile volatile const" above.
- abi = None
- if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway
- if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']:
- abi = '__stdcall'
- return model.RawFunctionType(tuple(args), result, ellipsis, abi)
-
- def _as_func_arg(self, type, quals):
- if isinstance(type, model.ArrayType):
- return model.PointerType(type.item, quals)
- elif isinstance(type, model.RawFunctionType):
- return type.as_function_pointer()
- else:
- return type
-
- def _get_struct_union_enum_type(self, kind, type, name=None, nested=False):
- # First, a level of caching on the exact 'type' node of the AST.
- # This is obscure, but needed because pycparser "unrolls" declarations
- # such as "typedef struct { } foo_t, *foo_p" and we end up with
- # an AST that is not a tree, but a DAG, with the "type" node of the
- # two branches foo_t and foo_p of the trees being the same node.
- # It's a bit silly but detecting "DAG-ness" in the AST tree seems
- # to be the only way to distinguish this case from two independent
- # structs. See test_struct_with_two_usages.
- try:
- return self._structnode2type[type]
- except KeyError:
- pass
- #
- # Note that this must handle parsing "struct foo" any number of
- # times and always return the same StructType object. Additionally,
- # one of these times (not necessarily the first), the fields of
- # the struct can be specified with "struct foo { ...fields... }".
- # If no name is given, then we have to create a new anonymous struct
- # with no caching; in this case, the fields are either specified
- # right now or never.
- #
- force_name = name
- name = type.name
- #
- # get the type or create it if needed
- if name is None:
- # 'force_name' is used to guess a more readable name for
- # anonymous structs, for the common case "typedef struct { } foo".
- if force_name is not None:
- explicit_name = '$%s' % force_name
- else:
- self._anonymous_counter += 1
- explicit_name = '$%d' % self._anonymous_counter
- tp = None
- else:
- explicit_name = name
- key = '%s %s' % (kind, name)
- tp, _ = self._declarations.get(key, (None, None))
- #
- if tp is None:
- if kind == 'struct':
- tp = model.StructType(explicit_name, None, None, None)
- elif kind == 'union':
- tp = model.UnionType(explicit_name, None, None, None)
- elif kind == 'enum':
- if explicit_name == '__dotdotdot__':
- raise CDefError("Enums cannot be declared with ...")
- tp = self._build_enum_type(explicit_name, type.values)
- else:
- raise AssertionError("kind = %r" % (kind,))
- if name is not None:
- self._declare(key, tp)
- else:
- if kind == 'enum' and type.values is not None:
- raise NotImplementedError(
- "enum %s: the '{}' declaration should appear on the first "
- "time the enum is mentioned, not later" % explicit_name)
- if not tp.forcename:
- tp.force_the_name(force_name)
- if tp.forcename and '$' in tp.name:
- self._declare('anonymous %s' % tp.forcename, tp)
- #
- self._structnode2type[type] = tp
- #
- # enums: done here
- if kind == 'enum':
- return tp
- #
- # is there a 'type.decls'? If yes, then this is the place in the
- # C sources that declare the fields. If no, then just return the
- # existing type, possibly still incomplete.
- if type.decls is None:
- return tp
- #
- if tp.fldnames is not None:
- raise CDefError("duplicate declaration of struct %s" % name)
- fldnames = []
- fldtypes = []
- fldbitsize = []
- fldquals = []
- for decl in type.decls:
- if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and
- ''.join(decl.type.names) == '__dotdotdot__'):
- # XXX pycparser is inconsistent: 'names' should be a list
- # of strings, but is sometimes just one string. Use
- # str.join() as a way to cope with both.
- self._make_partial(tp, nested)
- continue
- if decl.bitsize is None:
- bitsize = -1
- else:
- bitsize = self._parse_constant(decl.bitsize)
- self._partial_length = False
- type, fqual = self._get_type_and_quals(decl.type,
- partial_length_ok=True)
- if self._partial_length:
- self._make_partial(tp, nested)
- if isinstance(type, model.StructType) and type.partial:
- self._make_partial(tp, nested)
- fldnames.append(decl.name or '')
- fldtypes.append(type)
- fldbitsize.append(bitsize)
- fldquals.append(fqual)
- tp.fldnames = tuple(fldnames)
- tp.fldtypes = tuple(fldtypes)
- tp.fldbitsize = tuple(fldbitsize)
- tp.fldquals = tuple(fldquals)
- if fldbitsize != [-1] * len(fldbitsize):
- if isinstance(tp, model.StructType) and tp.partial:
- raise NotImplementedError("%s: using both bitfields and '...;'"
- % (tp,))
- tp.packed = self._options.get('packed')
- if tp.completed: # must be re-completed: it is not opaque any more
- tp.completed = 0
- self._recomplete.append(tp)
- return tp
-
- def _make_partial(self, tp, nested):
- if not isinstance(tp, model.StructOrUnion):
- raise CDefError("%s cannot be partial" % (tp,))
- if not tp.has_c_name() and not nested:
- raise NotImplementedError("%s is partial but has no C name" %(tp,))
- tp.partial = True
-
- def _parse_constant(self, exprnode, partial_length_ok=False):
- # for now, limited to expressions that are an immediate number
- # or positive/negative number
- if isinstance(exprnode, pycparser.c_ast.Constant):
- s = exprnode.value
- if '0' <= s[0] <= '9':
- s = s.rstrip('uUlL')
- try:
- if s.startswith('0'):
- return int(s, 8)
- else:
- return int(s, 10)
- except ValueError:
- if len(s) > 1:
- if s.lower()[0:2] == '0x':
- return int(s, 16)
- elif s.lower()[0:2] == '0b':
- return int(s, 2)
- raise CDefError("invalid constant %r" % (s,))
- elif s[0] == "'" and s[-1] == "'" and (
- len(s) == 3 or (len(s) == 4 and s[1] == "\\")):
- return ord(s[-2])
- else:
- raise CDefError("invalid constant %r" % (s,))
- #
- if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and
- exprnode.op == '+'):
- return self._parse_constant(exprnode.expr)
- #
- if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and
- exprnode.op == '-'):
- return -self._parse_constant(exprnode.expr)
- # load previously defined int constant
- if (isinstance(exprnode, pycparser.c_ast.ID) and
- exprnode.name in self._int_constants):
- return self._int_constants[exprnode.name]
- #
- if (isinstance(exprnode, pycparser.c_ast.ID) and
- exprnode.name == '__dotdotdotarray__'):
- if partial_length_ok:
- self._partial_length = True
- return '...'
- raise FFIError(":%d: unsupported '[...]' here, cannot derive "
- "the actual array length in this context"
- % exprnode.coord.line)
- #
- if isinstance(exprnode, pycparser.c_ast.BinaryOp):
- left = self._parse_constant(exprnode.left)
- right = self._parse_constant(exprnode.right)
- if exprnode.op == '+':
- return left + right
- elif exprnode.op == '-':
- return left - right
- elif exprnode.op == '*':
- return left * right
- elif exprnode.op == '/':
- return self._c_div(left, right)
- elif exprnode.op == '%':
- return left - self._c_div(left, right) * right
- elif exprnode.op == '<<':
- return left << right
- elif exprnode.op == '>>':
- return left >> right
- elif exprnode.op == '&':
- return left & right
- elif exprnode.op == '|':
- return left | right
- elif exprnode.op == '^':
- return left ^ right
- #
- raise FFIError(":%d: unsupported expression: expected a "
- "simple numeric constant" % exprnode.coord.line)
-
- def _c_div(self, a, b):
- result = a // b
- if ((a < 0) ^ (b < 0)) and (a % b) != 0:
- result += 1
- return result
-
- def _build_enum_type(self, explicit_name, decls):
- if decls is not None:
- partial = False
- enumerators = []
- enumvalues = []
- nextenumvalue = 0
- for enum in decls.enumerators:
- if _r_enum_dotdotdot.match(enum.name):
- partial = True
- continue
- if enum.value is not None:
- nextenumvalue = self._parse_constant(enum.value)
- enumerators.append(enum.name)
- enumvalues.append(nextenumvalue)
- self._add_constants(enum.name, nextenumvalue)
- nextenumvalue += 1
- enumerators = tuple(enumerators)
- enumvalues = tuple(enumvalues)
- tp = model.EnumType(explicit_name, enumerators, enumvalues)
- tp.partial = partial
- else: # opaque enum
- tp = model.EnumType(explicit_name, (), ())
- return tp
-
- def include(self, other):
- for name, (tp, quals) in other._declarations.items():
- if name.startswith('anonymous $enum_$'):
- continue # fix for test_anonymous_enum_include
- kind = name.split(' ', 1)[0]
- if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'):
- self._declare(name, tp, included=True, quals=quals)
- for k, v in other._int_constants.items():
- self._add_constants(k, v)
-
- def _get_unknown_type(self, decl):
- typenames = decl.type.type.names
- if typenames == ['__dotdotdot__']:
- return model.unknown_type(decl.name)
-
- if typenames == ['__dotdotdotint__']:
- if self._uses_new_feature is None:
- self._uses_new_feature = "'typedef int... %s'" % decl.name
- return model.UnknownIntegerType(decl.name)
-
- if typenames == ['__dotdotdotfloat__']:
- # note: not for 'long double' so far
- if self._uses_new_feature is None:
- self._uses_new_feature = "'typedef float... %s'" % decl.name
- return model.UnknownFloatType(decl.name)
-
- raise FFIError(':%d: unsupported usage of "..." in typedef'
- % decl.coord.line)
-
- def _get_unknown_ptr_type(self, decl):
- if decl.type.type.type.names == ['__dotdotdot__']:
- return model.unknown_ptr_type(decl.name)
- raise FFIError(':%d: unsupported usage of "..." in typedef'
- % decl.coord.line)
diff --git a/resources/python/bin/3.7/mac/cffi/error.py b/resources/python/bin/3.7/mac/cffi/error.py
deleted file mode 100644
index 0a27247c3..000000000
--- a/resources/python/bin/3.7/mac/cffi/error.py
+++ /dev/null
@@ -1,31 +0,0 @@
-
-class FFIError(Exception):
- __module__ = 'cffi'
-
-class CDefError(Exception):
- __module__ = 'cffi'
- def __str__(self):
- try:
- current_decl = self.args[1]
- filename = current_decl.coord.file
- linenum = current_decl.coord.line
- prefix = '%s:%d: ' % (filename, linenum)
- except (AttributeError, TypeError, IndexError):
- prefix = ''
- return '%s%s' % (prefix, self.args[0])
-
-class VerificationError(Exception):
- """ An error raised when verification fails
- """
- __module__ = 'cffi'
-
-class VerificationMissing(Exception):
- """ An error raised when incomplete structures are passed into
- cdef, but no verification has been done
- """
- __module__ = 'cffi'
-
-class PkgConfigError(Exception):
- """ An error raised for missing modules in pkg-config
- """
- __module__ = 'cffi'
diff --git a/resources/python/bin/3.7/mac/cffi/ffiplatform.py b/resources/python/bin/3.7/mac/cffi/ffiplatform.py
deleted file mode 100644
index 85313460a..000000000
--- a/resources/python/bin/3.7/mac/cffi/ffiplatform.py
+++ /dev/null
@@ -1,127 +0,0 @@
-import sys, os
-from .error import VerificationError
-
-
-LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs',
- 'extra_objects', 'depends']
-
-def get_extension(srcfilename, modname, sources=(), **kwds):
- _hack_at_distutils()
- from distutils.core import Extension
- allsources = [srcfilename]
- for src in sources:
- allsources.append(os.path.normpath(src))
- return Extension(name=modname, sources=allsources, **kwds)
-
-def compile(tmpdir, ext, compiler_verbose=0, debug=None):
- """Compile a C extension module using distutils."""
-
- _hack_at_distutils()
- saved_environ = os.environ.copy()
- try:
- outputfilename = _build(tmpdir, ext, compiler_verbose, debug)
- outputfilename = os.path.abspath(outputfilename)
- finally:
- # workaround for a distutils bugs where some env vars can
- # become longer and longer every time it is used
- for key, value in saved_environ.items():
- if os.environ.get(key) != value:
- os.environ[key] = value
- return outputfilename
-
-def _build(tmpdir, ext, compiler_verbose=0, debug=None):
- # XXX compact but horrible :-(
- from distutils.core import Distribution
- import distutils.errors, distutils.log
- #
- dist = Distribution({'ext_modules': [ext]})
- dist.parse_config_files()
- options = dist.get_option_dict('build_ext')
- if debug is None:
- debug = sys.flags.debug
- options['debug'] = ('ffiplatform', debug)
- options['force'] = ('ffiplatform', True)
- options['build_lib'] = ('ffiplatform', tmpdir)
- options['build_temp'] = ('ffiplatform', tmpdir)
- #
- try:
- old_level = distutils.log.set_threshold(0) or 0
- try:
- distutils.log.set_verbosity(compiler_verbose)
- dist.run_command('build_ext')
- cmd_obj = dist.get_command_obj('build_ext')
- [soname] = cmd_obj.get_outputs()
- finally:
- distutils.log.set_threshold(old_level)
- except (distutils.errors.CompileError,
- distutils.errors.LinkError) as e:
- raise VerificationError('%s: %s' % (e.__class__.__name__, e))
- #
- return soname
-
-try:
- from os.path import samefile
-except ImportError:
- def samefile(f1, f2):
- return os.path.abspath(f1) == os.path.abspath(f2)
-
-def maybe_relative_path(path):
- if not os.path.isabs(path):
- return path # already relative
- dir = path
- names = []
- while True:
- prevdir = dir
- dir, name = os.path.split(prevdir)
- if dir == prevdir or not dir:
- return path # failed to make it relative
- names.append(name)
- try:
- if samefile(dir, os.curdir):
- names.reverse()
- return os.path.join(*names)
- except OSError:
- pass
-
-# ____________________________________________________________
-
-try:
- int_or_long = (int, long)
- import cStringIO
-except NameError:
- int_or_long = int # Python 3
- import io as cStringIO
-
-def _flatten(x, f):
- if isinstance(x, str):
- f.write('%ds%s' % (len(x), x))
- elif isinstance(x, dict):
- keys = sorted(x.keys())
- f.write('%dd' % len(keys))
- for key in keys:
- _flatten(key, f)
- _flatten(x[key], f)
- elif isinstance(x, (list, tuple)):
- f.write('%dl' % len(x))
- for value in x:
- _flatten(value, f)
- elif isinstance(x, int_or_long):
- f.write('%di' % (x,))
- else:
- raise TypeError(
- "the keywords to verify() contains unsupported object %r" % (x,))
-
-def flatten(x):
- f = cStringIO.StringIO()
- _flatten(x, f)
- return f.getvalue()
-
-def _hack_at_distutils():
- # Windows-only workaround for some configurations: see
- # https://bugs.python.org/issue23246 (Python 2.7 with
- # a specific MS compiler suite download)
- if sys.platform == "win32":
- try:
- import setuptools # for side-effects, patches distutils
- except ImportError:
- pass
diff --git a/resources/python/bin/3.7/mac/cffi/lock.py b/resources/python/bin/3.7/mac/cffi/lock.py
deleted file mode 100644
index db91b7158..000000000
--- a/resources/python/bin/3.7/mac/cffi/lock.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import sys
-
-if sys.version_info < (3,):
- try:
- from thread import allocate_lock
- except ImportError:
- from dummy_thread import allocate_lock
-else:
- try:
- from _thread import allocate_lock
- except ImportError:
- from _dummy_thread import allocate_lock
-
-
-##import sys
-##l1 = allocate_lock
-
-##class allocate_lock(object):
-## def __init__(self):
-## self._real = l1()
-## def __enter__(self):
-## for i in range(4, 0, -1):
-## print sys._getframe(i).f_code
-## print
-## return self._real.__enter__()
-## def __exit__(self, *args):
-## return self._real.__exit__(*args)
-## def acquire(self, f):
-## assert f is False
-## return self._real.acquire(f)
diff --git a/resources/python/bin/3.7/mac/cffi/model.py b/resources/python/bin/3.7/mac/cffi/model.py
deleted file mode 100644
index ad1c17648..000000000
--- a/resources/python/bin/3.7/mac/cffi/model.py
+++ /dev/null
@@ -1,617 +0,0 @@
-import types
-import weakref
-
-from .lock import allocate_lock
-from .error import CDefError, VerificationError, VerificationMissing
-
-# type qualifiers
-Q_CONST = 0x01
-Q_RESTRICT = 0x02
-Q_VOLATILE = 0x04
-
-def qualify(quals, replace_with):
- if quals & Q_CONST:
- replace_with = ' const ' + replace_with.lstrip()
- if quals & Q_VOLATILE:
- replace_with = ' volatile ' + replace_with.lstrip()
- if quals & Q_RESTRICT:
- # It seems that __restrict is supported by gcc and msvc.
- # If you hit some different compiler, add a #define in
- # _cffi_include.h for it (and in its copies, documented there)
- replace_with = ' __restrict ' + replace_with.lstrip()
- return replace_with
-
-
-class BaseTypeByIdentity(object):
- is_array_type = False
- is_raw_function = False
-
- def get_c_name(self, replace_with='', context='a C file', quals=0):
- result = self.c_name_with_marker
- assert result.count('&') == 1
- # some logic duplication with ffi.getctype()... :-(
- replace_with = replace_with.strip()
- if replace_with:
- if replace_with.startswith('*') and '&[' in result:
- replace_with = '(%s)' % replace_with
- elif not replace_with[0] in '[(':
- replace_with = ' ' + replace_with
- replace_with = qualify(quals, replace_with)
- result = result.replace('&', replace_with)
- if '$' in result:
- raise VerificationError(
- "cannot generate '%s' in %s: unknown type name"
- % (self._get_c_name(), context))
- return result
-
- def _get_c_name(self):
- return self.c_name_with_marker.replace('&', '')
-
- def has_c_name(self):
- return '$' not in self._get_c_name()
-
- def is_integer_type(self):
- return False
-
- def get_cached_btype(self, ffi, finishlist, can_delay=False):
- try:
- BType = ffi._cached_btypes[self]
- except KeyError:
- BType = self.build_backend_type(ffi, finishlist)
- BType2 = ffi._cached_btypes.setdefault(self, BType)
- assert BType2 is BType
- return BType
-
- def __repr__(self):
- return '<%s>' % (self._get_c_name(),)
-
- def _get_items(self):
- return [(name, getattr(self, name)) for name in self._attrs_]
-
-
-class BaseType(BaseTypeByIdentity):
-
- def __eq__(self, other):
- return (self.__class__ == other.__class__ and
- self._get_items() == other._get_items())
-
- def __ne__(self, other):
- return not self == other
-
- def __hash__(self):
- return hash((self.__class__, tuple(self._get_items())))
-
-
-class VoidType(BaseType):
- _attrs_ = ()
-
- def __init__(self):
- self.c_name_with_marker = 'void&'
-
- def build_backend_type(self, ffi, finishlist):
- return global_cache(self, ffi, 'new_void_type')
-
-void_type = VoidType()
-
-
-class BasePrimitiveType(BaseType):
- def is_complex_type(self):
- return False
-
-
-class PrimitiveType(BasePrimitiveType):
- _attrs_ = ('name',)
-
- ALL_PRIMITIVE_TYPES = {
- 'char': 'c',
- 'short': 'i',
- 'int': 'i',
- 'long': 'i',
- 'long long': 'i',
- 'signed char': 'i',
- 'unsigned char': 'i',
- 'unsigned short': 'i',
- 'unsigned int': 'i',
- 'unsigned long': 'i',
- 'unsigned long long': 'i',
- 'float': 'f',
- 'double': 'f',
- 'long double': 'f',
- 'float _Complex': 'j',
- 'double _Complex': 'j',
- '_Bool': 'i',
- # the following types are not primitive in the C sense
- 'wchar_t': 'c',
- 'char16_t': 'c',
- 'char32_t': 'c',
- 'int8_t': 'i',
- 'uint8_t': 'i',
- 'int16_t': 'i',
- 'uint16_t': 'i',
- 'int32_t': 'i',
- 'uint32_t': 'i',
- 'int64_t': 'i',
- 'uint64_t': 'i',
- 'int_least8_t': 'i',
- 'uint_least8_t': 'i',
- 'int_least16_t': 'i',
- 'uint_least16_t': 'i',
- 'int_least32_t': 'i',
- 'uint_least32_t': 'i',
- 'int_least64_t': 'i',
- 'uint_least64_t': 'i',
- 'int_fast8_t': 'i',
- 'uint_fast8_t': 'i',
- 'int_fast16_t': 'i',
- 'uint_fast16_t': 'i',
- 'int_fast32_t': 'i',
- 'uint_fast32_t': 'i',
- 'int_fast64_t': 'i',
- 'uint_fast64_t': 'i',
- 'intptr_t': 'i',
- 'uintptr_t': 'i',
- 'intmax_t': 'i',
- 'uintmax_t': 'i',
- 'ptrdiff_t': 'i',
- 'size_t': 'i',
- 'ssize_t': 'i',
- }
-
- def __init__(self, name):
- assert name in self.ALL_PRIMITIVE_TYPES
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def is_char_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'c'
- def is_integer_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'i'
- def is_float_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
- def is_complex_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'j'
-
- def build_backend_type(self, ffi, finishlist):
- return global_cache(self, ffi, 'new_primitive_type', self.name)
-
-
-class UnknownIntegerType(BasePrimitiveType):
- _attrs_ = ('name',)
-
- def __init__(self, name):
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def is_integer_type(self):
- return True
-
- def build_backend_type(self, ffi, finishlist):
- raise NotImplementedError("integer type '%s' can only be used after "
- "compilation" % self.name)
-
-class UnknownFloatType(BasePrimitiveType):
- _attrs_ = ('name', )
-
- def __init__(self, name):
- self.name = name
- self.c_name_with_marker = name + '&'
-
- def build_backend_type(self, ffi, finishlist):
- raise NotImplementedError("float type '%s' can only be used after "
- "compilation" % self.name)
-
-
-class BaseFunctionType(BaseType):
- _attrs_ = ('args', 'result', 'ellipsis', 'abi')
-
- def __init__(self, args, result, ellipsis, abi=None):
- self.args = args
- self.result = result
- self.ellipsis = ellipsis
- self.abi = abi
- #
- reprargs = [arg._get_c_name() for arg in self.args]
- if self.ellipsis:
- reprargs.append('...')
- reprargs = reprargs or ['void']
- replace_with = self._base_pattern % (', '.join(reprargs),)
- if abi is not None:
- replace_with = replace_with[:1] + abi + ' ' + replace_with[1:]
- self.c_name_with_marker = (
- self.result.c_name_with_marker.replace('&', replace_with))
-
-
-class RawFunctionType(BaseFunctionType):
- # Corresponds to a C type like 'int(int)', which is the C type of
- # a function, but not a pointer-to-function. The backend has no
- # notion of such a type; it's used temporarily by parsing.
- _base_pattern = '(&)(%s)'
- is_raw_function = True
-
- def build_backend_type(self, ffi, finishlist):
- raise CDefError("cannot render the type %r: it is a function "
- "type, not a pointer-to-function type" % (self,))
-
- def as_function_pointer(self):
- return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi)
-
-
-class FunctionPtrType(BaseFunctionType):
- _base_pattern = '(*&)(%s)'
-
- def build_backend_type(self, ffi, finishlist):
- result = self.result.get_cached_btype(ffi, finishlist)
- args = []
- for tp in self.args:
- args.append(tp.get_cached_btype(ffi, finishlist))
- abi_args = ()
- if self.abi == "__stdcall":
- if not self.ellipsis: # __stdcall ignored for variadic funcs
- try:
- abi_args = (ffi._backend.FFI_STDCALL,)
- except AttributeError:
- pass
- return global_cache(self, ffi, 'new_function_type',
- tuple(args), result, self.ellipsis, *abi_args)
-
- def as_raw_function(self):
- return RawFunctionType(self.args, self.result, self.ellipsis, self.abi)
-
-
-class PointerType(BaseType):
- _attrs_ = ('totype', 'quals')
-
- def __init__(self, totype, quals=0):
- self.totype = totype
- self.quals = quals
- extra = qualify(quals, " *&")
- if totype.is_array_type:
- extra = "(%s)" % (extra.lstrip(),)
- self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra)
-
- def build_backend_type(self, ffi, finishlist):
- BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True)
- return global_cache(self, ffi, 'new_pointer_type', BItem)
-
-voidp_type = PointerType(void_type)
-
-def ConstPointerType(totype):
- return PointerType(totype, Q_CONST)
-
-const_voidp_type = ConstPointerType(void_type)
-
-
-class NamedPointerType(PointerType):
- _attrs_ = ('totype', 'name')
-
- def __init__(self, totype, name, quals=0):
- PointerType.__init__(self, totype, quals)
- self.name = name
- self.c_name_with_marker = name + '&'
-
-
-class ArrayType(BaseType):
- _attrs_ = ('item', 'length')
- is_array_type = True
-
- def __init__(self, item, length):
- self.item = item
- self.length = length
- #
- if length is None:
- brackets = '&[]'
- elif length == '...':
- brackets = '&[/*...*/]'
- else:
- brackets = '&[%s]' % length
- self.c_name_with_marker = (
- self.item.c_name_with_marker.replace('&', brackets))
-
- def length_is_unknown(self):
- return isinstance(self.length, str)
-
- def resolve_length(self, newlength):
- return ArrayType(self.item, newlength)
-
- def build_backend_type(self, ffi, finishlist):
- if self.length_is_unknown():
- raise CDefError("cannot render the type %r: unknown length" %
- (self,))
- self.item.get_cached_btype(ffi, finishlist) # force the item BType
- BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist)
- return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length)
-
-char_array_type = ArrayType(PrimitiveType('char'), None)
-
-
-class StructOrUnionOrEnum(BaseTypeByIdentity):
- _attrs_ = ('name',)
- forcename = None
-
- def build_c_name_with_marker(self):
- name = self.forcename or '%s %s' % (self.kind, self.name)
- self.c_name_with_marker = name + '&'
-
- def force_the_name(self, forcename):
- self.forcename = forcename
- self.build_c_name_with_marker()
-
- def get_official_name(self):
- assert self.c_name_with_marker.endswith('&')
- return self.c_name_with_marker[:-1]
-
-
-class StructOrUnion(StructOrUnionOrEnum):
- fixedlayout = None
- completed = 0
- partial = False
- packed = 0
-
- def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None):
- self.name = name
- self.fldnames = fldnames
- self.fldtypes = fldtypes
- self.fldbitsize = fldbitsize
- self.fldquals = fldquals
- self.build_c_name_with_marker()
-
- def anonymous_struct_fields(self):
- if self.fldtypes is not None:
- for name, type in zip(self.fldnames, self.fldtypes):
- if name == '' and isinstance(type, StructOrUnion):
- yield type
-
- def enumfields(self, expand_anonymous_struct_union=True):
- fldquals = self.fldquals
- if fldquals is None:
- fldquals = (0,) * len(self.fldnames)
- for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes,
- self.fldbitsize, fldquals):
- if (name == '' and isinstance(type, StructOrUnion)
- and expand_anonymous_struct_union):
- # nested anonymous struct/union
- for result in type.enumfields():
- yield result
- else:
- yield (name, type, bitsize, quals)
-
- def force_flatten(self):
- # force the struct or union to have a declaration that lists
- # directly all fields returned by enumfields(), flattening
- # nested anonymous structs/unions.
- names = []
- types = []
- bitsizes = []
- fldquals = []
- for name, type, bitsize, quals in self.enumfields():
- names.append(name)
- types.append(type)
- bitsizes.append(bitsize)
- fldquals.append(quals)
- self.fldnames = tuple(names)
- self.fldtypes = tuple(types)
- self.fldbitsize = tuple(bitsizes)
- self.fldquals = tuple(fldquals)
-
- def get_cached_btype(self, ffi, finishlist, can_delay=False):
- BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist,
- can_delay)
- if not can_delay:
- self.finish_backend_type(ffi, finishlist)
- return BType
-
- def finish_backend_type(self, ffi, finishlist):
- if self.completed:
- if self.completed != 2:
- raise NotImplementedError("recursive structure declaration "
- "for '%s'" % (self.name,))
- return
- BType = ffi._cached_btypes[self]
- #
- self.completed = 1
- #
- if self.fldtypes is None:
- pass # not completing it: it's an opaque struct
- #
- elif self.fixedlayout is None:
- fldtypes = [tp.get_cached_btype(ffi, finishlist)
- for tp in self.fldtypes]
- lst = list(zip(self.fldnames, fldtypes, self.fldbitsize))
- extra_flags = ()
- if self.packed:
- if self.packed == 1:
- extra_flags = (8,) # SF_PACKED
- else:
- extra_flags = (0, self.packed)
- ffi._backend.complete_struct_or_union(BType, lst, self,
- -1, -1, *extra_flags)
- #
- else:
- fldtypes = []
- fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout
- for i in range(len(self.fldnames)):
- fsize = fieldsize[i]
- ftype = self.fldtypes[i]
- #
- if isinstance(ftype, ArrayType) and ftype.length_is_unknown():
- # fix the length to match the total size
- BItemType = ftype.item.get_cached_btype(ffi, finishlist)
- nlen, nrest = divmod(fsize, ffi.sizeof(BItemType))
- if nrest != 0:
- self._verification_error(
- "field '%s.%s' has a bogus size?" % (
- self.name, self.fldnames[i] or '{}'))
- ftype = ftype.resolve_length(nlen)
- self.fldtypes = (self.fldtypes[:i] + (ftype,) +
- self.fldtypes[i+1:])
- #
- BFieldType = ftype.get_cached_btype(ffi, finishlist)
- if isinstance(ftype, ArrayType) and ftype.length is None:
- assert fsize == 0
- else:
- bitemsize = ffi.sizeof(BFieldType)
- if bitemsize != fsize:
- self._verification_error(
- "field '%s.%s' is declared as %d bytes, but is "
- "really %d bytes" % (self.name,
- self.fldnames[i] or '{}',
- bitemsize, fsize))
- fldtypes.append(BFieldType)
- #
- lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs))
- ffi._backend.complete_struct_or_union(BType, lst, self,
- totalsize, totalalignment)
- self.completed = 2
-
- def _verification_error(self, msg):
- raise VerificationError(msg)
-
- def check_not_partial(self):
- if self.partial and self.fixedlayout is None:
- raise VerificationMissing(self._get_c_name())
-
- def build_backend_type(self, ffi, finishlist):
- self.check_not_partial()
- finishlist.append(self)
- #
- return global_cache(self, ffi, 'new_%s_type' % self.kind,
- self.get_official_name(), key=self)
-
-
-class StructType(StructOrUnion):
- kind = 'struct'
-
-
-class UnionType(StructOrUnion):
- kind = 'union'
-
-
-class EnumType(StructOrUnionOrEnum):
- kind = 'enum'
- partial = False
- partial_resolved = False
-
- def __init__(self, name, enumerators, enumvalues, baseinttype=None):
- self.name = name
- self.enumerators = enumerators
- self.enumvalues = enumvalues
- self.baseinttype = baseinttype
- self.build_c_name_with_marker()
-
- def force_the_name(self, forcename):
- StructOrUnionOrEnum.force_the_name(self, forcename)
- if self.forcename is None:
- name = self.get_official_name()
- self.forcename = '$' + name.replace(' ', '_')
-
- def check_not_partial(self):
- if self.partial and not self.partial_resolved:
- raise VerificationMissing(self._get_c_name())
-
- def build_backend_type(self, ffi, finishlist):
- self.check_not_partial()
- base_btype = self.build_baseinttype(ffi, finishlist)
- return global_cache(self, ffi, 'new_enum_type',
- self.get_official_name(),
- self.enumerators, self.enumvalues,
- base_btype, key=self)
-
- def build_baseinttype(self, ffi, finishlist):
- if self.baseinttype is not None:
- return self.baseinttype.get_cached_btype(ffi, finishlist)
- #
- if self.enumvalues:
- smallest_value = min(self.enumvalues)
- largest_value = max(self.enumvalues)
- else:
- import warnings
- try:
- # XXX! The goal is to ensure that the warnings.warn()
- # will not suppress the warning. We want to get it
- # several times if we reach this point several times.
- __warningregistry__.clear()
- except NameError:
- pass
- warnings.warn("%r has no values explicitly defined; "
- "guessing that it is equivalent to 'unsigned int'"
- % self._get_c_name())
- smallest_value = largest_value = 0
- if smallest_value < 0: # needs a signed type
- sign = 1
- candidate1 = PrimitiveType("int")
- candidate2 = PrimitiveType("long")
- else:
- sign = 0
- candidate1 = PrimitiveType("unsigned int")
- candidate2 = PrimitiveType("unsigned long")
- btype1 = candidate1.get_cached_btype(ffi, finishlist)
- btype2 = candidate2.get_cached_btype(ffi, finishlist)
- size1 = ffi.sizeof(btype1)
- size2 = ffi.sizeof(btype2)
- if (smallest_value >= ((-1) << (8*size1-1)) and
- largest_value < (1 << (8*size1-sign))):
- return btype1
- if (smallest_value >= ((-1) << (8*size2-1)) and
- largest_value < (1 << (8*size2-sign))):
- return btype2
- raise CDefError("%s values don't all fit into either 'long' "
- "or 'unsigned long'" % self._get_c_name())
-
-def unknown_type(name, structname=None):
- if structname is None:
- structname = '$%s' % name
- tp = StructType(structname, None, None, None)
- tp.force_the_name(name)
- tp.origin = "unknown_type"
- return tp
-
-def unknown_ptr_type(name, structname=None):
- if structname is None:
- structname = '$$%s' % name
- tp = StructType(structname, None, None, None)
- return NamedPointerType(tp, name)
-
-
-global_lock = allocate_lock()
-_typecache_cffi_backend = weakref.WeakValueDictionary()
-
-def get_typecache(backend):
- # returns _typecache_cffi_backend if backend is the _cffi_backend
- # module, or type(backend).__typecache if backend is an instance of
- # CTypesBackend (or some FakeBackend class during tests)
- if isinstance(backend, types.ModuleType):
- return _typecache_cffi_backend
- with global_lock:
- if not hasattr(type(backend), '__typecache'):
- type(backend).__typecache = weakref.WeakValueDictionary()
- return type(backend).__typecache
-
-def global_cache(srctype, ffi, funcname, *args, **kwds):
- key = kwds.pop('key', (funcname, args))
- assert not kwds
- try:
- return ffi._typecache[key]
- except KeyError:
- pass
- try:
- res = getattr(ffi._backend, funcname)(*args)
- except NotImplementedError as e:
- raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e))
- # note that setdefault() on WeakValueDictionary is not atomic
- # and contains a rare bug (http://bugs.python.org/issue19542);
- # we have to use a lock and do it ourselves
- cache = ffi._typecache
- with global_lock:
- res1 = cache.get(key)
- if res1 is None:
- cache[key] = res
- return res
- else:
- return res1
-
-def pointer_cache(ffi, BType):
- return global_cache('?', ffi, 'new_pointer_type', BType)
-
-def attach_exception_info(e, name):
- if e.args and type(e.args[0]) is str:
- e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:]
diff --git a/resources/python/bin/3.7/mac/cffi/parse_c_type.h b/resources/python/bin/3.7/mac/cffi/parse_c_type.h
deleted file mode 100644
index 84e4ef856..000000000
--- a/resources/python/bin/3.7/mac/cffi/parse_c_type.h
+++ /dev/null
@@ -1,181 +0,0 @@
-
-/* This part is from file 'cffi/parse_c_type.h'. It is copied at the
- beginning of C sources generated by CFFI's ffi.set_source(). */
-
-typedef void *_cffi_opcode_t;
-
-#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8))
-#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode)
-#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8)
-
-#define _CFFI_OP_PRIMITIVE 1
-#define _CFFI_OP_POINTER 3
-#define _CFFI_OP_ARRAY 5
-#define _CFFI_OP_OPEN_ARRAY 7
-#define _CFFI_OP_STRUCT_UNION 9
-#define _CFFI_OP_ENUM 11
-#define _CFFI_OP_FUNCTION 13
-#define _CFFI_OP_FUNCTION_END 15
-#define _CFFI_OP_NOOP 17
-#define _CFFI_OP_BITFIELD 19
-#define _CFFI_OP_TYPENAME 21
-#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs
-#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs
-#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg)
-#define _CFFI_OP_CONSTANT 29
-#define _CFFI_OP_CONSTANT_INT 31
-#define _CFFI_OP_GLOBAL_VAR 33
-#define _CFFI_OP_DLOPEN_FUNC 35
-#define _CFFI_OP_DLOPEN_CONST 37
-#define _CFFI_OP_GLOBAL_VAR_F 39
-#define _CFFI_OP_EXTERN_PYTHON 41
-
-#define _CFFI_PRIM_VOID 0
-#define _CFFI_PRIM_BOOL 1
-#define _CFFI_PRIM_CHAR 2
-#define _CFFI_PRIM_SCHAR 3
-#define _CFFI_PRIM_UCHAR 4
-#define _CFFI_PRIM_SHORT 5
-#define _CFFI_PRIM_USHORT 6
-#define _CFFI_PRIM_INT 7
-#define _CFFI_PRIM_UINT 8
-#define _CFFI_PRIM_LONG 9
-#define _CFFI_PRIM_ULONG 10
-#define _CFFI_PRIM_LONGLONG 11
-#define _CFFI_PRIM_ULONGLONG 12
-#define _CFFI_PRIM_FLOAT 13
-#define _CFFI_PRIM_DOUBLE 14
-#define _CFFI_PRIM_LONGDOUBLE 15
-
-#define _CFFI_PRIM_WCHAR 16
-#define _CFFI_PRIM_INT8 17
-#define _CFFI_PRIM_UINT8 18
-#define _CFFI_PRIM_INT16 19
-#define _CFFI_PRIM_UINT16 20
-#define _CFFI_PRIM_INT32 21
-#define _CFFI_PRIM_UINT32 22
-#define _CFFI_PRIM_INT64 23
-#define _CFFI_PRIM_UINT64 24
-#define _CFFI_PRIM_INTPTR 25
-#define _CFFI_PRIM_UINTPTR 26
-#define _CFFI_PRIM_PTRDIFF 27
-#define _CFFI_PRIM_SIZE 28
-#define _CFFI_PRIM_SSIZE 29
-#define _CFFI_PRIM_INT_LEAST8 30
-#define _CFFI_PRIM_UINT_LEAST8 31
-#define _CFFI_PRIM_INT_LEAST16 32
-#define _CFFI_PRIM_UINT_LEAST16 33
-#define _CFFI_PRIM_INT_LEAST32 34
-#define _CFFI_PRIM_UINT_LEAST32 35
-#define _CFFI_PRIM_INT_LEAST64 36
-#define _CFFI_PRIM_UINT_LEAST64 37
-#define _CFFI_PRIM_INT_FAST8 38
-#define _CFFI_PRIM_UINT_FAST8 39
-#define _CFFI_PRIM_INT_FAST16 40
-#define _CFFI_PRIM_UINT_FAST16 41
-#define _CFFI_PRIM_INT_FAST32 42
-#define _CFFI_PRIM_UINT_FAST32 43
-#define _CFFI_PRIM_INT_FAST64 44
-#define _CFFI_PRIM_UINT_FAST64 45
-#define _CFFI_PRIM_INTMAX 46
-#define _CFFI_PRIM_UINTMAX 47
-#define _CFFI_PRIM_FLOATCOMPLEX 48
-#define _CFFI_PRIM_DOUBLECOMPLEX 49
-#define _CFFI_PRIM_CHAR16 50
-#define _CFFI_PRIM_CHAR32 51
-
-#define _CFFI__NUM_PRIM 52
-#define _CFFI__UNKNOWN_PRIM (-1)
-#define _CFFI__UNKNOWN_FLOAT_PRIM (-2)
-#define _CFFI__UNKNOWN_LONG_DOUBLE (-3)
-
-#define _CFFI__IO_FILE_STRUCT (-1)
-
-
-struct _cffi_global_s {
- const char *name;
- void *address;
- _cffi_opcode_t type_op;
- void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown
- // OP_CPYTHON_BLTN_*: addr of direct function
-};
-
-struct _cffi_getconst_s {
- unsigned long long value;
- const struct _cffi_type_context_s *ctx;
- int gindex;
-};
-
-struct _cffi_struct_union_s {
- const char *name;
- int type_index; // -> _cffi_types, on a OP_STRUCT_UNION
- int flags; // _CFFI_F_* flags below
- size_t size;
- int alignment;
- int first_field_index; // -> _cffi_fields array
- int num_fields;
-};
-#define _CFFI_F_UNION 0x01 // is a union, not a struct
-#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the
- // "standard layout" or if some are missing
-#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct
-#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include()
-#define _CFFI_F_OPAQUE 0x10 // opaque
-
-struct _cffi_field_s {
- const char *name;
- size_t field_offset;
- size_t field_size;
- _cffi_opcode_t field_type_op;
-};
-
-struct _cffi_enum_s {
- const char *name;
- int type_index; // -> _cffi_types, on a OP_ENUM
- int type_prim; // _CFFI_PRIM_xxx
- const char *enumerators; // comma-delimited string
-};
-
-struct _cffi_typename_s {
- const char *name;
- int type_index; /* if opaque, points to a possibly artificial
- OP_STRUCT which is itself opaque */
-};
-
-struct _cffi_type_context_s {
- _cffi_opcode_t *types;
- const struct _cffi_global_s *globals;
- const struct _cffi_field_s *fields;
- const struct _cffi_struct_union_s *struct_unions;
- const struct _cffi_enum_s *enums;
- const struct _cffi_typename_s *typenames;
- int num_globals;
- int num_struct_unions;
- int num_enums;
- int num_typenames;
- const char *const *includes;
- int num_types;
- int flags; /* future extension */
-};
-
-struct _cffi_parse_info_s {
- const struct _cffi_type_context_s *ctx;
- _cffi_opcode_t *output;
- unsigned int output_size;
- size_t error_location;
- const char *error_message;
-};
-
-struct _cffi_externpy_s {
- const char *name;
- size_t size_of_result;
- void *reserved1, *reserved2;
-};
-
-#ifdef _CFFI_INTERNAL
-static int parse_c_type(struct _cffi_parse_info_s *info, const char *input);
-static int search_in_globals(const struct _cffi_type_context_s *ctx,
- const char *search, size_t search_len);
-static int search_in_struct_unions(const struct _cffi_type_context_s *ctx,
- const char *search, size_t search_len);
-#endif
diff --git a/resources/python/bin/3.7/mac/cffi/pkgconfig.py b/resources/python/bin/3.7/mac/cffi/pkgconfig.py
deleted file mode 100644
index 5c93f15a6..000000000
--- a/resources/python/bin/3.7/mac/cffi/pkgconfig.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# pkg-config, https://www.freedesktop.org/wiki/Software/pkg-config/ integration for cffi
-import sys, os, subprocess
-
-from .error import PkgConfigError
-
-
-def merge_flags(cfg1, cfg2):
- """Merge values from cffi config flags cfg2 to cf1
-
- Example:
- merge_flags({"libraries": ["one"]}, {"libraries": ["two"]})
- {"libraries": ["one", "two"]}
- """
- for key, value in cfg2.items():
- if key not in cfg1:
- cfg1[key] = value
- else:
- if not isinstance(cfg1[key], list):
- raise TypeError("cfg1[%r] should be a list of strings" % (key,))
- if not isinstance(value, list):
- raise TypeError("cfg2[%r] should be a list of strings" % (key,))
- cfg1[key].extend(value)
- return cfg1
-
-
-def call(libname, flag, encoding=sys.getfilesystemencoding()):
- """Calls pkg-config and returns the output if found
- """
- a = ["pkg-config", "--print-errors"]
- a.append(flag)
- a.append(libname)
- try:
- pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- except EnvironmentError as e:
- raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),))
-
- bout, berr = pc.communicate()
- if pc.returncode != 0:
- try:
- berr = berr.decode(encoding)
- except Exception:
- pass
- raise PkgConfigError(berr.strip())
-
- if sys.version_info >= (3,) and not isinstance(bout, str): # Python 3.x
- try:
- bout = bout.decode(encoding)
- except UnicodeDecodeError:
- raise PkgConfigError("pkg-config %s %s returned bytes that cannot "
- "be decoded with encoding %r:\n%r" %
- (flag, libname, encoding, bout))
-
- if os.altsep != '\\' and '\\' in bout:
- raise PkgConfigError("pkg-config %s %s returned an unsupported "
- "backslash-escaped output:\n%r" %
- (flag, libname, bout))
- return bout
-
-
-def flags_from_pkgconfig(libs):
- r"""Return compiler line flags for FFI.set_source based on pkg-config output
-
- Usage
- ...
- ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"])
-
- If pkg-config is installed on build machine, then arguments include_dirs,
- library_dirs, libraries, define_macros, extra_compile_args and
- extra_link_args are extended with an output of pkg-config for libfoo and
- libbar.
-
- Raises PkgConfigError in case the pkg-config call fails.
- """
-
- def get_include_dirs(string):
- return [x[2:] for x in string.split() if x.startswith("-I")]
-
- def get_library_dirs(string):
- return [x[2:] for x in string.split() if x.startswith("-L")]
-
- def get_libraries(string):
- return [x[2:] for x in string.split() if x.startswith("-l")]
-
- # convert -Dfoo=bar to list of tuples [("foo", "bar")] expected by distutils
- def get_macros(string):
- def _macro(x):
- x = x[2:] # drop "-D"
- if '=' in x:
- return tuple(x.split("=", 1)) # "-Dfoo=bar" => ("foo", "bar")
- else:
- return (x, None) # "-Dfoo" => ("foo", None)
- return [_macro(x) for x in string.split() if x.startswith("-D")]
-
- def get_other_cflags(string):
- return [x for x in string.split() if not x.startswith("-I") and
- not x.startswith("-D")]
-
- def get_other_libs(string):
- return [x for x in string.split() if not x.startswith("-L") and
- not x.startswith("-l")]
-
- # return kwargs for given libname
- def kwargs(libname):
- fse = sys.getfilesystemencoding()
- all_cflags = call(libname, "--cflags")
- all_libs = call(libname, "--libs")
- return {
- "include_dirs": get_include_dirs(all_cflags),
- "library_dirs": get_library_dirs(all_libs),
- "libraries": get_libraries(all_libs),
- "define_macros": get_macros(all_cflags),
- "extra_compile_args": get_other_cflags(all_cflags),
- "extra_link_args": get_other_libs(all_libs),
- }
-
- # merge all arguments together
- ret = {}
- for libname in libs:
- lib_flags = kwargs(libname)
- merge_flags(ret, lib_flags)
- return ret
diff --git a/resources/python/bin/3.7/mac/cffi/recompiler.py b/resources/python/bin/3.7/mac/cffi/recompiler.py
deleted file mode 100644
index 5d9d32d71..000000000
--- a/resources/python/bin/3.7/mac/cffi/recompiler.py
+++ /dev/null
@@ -1,1581 +0,0 @@
-import os, sys, io
-from . import ffiplatform, model
-from .error import VerificationError
-from .cffi_opcode import *
-
-VERSION_BASE = 0x2601
-VERSION_EMBEDDED = 0x2701
-VERSION_CHAR16CHAR32 = 0x2801
-
-USE_LIMITED_API = (sys.platform != 'win32' or sys.version_info < (3, 0) or
- sys.version_info >= (3, 5))
-
-
-class GlobalExpr:
- def __init__(self, name, address, type_op, size=0, check_value=0):
- self.name = name
- self.address = address
- self.type_op = type_op
- self.size = size
- self.check_value = check_value
-
- def as_c_expr(self):
- return ' { "%s", (void *)%s, %s, (void *)%s },' % (
- self.name, self.address, self.type_op.as_c_expr(), self.size)
-
- def as_python_expr(self):
- return "b'%s%s',%d" % (self.type_op.as_python_bytes(), self.name,
- self.check_value)
-
-class FieldExpr:
- def __init__(self, name, field_offset, field_size, fbitsize, field_type_op):
- self.name = name
- self.field_offset = field_offset
- self.field_size = field_size
- self.fbitsize = fbitsize
- self.field_type_op = field_type_op
-
- def as_c_expr(self):
- spaces = " " * len(self.name)
- return (' { "%s", %s,\n' % (self.name, self.field_offset) +
- ' %s %s,\n' % (spaces, self.field_size) +
- ' %s %s },' % (spaces, self.field_type_op.as_c_expr()))
-
- def as_python_expr(self):
- raise NotImplementedError
-
- def as_field_python_expr(self):
- if self.field_type_op.op == OP_NOOP:
- size_expr = ''
- elif self.field_type_op.op == OP_BITFIELD:
- size_expr = format_four_bytes(self.fbitsize)
- else:
- raise NotImplementedError
- return "b'%s%s%s'" % (self.field_type_op.as_python_bytes(),
- size_expr,
- self.name)
-
-class StructUnionExpr:
- def __init__(self, name, type_index, flags, size, alignment, comment,
- first_field_index, c_fields):
- self.name = name
- self.type_index = type_index
- self.flags = flags
- self.size = size
- self.alignment = alignment
- self.comment = comment
- self.first_field_index = first_field_index
- self.c_fields = c_fields
-
- def as_c_expr(self):
- return (' { "%s", %d, %s,' % (self.name, self.type_index, self.flags)
- + '\n %s, %s, ' % (self.size, self.alignment)
- + '%d, %d ' % (self.first_field_index, len(self.c_fields))
- + ('/* %s */ ' % self.comment if self.comment else '')
- + '},')
-
- def as_python_expr(self):
- flags = eval(self.flags, G_FLAGS)
- fields_expr = [c_field.as_field_python_expr()
- for c_field in self.c_fields]
- return "(b'%s%s%s',%s)" % (
- format_four_bytes(self.type_index),
- format_four_bytes(flags),
- self.name,
- ','.join(fields_expr))
-
-class EnumExpr:
- def __init__(self, name, type_index, size, signed, allenums):
- self.name = name
- self.type_index = type_index
- self.size = size
- self.signed = signed
- self.allenums = allenums
-
- def as_c_expr(self):
- return (' { "%s", %d, _cffi_prim_int(%s, %s),\n'
- ' "%s" },' % (self.name, self.type_index,
- self.size, self.signed, self.allenums))
-
- def as_python_expr(self):
- prim_index = {
- (1, 0): PRIM_UINT8, (1, 1): PRIM_INT8,
- (2, 0): PRIM_UINT16, (2, 1): PRIM_INT16,
- (4, 0): PRIM_UINT32, (4, 1): PRIM_INT32,
- (8, 0): PRIM_UINT64, (8, 1): PRIM_INT64,
- }[self.size, self.signed]
- return "b'%s%s%s\\x00%s'" % (format_four_bytes(self.type_index),
- format_four_bytes(prim_index),
- self.name, self.allenums)
-
-class TypenameExpr:
- def __init__(self, name, type_index):
- self.name = name
- self.type_index = type_index
-
- def as_c_expr(self):
- return ' { "%s", %d },' % (self.name, self.type_index)
-
- def as_python_expr(self):
- return "b'%s%s'" % (format_four_bytes(self.type_index), self.name)
-
-
-# ____________________________________________________________
-
-
-class Recompiler:
- _num_externpy = 0
-
- def __init__(self, ffi, module_name, target_is_python=False):
- self.ffi = ffi
- self.module_name = module_name
- self.target_is_python = target_is_python
- self._version = VERSION_BASE
-
- def needs_version(self, ver):
- self._version = max(self._version, ver)
-
- def collect_type_table(self):
- self._typesdict = {}
- self._generate("collecttype")
- #
- all_decls = sorted(self._typesdict, key=str)
- #
- # prepare all FUNCTION bytecode sequences first
- self.cffi_types = []
- for tp in all_decls:
- if tp.is_raw_function:
- assert self._typesdict[tp] is None
- self._typesdict[tp] = len(self.cffi_types)
- self.cffi_types.append(tp) # placeholder
- for tp1 in tp.args:
- assert isinstance(tp1, (model.VoidType,
- model.BasePrimitiveType,
- model.PointerType,
- model.StructOrUnionOrEnum,
- model.FunctionPtrType))
- if self._typesdict[tp1] is None:
- self._typesdict[tp1] = len(self.cffi_types)
- self.cffi_types.append(tp1) # placeholder
- self.cffi_types.append('END') # placeholder
- #
- # prepare all OTHER bytecode sequences
- for tp in all_decls:
- if not tp.is_raw_function and self._typesdict[tp] is None:
- self._typesdict[tp] = len(self.cffi_types)
- self.cffi_types.append(tp) # placeholder
- if tp.is_array_type and tp.length is not None:
- self.cffi_types.append('LEN') # placeholder
- assert None not in self._typesdict.values()
- #
- # collect all structs and unions and enums
- self._struct_unions = {}
- self._enums = {}
- for tp in all_decls:
- if isinstance(tp, model.StructOrUnion):
- self._struct_unions[tp] = None
- elif isinstance(tp, model.EnumType):
- self._enums[tp] = None
- for i, tp in enumerate(sorted(self._struct_unions,
- key=lambda tp: tp.name)):
- self._struct_unions[tp] = i
- for i, tp in enumerate(sorted(self._enums,
- key=lambda tp: tp.name)):
- self._enums[tp] = i
- #
- # emit all bytecode sequences now
- for tp in all_decls:
- method = getattr(self, '_emit_bytecode_' + tp.__class__.__name__)
- method(tp, self._typesdict[tp])
- #
- # consistency check
- for op in self.cffi_types:
- assert isinstance(op, CffiOp)
- self.cffi_types = tuple(self.cffi_types) # don't change any more
-
- def _enum_fields(self, tp):
- # When producing C, expand all anonymous struct/union fields.
- # That's necessary to have C code checking the offsets of the
- # individual fields contained in them. When producing Python,
- # don't do it and instead write it like it is, with the
- # corresponding fields having an empty name. Empty names are
- # recognized at runtime when we import the generated Python
- # file.
- expand_anonymous_struct_union = not self.target_is_python
- return tp.enumfields(expand_anonymous_struct_union)
-
- def _do_collect_type(self, tp):
- if not isinstance(tp, model.BaseTypeByIdentity):
- if isinstance(tp, tuple):
- for x in tp:
- self._do_collect_type(x)
- return
- if tp not in self._typesdict:
- self._typesdict[tp] = None
- if isinstance(tp, model.FunctionPtrType):
- self._do_collect_type(tp.as_raw_function())
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldtypes is not None and (
- tp not in self.ffi._parser._included_declarations):
- for name1, tp1, _, _ in self._enum_fields(tp):
- self._do_collect_type(self._field_type(tp, name1, tp1))
- else:
- for _, x in tp._get_items():
- self._do_collect_type(x)
-
- def _generate(self, step_name):
- lst = self.ffi._parser._declarations.items()
- for name, (tp, quals) in sorted(lst):
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_cpy_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in recompile(): %r" % name)
- try:
- self._current_quals = quals
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- # ----------
-
- ALL_STEPS = ["global", "field", "struct_union", "enum", "typename"]
-
- def collect_step_tables(self):
- # collect the declarations for '_cffi_globals', '_cffi_typenames', etc.
- self._lsts = {}
- for step_name in self.ALL_STEPS:
- self._lsts[step_name] = []
- self._seen_struct_unions = set()
- self._generate("ctx")
- self._add_missing_struct_unions()
- #
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- if step_name != "field":
- lst.sort(key=lambda entry: entry.name)
- self._lsts[step_name] = tuple(lst) # don't change any more
- #
- # check for a possible internal inconsistency: _cffi_struct_unions
- # should have been generated with exactly self._struct_unions
- lst = self._lsts["struct_union"]
- for tp, i in self._struct_unions.items():
- assert i < len(lst)
- assert lst[i].name == tp.name
- assert len(lst) == len(self._struct_unions)
- # same with enums
- lst = self._lsts["enum"]
- for tp, i in self._enums.items():
- assert i < len(lst)
- assert lst[i].name == tp.name
- assert len(lst) == len(self._enums)
-
- # ----------
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def write_source_to_f(self, f, preamble):
- if self.target_is_python:
- assert preamble is None
- self.write_py_source_to_f(f)
- else:
- assert preamble is not None
- self.write_c_source_to_f(f, preamble)
-
- def _rel_readlines(self, filename):
- g = open(os.path.join(os.path.dirname(__file__), filename), 'r')
- lines = g.readlines()
- g.close()
- return lines
-
- def write_c_source_to_f(self, f, preamble):
- self._f = f
- prnt = self._prnt
- if self.ffi._embedding is not None:
- prnt('#define _CFFI_USE_EMBEDDING')
- if not USE_LIMITED_API:
- prnt('#define _CFFI_NO_LIMITED_API')
- #
- # first the '#include' (actually done by inlining the file's content)
- lines = self._rel_readlines('_cffi_include.h')
- i = lines.index('#include "parse_c_type.h"\n')
- lines[i:i+1] = self._rel_readlines('parse_c_type.h')
- prnt(''.join(lines))
- #
- # if we have ffi._embedding != None, we give it here as a macro
- # and include an extra file
- base_module_name = self.module_name.split('.')[-1]
- if self.ffi._embedding is not None:
- prnt('#define _CFFI_MODULE_NAME "%s"' % (self.module_name,))
- prnt('static const char _CFFI_PYTHON_STARTUP_CODE[] = {')
- self._print_string_literal_in_array(self.ffi._embedding)
- prnt('0 };')
- prnt('#ifdef PYPY_VERSION')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % (
- base_module_name,))
- prnt('#elif PY_MAJOR_VERSION >= 3')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % (
- base_module_name,))
- prnt('#else')
- prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % (
- base_module_name,))
- prnt('#endif')
- lines = self._rel_readlines('_embedding.h')
- i = lines.index('#include "_cffi_errors.h"\n')
- lines[i:i+1] = self._rel_readlines('_cffi_errors.h')
- prnt(''.join(lines))
- self.needs_version(VERSION_EMBEDDED)
- #
- # then paste the C source given by the user, verbatim.
- prnt('/************************************************************/')
- prnt()
- prnt(preamble)
- prnt()
- prnt('/************************************************************/')
- prnt()
- #
- # the declaration of '_cffi_types'
- prnt('static void *_cffi_types[] = {')
- typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()])
- for i, op in enumerate(self.cffi_types):
- comment = ''
- if i in typeindex2type:
- comment = ' // ' + typeindex2type[i]._get_c_name()
- prnt('/* %2d */ %s,%s' % (i, op.as_c_expr(), comment))
- if not self.cffi_types:
- prnt(' 0')
- prnt('};')
- prnt()
- #
- # call generate_cpy_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._seen_constants = set()
- self._generate("decl")
- #
- # the declaration of '_cffi_globals' and '_cffi_typenames'
- nums = {}
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- nums[step_name] = len(lst)
- if nums[step_name] > 0:
- prnt('static const struct _cffi_%s_s _cffi_%ss[] = {' % (
- step_name, step_name))
- for entry in lst:
- prnt(entry.as_c_expr())
- prnt('};')
- prnt()
- #
- # the declaration of '_cffi_includes'
- if self.ffi._included_ffis:
- prnt('static const char * const _cffi_includes[] = {')
- for ffi_to_include in self.ffi._included_ffis:
- try:
- included_module_name, included_source = (
- ffi_to_include._assigned_source[:2])
- except AttributeError:
- raise VerificationError(
- "ffi object %r includes %r, but the latter has not "
- "been prepared with set_source()" % (
- self.ffi, ffi_to_include,))
- if included_source is None:
- raise VerificationError(
- "not implemented yet: ffi.include() of a Python-based "
- "ffi inside a C-based ffi")
- prnt(' "%s",' % (included_module_name,))
- prnt(' NULL')
- prnt('};')
- prnt()
- #
- # the declaration of '_cffi_type_context'
- prnt('static const struct _cffi_type_context_s _cffi_type_context = {')
- prnt(' _cffi_types,')
- for step_name in self.ALL_STEPS:
- if nums[step_name] > 0:
- prnt(' _cffi_%ss,' % step_name)
- else:
- prnt(' NULL, /* no %ss */' % step_name)
- for step_name in self.ALL_STEPS:
- if step_name != "field":
- prnt(' %d, /* num_%ss */' % (nums[step_name], step_name))
- if self.ffi._included_ffis:
- prnt(' _cffi_includes,')
- else:
- prnt(' NULL, /* no includes */')
- prnt(' %d, /* num_types */' % (len(self.cffi_types),))
- flags = 0
- if self._num_externpy > 0 or self.ffi._embedding is not None:
- flags |= 1 # set to mean that we use extern "Python"
- prnt(' %d, /* flags */' % flags)
- prnt('};')
- prnt()
- #
- # the init function
- prnt('#ifdef __GNUC__')
- prnt('# pragma GCC visibility push(default) /* for -fvisibility= */')
- prnt('#endif')
- prnt()
- prnt('#ifdef PYPY_VERSION')
- prnt('PyMODINIT_FUNC')
- prnt('_cffi_pypyinit_%s(const void *p[])' % (base_module_name,))
- prnt('{')
- if flags & 1:
- prnt(' if (((intptr_t)p[0]) >= 0x0A03) {')
- prnt(' _cffi_call_python_org = '
- '(void(*)(struct _cffi_externpy_s *, char *))p[1];')
- prnt(' }')
- prnt(' p[0] = (const void *)0x%x;' % self._version)
- prnt(' p[1] = &_cffi_type_context;')
- prnt('#if PY_MAJOR_VERSION >= 3')
- prnt(' return NULL;')
- prnt('#endif')
- prnt('}')
- # on Windows, distutils insists on putting init_cffi_xyz in
- # 'export_symbols', so instead of fighting it, just give up and
- # give it one
- prnt('# ifdef _MSC_VER')
- prnt(' PyMODINIT_FUNC')
- prnt('# if PY_MAJOR_VERSION >= 3')
- prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,))
- prnt('# else')
- prnt(' init%s(void) { }' % (base_module_name,))
- prnt('# endif')
- prnt('# endif')
- prnt('#elif PY_MAJOR_VERSION >= 3')
- prnt('PyMODINIT_FUNC')
- prnt('PyInit_%s(void)' % (base_module_name,))
- prnt('{')
- prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
- self.module_name, self._version))
- prnt('}')
- prnt('#else')
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % (base_module_name,))
- prnt('{')
- prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % (
- self.module_name, self._version))
- prnt('}')
- prnt('#endif')
- prnt()
- prnt('#ifdef __GNUC__')
- prnt('# pragma GCC visibility pop')
- prnt('#endif')
- self._version = None
-
- def _to_py(self, x):
- if isinstance(x, str):
- return "b'%s'" % (x,)
- if isinstance(x, (list, tuple)):
- rep = [self._to_py(item) for item in x]
- if len(rep) == 1:
- rep.append('')
- return "(%s)" % (','.join(rep),)
- return x.as_python_expr() # Py2: unicode unexpected; Py3: bytes unexp.
-
- def write_py_source_to_f(self, f):
- self._f = f
- prnt = self._prnt
- #
- # header
- prnt("# auto-generated file")
- prnt("import _cffi_backend")
- #
- # the 'import' of the included ffis
- num_includes = len(self.ffi._included_ffis or ())
- for i in range(num_includes):
- ffi_to_include = self.ffi._included_ffis[i]
- try:
- included_module_name, included_source = (
- ffi_to_include._assigned_source[:2])
- except AttributeError:
- raise VerificationError(
- "ffi object %r includes %r, but the latter has not "
- "been prepared with set_source()" % (
- self.ffi, ffi_to_include,))
- if included_source is not None:
- raise VerificationError(
- "not implemented yet: ffi.include() of a C-based "
- "ffi inside a Python-based ffi")
- prnt('from %s import ffi as _ffi%d' % (included_module_name, i))
- prnt()
- prnt("ffi = _cffi_backend.FFI('%s'," % (self.module_name,))
- prnt(" _version = 0x%x," % (self._version,))
- self._version = None
- #
- # the '_types' keyword argument
- self.cffi_types = tuple(self.cffi_types) # don't change any more
- types_lst = [op.as_python_bytes() for op in self.cffi_types]
- prnt(' _types = %s,' % (self._to_py(''.join(types_lst)),))
- typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()])
- #
- # the keyword arguments from ALL_STEPS
- for step_name in self.ALL_STEPS:
- lst = self._lsts[step_name]
- if len(lst) > 0 and step_name != "field":
- prnt(' _%ss = %s,' % (step_name, self._to_py(lst)))
- #
- # the '_includes' keyword argument
- if num_includes > 0:
- prnt(' _includes = (%s,),' % (
- ', '.join(['_ffi%d' % i for i in range(num_includes)]),))
- #
- # the footer
- prnt(')')
-
- # ----------
-
- def _gettypenum(self, type):
- # a KeyError here is a bug. please report it! :-)
- return self._typesdict[type]
-
- def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode):
- extraarg = ''
- if isinstance(tp, model.BasePrimitiveType) and not tp.is_complex_type():
- if tp.is_integer_type() and tp.name != '_Bool':
- converter = '_cffi_to_c_int'
- extraarg = ', %s' % tp.name
- elif isinstance(tp, model.UnknownFloatType):
- # don't check with is_float_type(): it may be a 'long
- # double' here, and _cffi_to_c_double would loose precision
- converter = '(%s)_cffi_to_c_double' % (tp.get_c_name(''),)
- else:
- cname = tp.get_c_name('')
- converter = '(%s)_cffi_to_c_%s' % (cname,
- tp.name.replace(' ', '_'))
- if cname in ('char16_t', 'char32_t'):
- self.needs_version(VERSION_CHAR16CHAR32)
- errvalue = '-1'
- #
- elif isinstance(tp, model.PointerType):
- self._convert_funcarg_to_c_ptr_or_array(tp, fromvar,
- tovar, errcode)
- return
- #
- elif (isinstance(tp, model.StructOrUnionOrEnum) or
- isinstance(tp, model.BasePrimitiveType)):
- # a struct (not a struct pointer) as a function argument;
- # or, a complex (the same code works)
- self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)'
- % (tovar, self._gettypenum(tp), fromvar))
- self._prnt(' %s;' % errcode)
- return
- #
- elif isinstance(tp, model.FunctionPtrType):
- converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('')
- extraarg = ', _cffi_type(%d)' % self._gettypenum(tp)
- errvalue = 'NULL'
- #
- else:
- raise NotImplementedError(tp)
- #
- self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg))
- self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % (
- tovar, tp.get_c_name(''), errvalue))
- self._prnt(' %s;' % errcode)
-
- def _extra_local_variables(self, tp, localvars, freelines):
- if isinstance(tp, model.PointerType):
- localvars.add('Py_ssize_t datasize')
- localvars.add('struct _cffi_freeme_s *large_args_free = NULL')
- freelines.add('if (large_args_free != NULL)'
- ' _cffi_free_array_arguments(large_args_free);')
-
- def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode):
- self._prnt(' datasize = _cffi_prepare_pointer_call_argument(')
- self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % (
- self._gettypenum(tp), fromvar, tovar))
- self._prnt(' if (datasize != 0) {')
- self._prnt(' %s = ((size_t)datasize) <= 640 ? '
- '(%s)alloca((size_t)datasize) : NULL;' % (
- tovar, tp.get_c_name('')))
- self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, '
- '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar))
- self._prnt(' datasize, &large_args_free) < 0)')
- self._prnt(' %s;' % errcode)
- self._prnt(' }')
-
- def _convert_expr_from_c(self, tp, var, context):
- if isinstance(tp, model.BasePrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- return '_cffi_from_c_int(%s, %s)' % (var, tp.name)
- elif isinstance(tp, model.UnknownFloatType):
- return '_cffi_from_c_double(%s)' % (var,)
- elif tp.name != 'long double' and not tp.is_complex_type():
- cname = tp.name.replace(' ', '_')
- if cname in ('char16_t', 'char32_t'):
- self.needs_version(VERSION_CHAR16CHAR32)
- return '_cffi_from_c_%s(%s)' % (cname, var)
- else:
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.ArrayType):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(model.PointerType(tp.item)))
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldnames is None:
- raise TypeError("'%s' is used as %s, but is opaque" % (
- tp._get_c_name(), context))
- return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.EnumType):
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- else:
- raise NotImplementedError(tp)
-
- # ----------
- # typedefs
-
- def _typedef_type(self, tp, name):
- return self._global_type(tp, "(*(%s *)0)" % (name,))
-
- def _generate_cpy_typedef_collecttype(self, tp, name):
- self._do_collect_type(self._typedef_type(tp, name))
-
- def _generate_cpy_typedef_decl(self, tp, name):
- pass
-
- def _typedef_ctx(self, tp, name):
- type_index = self._typesdict[tp]
- self._lsts["typename"].append(TypenameExpr(name, type_index))
-
- def _generate_cpy_typedef_ctx(self, tp, name):
- tp = self._typedef_type(tp, name)
- self._typedef_ctx(tp, name)
- if getattr(tp, "origin", None) == "unknown_type":
- self._struct_ctx(tp, tp.name, approxname=None)
- elif isinstance(tp, model.NamedPointerType):
- self._struct_ctx(tp.totype, tp.totype.name, approxname=tp.name,
- named_ptr=tp)
-
- # ----------
- # function declarations
-
- def _generate_cpy_function_collecttype(self, tp, name):
- self._do_collect_type(tp.as_raw_function())
- if tp.ellipsis and not self.target_is_python:
- self._do_collect_type(tp)
-
- def _generate_cpy_function_decl(self, tp, name):
- assert not self.target_is_python
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no CPython wrapper)
- self._generate_cpy_constant_decl(tp, name)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- if numargs == 0:
- argname = 'noarg'
- elif numargs == 1:
- argname = 'arg0'
- else:
- argname = 'args'
- #
- # ------------------------------
- # the 'd' version of the function, only for addressof(lib, 'func')
- arguments = []
- call_arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arguments.append(type.get_c_name(' x%d' % i, context))
- call_arguments.append('x%d' % i)
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- if tp.abi:
- abi = tp.abi + ' '
- else:
- abi = ''
- name_and_arguments = '%s_cffi_d_%s(%s)' % (abi, name, repr_arguments)
- prnt('static %s' % (tp.result.get_c_name(name_and_arguments),))
- prnt('{')
- call_arguments = ', '.join(call_arguments)
- result_code = 'return '
- if isinstance(tp.result, model.VoidType):
- result_code = ''
- prnt(' %s%s(%s);' % (result_code, name, call_arguments))
- prnt('}')
- #
- prnt('#ifndef PYPY_VERSION') # ------------------------------
- #
- prnt('static PyObject *')
- prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname))
- prnt('{')
- #
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arg = type.get_c_name(' x%d' % i, context)
- prnt(' %s;' % arg)
- #
- localvars = set()
- freelines = set()
- for type in tp.args:
- self._extra_local_variables(type, localvars, freelines)
- for decl in sorted(localvars):
- prnt(' %s;' % (decl,))
- #
- if not isinstance(tp.result, model.VoidType):
- result_code = 'result = '
- context = 'result of %s' % name
- result_decl = ' %s;' % tp.result.get_c_name(' result', context)
- prnt(result_decl)
- prnt(' PyObject *pyresult;')
- else:
- result_decl = None
- result_code = ''
- #
- if len(tp.args) > 1:
- rng = range(len(tp.args))
- for i in rng:
- prnt(' PyObject *arg%d;' % i)
- prnt()
- prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % (
- name, len(rng), len(rng),
- ', '.join(['&arg%d' % i for i in rng])))
- prnt(' return NULL;')
- prnt()
- #
- for i, type in enumerate(tp.args):
- self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i,
- 'return NULL')
- prnt()
- #
- prnt(' Py_BEGIN_ALLOW_THREADS')
- prnt(' _cffi_restore_errno();')
- call_arguments = ['x%d' % i for i in range(len(tp.args))]
- call_arguments = ', '.join(call_arguments)
- prnt(' { %s%s(%s); }' % (result_code, name, call_arguments))
- prnt(' _cffi_save_errno();')
- prnt(' Py_END_ALLOW_THREADS')
- prnt()
- #
- prnt(' (void)self; /* unused */')
- if numargs == 0:
- prnt(' (void)noarg; /* unused */')
- if result_code:
- prnt(' pyresult = %s;' %
- self._convert_expr_from_c(tp.result, 'result', 'result type'))
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' return pyresult;')
- else:
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' Py_INCREF(Py_None);')
- prnt(' return Py_None;')
- prnt('}')
- #
- prnt('#else') # ------------------------------
- #
- # the PyPy version: need to replace struct/union arguments with
- # pointers, and if the result is a struct/union, insert a first
- # arg that is a pointer to the result. We also do that for
- # complex args and return type.
- def need_indirection(type):
- return (isinstance(type, model.StructOrUnion) or
- (isinstance(type, model.PrimitiveType) and
- type.is_complex_type()))
- difference = False
- arguments = []
- call_arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- indirection = ''
- if need_indirection(type):
- indirection = '*'
- difference = True
- arg = type.get_c_name(' %sx%d' % (indirection, i), context)
- arguments.append(arg)
- call_arguments.append('%sx%d' % (indirection, i))
- tp_result = tp.result
- if need_indirection(tp_result):
- context = 'result of %s' % name
- arg = tp_result.get_c_name(' *result', context)
- arguments.insert(0, arg)
- tp_result = model.void_type
- result_decl = None
- result_code = '*result = '
- difference = True
- if difference:
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- name_and_arguments = '%s_cffi_f_%s(%s)' % (abi, name,
- repr_arguments)
- prnt('static %s' % (tp_result.get_c_name(name_and_arguments),))
- prnt('{')
- if result_decl:
- prnt(result_decl)
- call_arguments = ', '.join(call_arguments)
- prnt(' { %s%s(%s); }' % (result_code, name, call_arguments))
- if result_decl:
- prnt(' return result;')
- prnt('}')
- else:
- prnt('# define _cffi_f_%s _cffi_d_%s' % (name, name))
- #
- prnt('#endif') # ------------------------------
- prnt()
-
- def _generate_cpy_function_ctx(self, tp, name):
- if tp.ellipsis and not self.target_is_python:
- self._generate_cpy_constant_ctx(tp, name)
- return
- type_index = self._typesdict[tp.as_raw_function()]
- numargs = len(tp.args)
- if self.target_is_python:
- meth_kind = OP_DLOPEN_FUNC
- elif numargs == 0:
- meth_kind = OP_CPYTHON_BLTN_N # 'METH_NOARGS'
- elif numargs == 1:
- meth_kind = OP_CPYTHON_BLTN_O # 'METH_O'
- else:
- meth_kind = OP_CPYTHON_BLTN_V # 'METH_VARARGS'
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_f_%s' % name,
- CffiOp(meth_kind, type_index),
- size='_cffi_d_%s' % name))
-
- # ----------
- # named structs or unions
-
- def _field_type(self, tp_struct, field_name, tp_field):
- if isinstance(tp_field, model.ArrayType):
- actual_length = tp_field.length
- if actual_length == '...':
- ptr_struct_name = tp_struct.get_c_name('*')
- actual_length = '_cffi_array_len(((%s)0)->%s)' % (
- ptr_struct_name, field_name)
- tp_item = self._field_type(tp_struct, '%s[0]' % field_name,
- tp_field.item)
- tp_field = model.ArrayType(tp_item, actual_length)
- return tp_field
-
- def _struct_collecttype(self, tp):
- self._do_collect_type(tp)
- if self.target_is_python:
- # also requires nested anon struct/unions in ABI mode, recursively
- for fldtype in tp.anonymous_struct_fields():
- self._struct_collecttype(fldtype)
-
- def _struct_decl(self, tp, cname, approxname):
- if tp.fldtypes is None:
- return
- prnt = self._prnt
- checkfuncname = '_cffi_checkfld_%s' % (approxname,)
- prnt('_CFFI_UNUSED_FN')
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in self._enum_fields(tp):
- try:
- if ftype.is_integer_type() or fbitsize >= 0:
- # accept all integers, but complain on float or double
- if fname != '':
- prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is "
- "an integer */" % (fname, cname, fname))
- continue
- # only accept exactly the type declared, except that '[]'
- # is interpreted as a '*' and so will match any array length.
- # (It would also match '*', but that's harder to detect...)
- while (isinstance(ftype, model.ArrayType)
- and (ftype.length is None or ftype.length == '...')):
- ftype = ftype.item
- fname = fname + '[0]'
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- prnt('struct _cffi_align_%s { char x; %s y; };' % (approxname, cname))
- prnt()
-
- def _struct_ctx(self, tp, cname, approxname, named_ptr=None):
- type_index = self._typesdict[tp]
- reason_for_not_expanding = None
- flags = []
- if isinstance(tp, model.UnionType):
- flags.append("_CFFI_F_UNION")
- if tp.fldtypes is None:
- flags.append("_CFFI_F_OPAQUE")
- reason_for_not_expanding = "opaque"
- if (tp not in self.ffi._parser._included_declarations and
- (named_ptr is None or
- named_ptr not in self.ffi._parser._included_declarations)):
- if tp.fldtypes is None:
- pass # opaque
- elif tp.partial or any(tp.anonymous_struct_fields()):
- pass # field layout obtained silently from the C compiler
- else:
- flags.append("_CFFI_F_CHECK_FIELDS")
- if tp.packed:
- if tp.packed > 1:
- raise NotImplementedError(
- "%r is declared with 'pack=%r'; only 0 or 1 are "
- "supported in API mode (try to use \"...;\", which "
- "does not require a 'pack' declaration)" %
- (tp, tp.packed))
- flags.append("_CFFI_F_PACKED")
- else:
- flags.append("_CFFI_F_EXTERNAL")
- reason_for_not_expanding = "external"
- flags = '|'.join(flags) or '0'
- c_fields = []
- if reason_for_not_expanding is None:
- enumfields = list(self._enum_fields(tp))
- for fldname, fldtype, fbitsize, fqual in enumfields:
- fldtype = self._field_type(tp, fldname, fldtype)
- self._check_not_opaque(fldtype,
- "field '%s.%s'" % (tp.name, fldname))
- # cname is None for _add_missing_struct_unions() only
- op = OP_NOOP
- if fbitsize >= 0:
- op = OP_BITFIELD
- size = '%d /* bits */' % fbitsize
- elif cname is None or (
- isinstance(fldtype, model.ArrayType) and
- fldtype.length is None):
- size = '(size_t)-1'
- else:
- size = 'sizeof(((%s)0)->%s)' % (
- tp.get_c_name('*') if named_ptr is None
- else named_ptr.name,
- fldname)
- if cname is None or fbitsize >= 0:
- offset = '(size_t)-1'
- elif named_ptr is not None:
- offset = '((char *)&((%s)0)->%s) - (char *)0' % (
- named_ptr.name, fldname)
- else:
- offset = 'offsetof(%s, %s)' % (tp.get_c_name(''), fldname)
- c_fields.append(
- FieldExpr(fldname, offset, size, fbitsize,
- CffiOp(op, self._typesdict[fldtype])))
- first_field_index = len(self._lsts["field"])
- self._lsts["field"].extend(c_fields)
- #
- if cname is None: # unknown name, for _add_missing_struct_unions
- size = '(size_t)-2'
- align = -2
- comment = "unnamed"
- else:
- if named_ptr is not None:
- size = 'sizeof(*(%s)0)' % (named_ptr.name,)
- align = '-1 /* unknown alignment */'
- else:
- size = 'sizeof(%s)' % (cname,)
- align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,)
- comment = None
- else:
- size = '(size_t)-1'
- align = -1
- first_field_index = -1
- comment = reason_for_not_expanding
- self._lsts["struct_union"].append(
- StructUnionExpr(tp.name, type_index, flags, size, align, comment,
- first_field_index, c_fields))
- self._seen_struct_unions.add(tp)
-
- def _check_not_opaque(self, tp, location):
- while isinstance(tp, model.ArrayType):
- tp = tp.item
- if isinstance(tp, model.StructOrUnion) and tp.fldtypes is None:
- raise TypeError(
- "%s is of an opaque type (not declared in cdef())" % location)
-
- def _add_missing_struct_unions(self):
- # not very nice, but some struct declarations might be missing
- # because they don't have any known C name. Check that they are
- # not partial (we can't complete or verify them!) and emit them
- # anonymously.
- lst = list(self._struct_unions.items())
- lst.sort(key=lambda tp_order: tp_order[1])
- for tp, order in lst:
- if tp not in self._seen_struct_unions:
- if tp.partial:
- raise NotImplementedError("internal inconsistency: %r is "
- "partial but was not seen at "
- "this point" % (tp,))
- if tp.name.startswith('$') and tp.name[1:].isdigit():
- approxname = tp.name[1:]
- elif tp.name == '_IO_FILE' and tp.forcename == 'FILE':
- approxname = 'FILE'
- self._typedef_ctx(tp, 'FILE')
- else:
- raise NotImplementedError("internal inconsistency: %r" %
- (tp,))
- self._struct_ctx(tp, None, approxname)
-
- def _generate_cpy_struct_collecttype(self, tp, name):
- self._struct_collecttype(tp)
- _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype
-
- def _struct_names(self, tp):
- cname = tp.get_c_name('')
- if ' ' in cname:
- return cname, cname.replace(' ', '_')
- else:
- return cname, '_' + cname
-
- def _generate_cpy_struct_decl(self, tp, name):
- self._struct_decl(tp, *self._struct_names(tp))
- _generate_cpy_union_decl = _generate_cpy_struct_decl
-
- def _generate_cpy_struct_ctx(self, tp, name):
- self._struct_ctx(tp, *self._struct_names(tp))
- _generate_cpy_union_ctx = _generate_cpy_struct_ctx
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- def _generate_cpy_anonymous_collecttype(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_collecttype(tp, name)
- else:
- self._struct_collecttype(tp)
-
- def _generate_cpy_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_decl(tp)
- else:
- self._struct_decl(tp, name, 'typedef_' + name)
-
- def _generate_cpy_anonymous_ctx(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._enum_ctx(tp, name)
- else:
- self._struct_ctx(tp, name, 'typedef_' + name)
-
- # ----------
- # constants, declared with "static const ..."
-
- def _generate_cpy_const(self, is_int, name, tp=None, category='const',
- check_value=None):
- if (category, name) in self._seen_constants:
- raise VerificationError(
- "duplicate declaration of %s '%s'" % (category, name))
- self._seen_constants.add((category, name))
- #
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- if is_int:
- prnt('static int %s(unsigned long long *o)' % funcname)
- prnt('{')
- prnt(' int n = (%s) <= 0;' % (name,))
- prnt(' *o = (unsigned long long)((%s) | 0);'
- ' /* check that %s is an integer */' % (name, name))
- if check_value is not None:
- if check_value > 0:
- check_value = '%dU' % (check_value,)
- prnt(' if (!_cffi_check_int(*o, n, %s))' % (check_value,))
- prnt(' n |= 2;')
- prnt(' return n;')
- prnt('}')
- else:
- assert check_value is None
- prnt('static void %s(char *o)' % funcname)
- prnt('{')
- prnt(' *(%s)o = %s;' % (tp.get_c_name('*'), name))
- prnt('}')
- prnt()
-
- def _generate_cpy_constant_collecttype(self, tp, name):
- is_int = tp.is_integer_type()
- if not is_int or self.target_is_python:
- self._do_collect_type(tp)
-
- def _generate_cpy_constant_decl(self, tp, name):
- is_int = tp.is_integer_type()
- self._generate_cpy_const(is_int, name, tp)
-
- def _generate_cpy_constant_ctx(self, tp, name):
- if not self.target_is_python and tp.is_integer_type():
- type_op = CffiOp(OP_CONSTANT_INT, -1)
- else:
- if self.target_is_python:
- const_kind = OP_DLOPEN_CONST
- else:
- const_kind = OP_CONSTANT
- type_index = self._typesdict[tp]
- type_op = CffiOp(const_kind, type_index)
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_const_%s' % name, type_op))
-
- # ----------
- # enums
-
- def _generate_cpy_enum_collecttype(self, tp, name):
- self._do_collect_type(tp)
-
- def _generate_cpy_enum_decl(self, tp, name=None):
- for enumerator in tp.enumerators:
- self._generate_cpy_const(True, enumerator)
-
- def _enum_ctx(self, tp, cname):
- type_index = self._typesdict[tp]
- type_op = CffiOp(OP_ENUM, -1)
- if self.target_is_python:
- tp.check_not_partial()
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._lsts["global"].append(
- GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op,
- check_value=enumvalue))
- #
- if cname is not None and '$' not in cname and not self.target_is_python:
- size = "sizeof(%s)" % cname
- signed = "((%s)-1) <= 0" % cname
- else:
- basetp = tp.build_baseinttype(self.ffi, [])
- size = self.ffi.sizeof(basetp)
- signed = int(int(self.ffi.cast(basetp, -1)) < 0)
- allenums = ",".join(tp.enumerators)
- self._lsts["enum"].append(
- EnumExpr(tp.name, type_index, size, signed, allenums))
-
- def _generate_cpy_enum_ctx(self, tp, name):
- self._enum_ctx(tp, tp._get_c_name())
-
- # ----------
- # macros: for now only for integers
-
- def _generate_cpy_macro_collecttype(self, tp, name):
- pass
-
- def _generate_cpy_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_cpy_const(True, name, check_value=check_value)
-
- def _generate_cpy_macro_ctx(self, tp, name):
- if tp == '...':
- if self.target_is_python:
- raise VerificationError(
- "cannot use the syntax '...' in '#define %s ...' when "
- "using the ABI mode" % (name,))
- check_value = None
- else:
- check_value = tp # an integer
- type_op = CffiOp(OP_CONSTANT_INT, -1)
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_const_%s' % name, type_op,
- check_value=check_value))
-
- # ----------
- # global variables
-
- def _global_type(self, tp, global_name):
- if isinstance(tp, model.ArrayType):
- actual_length = tp.length
- if actual_length == '...':
- actual_length = '_cffi_array_len(%s)' % (global_name,)
- tp_item = self._global_type(tp.item, '%s[0]' % global_name)
- tp = model.ArrayType(tp_item, actual_length)
- return tp
-
- def _generate_cpy_variable_collecttype(self, tp, name):
- self._do_collect_type(self._global_type(tp, name))
-
- def _generate_cpy_variable_decl(self, tp, name):
- prnt = self._prnt
- tp = self._global_type(tp, name)
- if isinstance(tp, model.ArrayType) and tp.length is None:
- tp = tp.item
- ampersand = ''
- else:
- ampersand = '&'
- # This code assumes that casts from "tp *" to "void *" is a
- # no-op, i.e. a function that returns a "tp *" can be called
- # as if it returned a "void *". This should be generally true
- # on any modern machine. The only exception to that rule (on
- # uncommon architectures, and as far as I can tell) might be
- # if 'tp' were a function type, but that is not possible here.
- # (If 'tp' is a function _pointer_ type, then casts from "fn_t
- # **" to "void *" are again no-ops, as far as I can tell.)
- decl = '*_cffi_var_%s(void)' % (name,)
- prnt('static ' + tp.get_c_name(decl, quals=self._current_quals))
- prnt('{')
- prnt(' return %s(%s);' % (ampersand, name))
- prnt('}')
- prnt()
-
- def _generate_cpy_variable_ctx(self, tp, name):
- tp = self._global_type(tp, name)
- type_index = self._typesdict[tp]
- if self.target_is_python:
- op = OP_GLOBAL_VAR
- else:
- op = OP_GLOBAL_VAR_F
- self._lsts["global"].append(
- GlobalExpr(name, '_cffi_var_%s' % name, CffiOp(op, type_index)))
-
- # ----------
- # extern "Python"
-
- def _generate_cpy_extern_python_collecttype(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- self._do_collect_type(tp)
- _generate_cpy_dllexport_python_collecttype = \
- _generate_cpy_extern_python_plus_c_collecttype = \
- _generate_cpy_extern_python_collecttype
-
- def _extern_python_decl(self, tp, name, tag_and_space):
- prnt = self._prnt
- if isinstance(tp.result, model.VoidType):
- size_of_result = '0'
- else:
- context = 'result of %s' % name
- size_of_result = '(int)sizeof(%s)' % (
- tp.result.get_c_name('', context),)
- prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name)
- prnt(' { "%s.%s", %s, 0, 0 };' % (
- self.module_name, name, size_of_result))
- prnt()
- #
- arguments = []
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- arg = type.get_c_name(' a%d' % i, context)
- arguments.append(arg)
- #
- repr_arguments = ', '.join(arguments)
- repr_arguments = repr_arguments or 'void'
- name_and_arguments = '%s(%s)' % (name, repr_arguments)
- if tp.abi == "__stdcall":
- name_and_arguments = '_cffi_stdcall ' + name_and_arguments
- #
- def may_need_128_bits(tp):
- return (isinstance(tp, model.PrimitiveType) and
- tp.name == 'long double')
- #
- size_of_a = max(len(tp.args)*8, 8)
- if may_need_128_bits(tp.result):
- size_of_a = max(size_of_a, 16)
- if isinstance(tp.result, model.StructOrUnion):
- size_of_a = 'sizeof(%s) > %d ? sizeof(%s) : %d' % (
- tp.result.get_c_name(''), size_of_a,
- tp.result.get_c_name(''), size_of_a)
- prnt('%s%s' % (tag_and_space, tp.result.get_c_name(name_and_arguments)))
- prnt('{')
- prnt(' char a[%s];' % size_of_a)
- prnt(' char *p = a;')
- for i, type in enumerate(tp.args):
- arg = 'a%d' % i
- if (isinstance(type, model.StructOrUnion) or
- may_need_128_bits(type)):
- arg = '&' + arg
- type = model.PointerType(type)
- prnt(' *(%s)(p + %d) = %s;' % (type.get_c_name('*'), i*8, arg))
- prnt(' _cffi_call_python(&_cffi_externpy__%s, p);' % name)
- if not isinstance(tp.result, model.VoidType):
- prnt(' return *(%s)p;' % (tp.result.get_c_name('*'),))
- prnt('}')
- prnt()
- self._num_externpy += 1
-
- def _generate_cpy_extern_python_decl(self, tp, name):
- self._extern_python_decl(tp, name, 'static ')
-
- def _generate_cpy_dllexport_python_decl(self, tp, name):
- self._extern_python_decl(tp, name, 'CFFI_DLLEXPORT ')
-
- def _generate_cpy_extern_python_plus_c_decl(self, tp, name):
- self._extern_python_decl(tp, name, '')
-
- def _generate_cpy_extern_python_ctx(self, tp, name):
- if self.target_is_python:
- raise VerificationError(
- "cannot use 'extern \"Python\"' in the ABI mode")
- if tp.ellipsis:
- raise NotImplementedError("a vararg function is extern \"Python\"")
- type_index = self._typesdict[tp]
- type_op = CffiOp(OP_EXTERN_PYTHON, type_index)
- self._lsts["global"].append(
- GlobalExpr(name, '&_cffi_externpy__%s' % name, type_op, name))
-
- _generate_cpy_dllexport_python_ctx = \
- _generate_cpy_extern_python_plus_c_ctx = \
- _generate_cpy_extern_python_ctx
-
- def _print_string_literal_in_array(self, s):
- prnt = self._prnt
- prnt('// # NB. this is not a string because of a size limit in MSVC')
- if not isinstance(s, bytes): # unicode
- s = s.encode('utf-8') # -> bytes
- else:
- s.decode('utf-8') # got bytes, check for valid utf-8
- try:
- s.decode('ascii')
- except UnicodeDecodeError:
- s = b'# -*- encoding: utf8 -*-\n' + s
- for line in s.splitlines(True):
- comment = line
- if type('//') is bytes: # python2
- line = map(ord, line) # make a list of integers
- else: # python3
- # type(line) is bytes, which enumerates like a list of integers
- comment = ascii(comment)[1:-1]
- prnt(('// ' + comment).rstrip())
- printed_line = ''
- for c in line:
- if len(printed_line) >= 76:
- prnt(printed_line)
- printed_line = ''
- printed_line += '%d,' % (c,)
- prnt(printed_line)
-
- # ----------
- # emitting the opcodes for individual types
-
- def _emit_bytecode_VoidType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, PRIM_VOID)
-
- def _emit_bytecode_PrimitiveType(self, tp, index):
- prim_index = PRIMITIVE_TO_INDEX[tp.name]
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, prim_index)
-
- def _emit_bytecode_UnknownIntegerType(self, tp, index):
- s = ('_cffi_prim_int(sizeof(%s), (\n'
- ' ((%s)-1) | 0 /* check that %s is an integer type */\n'
- ' ) <= 0)' % (tp.name, tp.name, tp.name))
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s)
-
- def _emit_bytecode_UnknownFloatType(self, tp, index):
- s = ('_cffi_prim_float(sizeof(%s) *\n'
- ' (((%s)1) / 2) * 2 /* integer => 0, float => 1 */\n'
- ' )' % (tp.name, tp.name))
- self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s)
-
- def _emit_bytecode_RawFunctionType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_FUNCTION, self._typesdict[tp.result])
- index += 1
- for tp1 in tp.args:
- realindex = self._typesdict[tp1]
- if index != realindex:
- if isinstance(tp1, model.PrimitiveType):
- self._emit_bytecode_PrimitiveType(tp1, index)
- else:
- self.cffi_types[index] = CffiOp(OP_NOOP, realindex)
- index += 1
- flags = int(tp.ellipsis)
- if tp.abi is not None:
- if tp.abi == '__stdcall':
- flags |= 2
- else:
- raise NotImplementedError("abi=%r" % (tp.abi,))
- self.cffi_types[index] = CffiOp(OP_FUNCTION_END, flags)
-
- def _emit_bytecode_PointerType(self, tp, index):
- self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[tp.totype])
-
- _emit_bytecode_ConstPointerType = _emit_bytecode_PointerType
- _emit_bytecode_NamedPointerType = _emit_bytecode_PointerType
-
- def _emit_bytecode_FunctionPtrType(self, tp, index):
- raw = tp.as_raw_function()
- self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[raw])
-
- def _emit_bytecode_ArrayType(self, tp, index):
- item_index = self._typesdict[tp.item]
- if tp.length is None:
- self.cffi_types[index] = CffiOp(OP_OPEN_ARRAY, item_index)
- elif tp.length == '...':
- raise VerificationError(
- "type %s badly placed: the '...' array length can only be "
- "used on global arrays or on fields of structures" % (
- str(tp).replace('/*...*/', '...'),))
- else:
- assert self.cffi_types[index + 1] == 'LEN'
- self.cffi_types[index] = CffiOp(OP_ARRAY, item_index)
- self.cffi_types[index + 1] = CffiOp(None, str(tp.length))
-
- def _emit_bytecode_StructType(self, tp, index):
- struct_index = self._struct_unions[tp]
- self.cffi_types[index] = CffiOp(OP_STRUCT_UNION, struct_index)
- _emit_bytecode_UnionType = _emit_bytecode_StructType
-
- def _emit_bytecode_EnumType(self, tp, index):
- enum_index = self._enums[tp]
- self.cffi_types[index] = CffiOp(OP_ENUM, enum_index)
-
-
-if sys.version_info >= (3,):
- NativeIO = io.StringIO
-else:
- class NativeIO(io.BytesIO):
- def write(self, s):
- if isinstance(s, unicode):
- s = s.encode('ascii')
- super(NativeIO, self).write(s)
-
-def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose):
- if verbose:
- print("generating %s" % (target_file,))
- recompiler = Recompiler(ffi, module_name,
- target_is_python=(preamble is None))
- recompiler.collect_type_table()
- recompiler.collect_step_tables()
- f = NativeIO()
- recompiler.write_source_to_f(f, preamble)
- output = f.getvalue()
- try:
- with open(target_file, 'r') as f1:
- if f1.read(len(output) + 1) != output:
- raise IOError
- if verbose:
- print("(already up-to-date)")
- return False # already up-to-date
- except IOError:
- tmp_file = '%s.~%d' % (target_file, os.getpid())
- with open(tmp_file, 'w') as f1:
- f1.write(output)
- try:
- os.rename(tmp_file, target_file)
- except OSError:
- os.unlink(target_file)
- os.rename(tmp_file, target_file)
- return True
-
-def make_c_source(ffi, module_name, preamble, target_c_file, verbose=False):
- assert preamble is not None
- return _make_c_or_py_source(ffi, module_name, preamble, target_c_file,
- verbose)
-
-def make_py_source(ffi, module_name, target_py_file, verbose=False):
- return _make_c_or_py_source(ffi, module_name, None, target_py_file,
- verbose)
-
-def _modname_to_file(outputdir, modname, extension):
- parts = modname.split('.')
- try:
- os.makedirs(os.path.join(outputdir, *parts[:-1]))
- except OSError:
- pass
- parts[-1] += extension
- return os.path.join(outputdir, *parts), parts
-
-
-# Aaargh. Distutils is not tested at all for the purpose of compiling
-# DLLs that are not extension modules. Here are some hacks to work
-# around that, in the _patch_for_*() functions...
-
-def _patch_meth(patchlist, cls, name, new_meth):
- old = getattr(cls, name)
- patchlist.append((cls, name, old))
- setattr(cls, name, new_meth)
- return old
-
-def _unpatch_meths(patchlist):
- for cls, name, old_meth in reversed(patchlist):
- setattr(cls, name, old_meth)
-
-def _patch_for_embedding(patchlist):
- if sys.platform == 'win32':
- # we must not remove the manifest when building for embedding!
- from distutils.msvc9compiler import MSVCCompiler
- _patch_meth(patchlist, MSVCCompiler, '_remove_visual_c_ref',
- lambda self, manifest_file: manifest_file)
-
- if sys.platform == 'darwin':
- # we must not make a '-bundle', but a '-dynamiclib' instead
- from distutils.ccompiler import CCompiler
- def my_link_shared_object(self, *args, **kwds):
- if '-bundle' in self.linker_so:
- self.linker_so = list(self.linker_so)
- i = self.linker_so.index('-bundle')
- self.linker_so[i] = '-dynamiclib'
- return old_link_shared_object(self, *args, **kwds)
- old_link_shared_object = _patch_meth(patchlist, CCompiler,
- 'link_shared_object',
- my_link_shared_object)
-
-def _patch_for_target(patchlist, target):
- from distutils.command.build_ext import build_ext
- # if 'target' is different from '*', we need to patch some internal
- # method to just return this 'target' value, instead of having it
- # built from module_name
- if target.endswith('.*'):
- target = target[:-2]
- if sys.platform == 'win32':
- target += '.dll'
- elif sys.platform == 'darwin':
- target += '.dylib'
- else:
- target += '.so'
- _patch_meth(patchlist, build_ext, 'get_ext_filename',
- lambda self, ext_name: target)
-
-
-def recompile(ffi, module_name, preamble, tmpdir='.', call_c_compiler=True,
- c_file=None, source_extension='.c', extradir=None,
- compiler_verbose=1, target=None, debug=None, **kwds):
- if not isinstance(module_name, str):
- module_name = module_name.encode('ascii')
- if ffi._windows_unicode:
- ffi._apply_windows_unicode(kwds)
- if preamble is not None:
- embedding = (ffi._embedding is not None)
- if embedding:
- ffi._apply_embedding_fix(kwds)
- if c_file is None:
- c_file, parts = _modname_to_file(tmpdir, module_name,
- source_extension)
- if extradir:
- parts = [extradir] + parts
- ext_c_file = os.path.join(*parts)
- else:
- ext_c_file = c_file
- #
- if target is None:
- if embedding:
- target = '%s.*' % module_name
- else:
- target = '*'
- #
- ext = ffiplatform.get_extension(ext_c_file, module_name, **kwds)
- updated = make_c_source(ffi, module_name, preamble, c_file,
- verbose=compiler_verbose)
- if call_c_compiler:
- patchlist = []
- cwd = os.getcwd()
- try:
- if embedding:
- _patch_for_embedding(patchlist)
- if target != '*':
- _patch_for_target(patchlist, target)
- if compiler_verbose:
- if tmpdir == '.':
- msg = 'the current directory is'
- else:
- msg = 'setting the current directory to'
- print('%s %r' % (msg, os.path.abspath(tmpdir)))
- os.chdir(tmpdir)
- outputfilename = ffiplatform.compile('.', ext,
- compiler_verbose, debug)
- finally:
- os.chdir(cwd)
- _unpatch_meths(patchlist)
- return outputfilename
- else:
- return ext, updated
- else:
- if c_file is None:
- c_file, _ = _modname_to_file(tmpdir, module_name, '.py')
- updated = make_py_source(ffi, module_name, c_file,
- verbose=compiler_verbose)
- if call_c_compiler:
- return c_file
- else:
- return None, updated
-
diff --git a/resources/python/bin/3.7/mac/cffi/setuptools_ext.py b/resources/python/bin/3.7/mac/cffi/setuptools_ext.py
deleted file mode 100644
index 8fe361487..000000000
--- a/resources/python/bin/3.7/mac/cffi/setuptools_ext.py
+++ /dev/null
@@ -1,219 +0,0 @@
-import os
-import sys
-
-try:
- basestring
-except NameError:
- # Python 3.x
- basestring = str
-
-def error(msg):
- from distutils.errors import DistutilsSetupError
- raise DistutilsSetupError(msg)
-
-
-def execfile(filename, glob):
- # We use execfile() (here rewritten for Python 3) instead of
- # __import__() to load the build script. The problem with
- # a normal import is that in some packages, the intermediate
- # __init__.py files may already try to import the file that
- # we are generating.
- with open(filename) as f:
- src = f.read()
- src += '\n' # Python 2.6 compatibility
- code = compile(src, filename, 'exec')
- exec(code, glob, glob)
-
-
-def add_cffi_module(dist, mod_spec):
- from cffi.api import FFI
-
- if not isinstance(mod_spec, basestring):
- error("argument to 'cffi_modules=...' must be a str or a list of str,"
- " not %r" % (type(mod_spec).__name__,))
- mod_spec = str(mod_spec)
- try:
- build_file_name, ffi_var_name = mod_spec.split(':')
- except ValueError:
- error("%r must be of the form 'path/build.py:ffi_variable'" %
- (mod_spec,))
- if not os.path.exists(build_file_name):
- ext = ''
- rewritten = build_file_name.replace('.', '/') + '.py'
- if os.path.exists(rewritten):
- ext = ' (rewrite cffi_modules to [%r])' % (
- rewritten + ':' + ffi_var_name,)
- error("%r does not name an existing file%s" % (build_file_name, ext))
-
- mod_vars = {'__name__': '__cffi__', '__file__': build_file_name}
- execfile(build_file_name, mod_vars)
-
- try:
- ffi = mod_vars[ffi_var_name]
- except KeyError:
- error("%r: object %r not found in module" % (mod_spec,
- ffi_var_name))
- if not isinstance(ffi, FFI):
- ffi = ffi() # maybe it's a function instead of directly an ffi
- if not isinstance(ffi, FFI):
- error("%r is not an FFI instance (got %r)" % (mod_spec,
- type(ffi).__name__))
- if not hasattr(ffi, '_assigned_source'):
- error("%r: the set_source() method was not called" % (mod_spec,))
- module_name, source, source_extension, kwds = ffi._assigned_source
- if ffi._windows_unicode:
- kwds = kwds.copy()
- ffi._apply_windows_unicode(kwds)
-
- if source is None:
- _add_py_module(dist, ffi, module_name)
- else:
- _add_c_module(dist, ffi, module_name, source, source_extension, kwds)
-
-def _set_py_limited_api(Extension, kwds):
- """
- Add py_limited_api to kwds if setuptools >= 26 is in use.
- Do not alter the setting if it already exists.
- Setuptools takes care of ignoring the flag on Python 2 and PyPy.
-
- CPython itself should ignore the flag in a debugging version
- (by not listing .abi3.so in the extensions it supports), but
- it doesn't so far, creating troubles. That's why we check
- for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent
- of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401)
-
- On Windows, with CPython <= 3.4, it's better not to use py_limited_api
- because virtualenv *still* doesn't copy PYTHON3.DLL on these versions.
- Recently (2020) we started shipping only >= 3.5 wheels, though. So
- we'll give it another try and set py_limited_api on Windows >= 3.5.
- """
- from cffi import recompiler
-
- if ('py_limited_api' not in kwds and not hasattr(sys, 'gettotalrefcount')
- and recompiler.USE_LIMITED_API):
- import setuptools
- try:
- setuptools_major_version = int(setuptools.__version__.partition('.')[0])
- if setuptools_major_version >= 26:
- kwds['py_limited_api'] = True
- except ValueError: # certain development versions of setuptools
- # If we don't know the version number of setuptools, we
- # try to set 'py_limited_api' anyway. At worst, we get a
- # warning.
- kwds['py_limited_api'] = True
- return kwds
-
-def _add_c_module(dist, ffi, module_name, source, source_extension, kwds):
- from distutils.core import Extension
- # We are a setuptools extension. Need this build_ext for py_limited_api.
- from setuptools.command.build_ext import build_ext
- from distutils.dir_util import mkpath
- from distutils import log
- from cffi import recompiler
-
- allsources = ['$PLACEHOLDER']
- allsources.extend(kwds.pop('sources', []))
- kwds = _set_py_limited_api(Extension, kwds)
- ext = Extension(name=module_name, sources=allsources, **kwds)
-
- def make_mod(tmpdir, pre_run=None):
- c_file = os.path.join(tmpdir, module_name + source_extension)
- log.info("generating cffi module %r" % c_file)
- mkpath(tmpdir)
- # a setuptools-only, API-only hook: called with the "ext" and "ffi"
- # arguments just before we turn the ffi into C code. To use it,
- # subclass the 'distutils.command.build_ext.build_ext' class and
- # add a method 'def pre_run(self, ext, ffi)'.
- if pre_run is not None:
- pre_run(ext, ffi)
- updated = recompiler.make_c_source(ffi, module_name, source, c_file)
- if not updated:
- log.info("already up-to-date")
- return c_file
-
- if dist.ext_modules is None:
- dist.ext_modules = []
- dist.ext_modules.append(ext)
-
- base_class = dist.cmdclass.get('build_ext', build_ext)
- class build_ext_make_mod(base_class):
- def run(self):
- if ext.sources[0] == '$PLACEHOLDER':
- pre_run = getattr(self, 'pre_run', None)
- ext.sources[0] = make_mod(self.build_temp, pre_run)
- base_class.run(self)
- dist.cmdclass['build_ext'] = build_ext_make_mod
- # NB. multiple runs here will create multiple 'build_ext_make_mod'
- # classes. Even in this case the 'build_ext' command should be
- # run once; but just in case, the logic above does nothing if
- # called again.
-
-
-def _add_py_module(dist, ffi, module_name):
- from distutils.dir_util import mkpath
- from setuptools.command.build_py import build_py
- from setuptools.command.build_ext import build_ext
- from distutils import log
- from cffi import recompiler
-
- def generate_mod(py_file):
- log.info("generating cffi module %r" % py_file)
- mkpath(os.path.dirname(py_file))
- updated = recompiler.make_py_source(ffi, module_name, py_file)
- if not updated:
- log.info("already up-to-date")
-
- base_class = dist.cmdclass.get('build_py', build_py)
- class build_py_make_mod(base_class):
- def run(self):
- base_class.run(self)
- module_path = module_name.split('.')
- module_path[-1] += '.py'
- generate_mod(os.path.join(self.build_lib, *module_path))
- def get_source_files(self):
- # This is called from 'setup.py sdist' only. Exclude
- # the generate .py module in this case.
- saved_py_modules = self.py_modules
- try:
- if saved_py_modules:
- self.py_modules = [m for m in saved_py_modules
- if m != module_name]
- return base_class.get_source_files(self)
- finally:
- self.py_modules = saved_py_modules
- dist.cmdclass['build_py'] = build_py_make_mod
-
- # distutils and setuptools have no notion I could find of a
- # generated python module. If we don't add module_name to
- # dist.py_modules, then things mostly work but there are some
- # combination of options (--root and --record) that will miss
- # the module. So we add it here, which gives a few apparently
- # harmless warnings about not finding the file outside the
- # build directory.
- # Then we need to hack more in get_source_files(); see above.
- if dist.py_modules is None:
- dist.py_modules = []
- dist.py_modules.append(module_name)
-
- # the following is only for "build_ext -i"
- base_class_2 = dist.cmdclass.get('build_ext', build_ext)
- class build_ext_make_mod(base_class_2):
- def run(self):
- base_class_2.run(self)
- if self.inplace:
- # from get_ext_fullpath() in distutils/command/build_ext.py
- module_path = module_name.split('.')
- package = '.'.join(module_path[:-1])
- build_py = self.get_finalized_command('build_py')
- package_dir = build_py.get_package_dir(package)
- file_name = module_path[-1] + '.py'
- generate_mod(os.path.join(package_dir, file_name))
- dist.cmdclass['build_ext'] = build_ext_make_mod
-
-def cffi_modules(dist, attr, value):
- assert attr == 'cffi_modules'
- if isinstance(value, basestring):
- value = [value]
-
- for cffi_module in value:
- add_cffi_module(dist, cffi_module)
diff --git a/resources/python/bin/3.7/mac/cffi/vengine_cpy.py b/resources/python/bin/3.7/mac/cffi/vengine_cpy.py
deleted file mode 100644
index 6de0df0ea..000000000
--- a/resources/python/bin/3.7/mac/cffi/vengine_cpy.py
+++ /dev/null
@@ -1,1076 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, imp
-from . import model
-from .error import VerificationError
-
-
-class VCPythonEngine(object):
- _class_key = 'x'
- _gen_python_module = True
-
- def __init__(self, verifier):
- self.verifier = verifier
- self.ffi = verifier.ffi
- self._struct_pending_verification = {}
- self._types_of_builtin_functions = {}
-
- def patch_extension_kwds(self, kwds):
- pass
-
- def find_module(self, module_name, path, so_suffixes):
- try:
- f, filename, descr = imp.find_module(module_name, path)
- except ImportError:
- return None
- if f is not None:
- f.close()
- # Note that after a setuptools installation, there are both .py
- # and .so files with the same basename. The code here relies on
- # imp.find_module() locating the .so in priority.
- if descr[0] not in so_suffixes:
- return None
- return filename
-
- def collect_types(self):
- self._typesdict = {}
- self._generate("collecttype")
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def _gettypenum(self, type):
- # a KeyError here is a bug. please report it! :-)
- return self._typesdict[type]
-
- def _do_collect_type(self, tp):
- if ((not isinstance(tp, model.PrimitiveType)
- or tp.name == 'long double')
- and tp not in self._typesdict):
- num = len(self._typesdict)
- self._typesdict[tp] = num
-
- def write_source_to_f(self):
- self.collect_types()
- #
- # The new module will have a _cffi_setup() function that receives
- # objects from the ffi world, and that calls some setup code in
- # the module. This setup code is split in several independent
- # functions, e.g. one per constant. The functions are "chained"
- # by ending in a tail call to each other.
- #
- # This is further split in two chained lists, depending on if we
- # can do it at import-time or if we must wait for _cffi_setup() to
- # provide us with the objects. This is needed because we
- # need the values of the enum constants in order to build the
- # that we may have to pass to _cffi_setup().
- #
- # The following two 'chained_list_constants' items contains
- # the head of these two chained lists, as a string that gives the
- # call to do, if any.
- self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)']
- #
- prnt = self._prnt
- # first paste some standard set of lines that are mostly '#define'
- prnt(cffimod_header)
- prnt()
- # then paste the C source given by the user, verbatim.
- prnt(self.verifier.preamble)
- prnt()
- #
- # call generate_cpy_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._generate("decl")
- #
- # implement the function _cffi_setup_custom() as calling the
- # head of the chained list.
- self._generate_setup_custom()
- prnt()
- #
- # produce the method table, including the entries for the
- # generated Python->C function wrappers, which are done
- # by generate_cpy_function_method().
- prnt('static PyMethodDef _cffi_methods[] = {')
- self._generate("method")
- prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},')
- prnt(' {NULL, NULL, 0, NULL} /* Sentinel */')
- prnt('};')
- prnt()
- #
- # standard init.
- modname = self.verifier.get_module_name()
- constants = self._chained_list_constants[False]
- prnt('#if PY_MAJOR_VERSION >= 3')
- prnt()
- prnt('static struct PyModuleDef _cffi_module_def = {')
- prnt(' PyModuleDef_HEAD_INIT,')
- prnt(' "%s",' % modname)
- prnt(' NULL,')
- prnt(' -1,')
- prnt(' _cffi_methods,')
- prnt(' NULL, NULL, NULL, NULL')
- prnt('};')
- prnt()
- prnt('PyMODINIT_FUNC')
- prnt('PyInit_%s(void)' % modname)
- prnt('{')
- prnt(' PyObject *lib;')
- prnt(' lib = PyModule_Create(&_cffi_module_def);')
- prnt(' if (lib == NULL)')
- prnt(' return NULL;')
- prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,))
- prnt(' Py_DECREF(lib);')
- prnt(' return NULL;')
- prnt(' }')
- prnt(' return lib;')
- prnt('}')
- prnt()
- prnt('#else')
- prnt()
- prnt('PyMODINIT_FUNC')
- prnt('init%s(void)' % modname)
- prnt('{')
- prnt(' PyObject *lib;')
- prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname)
- prnt(' if (lib == NULL)')
- prnt(' return;')
- prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,))
- prnt(' return;')
- prnt(' return;')
- prnt('}')
- prnt()
- prnt('#endif')
-
- def load_library(self, flags=None):
- # XXX review all usages of 'self' here!
- # import it as a new extension module
- imp.acquire_lock()
- try:
- if hasattr(sys, "getdlopenflags"):
- previous_flags = sys.getdlopenflags()
- try:
- if hasattr(sys, "setdlopenflags") and flags is not None:
- sys.setdlopenflags(flags)
- module = imp.load_dynamic(self.verifier.get_module_name(),
- self.verifier.modulefilename)
- except ImportError as e:
- error = "importing %r: %s" % (self.verifier.modulefilename, e)
- raise VerificationError(error)
- finally:
- if hasattr(sys, "setdlopenflags"):
- sys.setdlopenflags(previous_flags)
- finally:
- imp.release_lock()
- #
- # call loading_cpy_struct() to get the struct layout inferred by
- # the C compiler
- self._load(module, 'loading')
- #
- # the C code will need the objects. Collect them in
- # order in a list.
- revmapping = dict([(value, key)
- for (key, value) in self._typesdict.items()])
- lst = [revmapping[i] for i in range(len(revmapping))]
- lst = list(map(self.ffi._get_cached_btype, lst))
- #
- # build the FFILibrary class and instance and call _cffi_setup().
- # this will set up some fields like '_cffi_types', and only then
- # it will invoke the chained list of functions that will really
- # build (notably) the constant objects, as if they are
- # pointers, and store them as attributes on the 'library' object.
- class FFILibrary(object):
- _cffi_python_module = module
- _cffi_ffi = self.ffi
- _cffi_dir = []
- def __dir__(self):
- return FFILibrary._cffi_dir + list(self.__dict__)
- library = FFILibrary()
- if module._cffi_setup(lst, VerificationError, library):
- import warnings
- warnings.warn("reimporting %r might overwrite older definitions"
- % (self.verifier.get_module_name()))
- #
- # finally, call the loaded_cpy_xxx() functions. This will perform
- # the final adjustments, like copying the Python->C wrapper
- # functions from the module to the 'library' object, and setting
- # up the FFILibrary class with properties for the global C variables.
- self._load(module, 'loaded', library=library)
- module._cffi_original_ffi = self.ffi
- module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions
- return library
-
- def _get_declarations(self):
- lst = [(key, tp) for (key, (tp, qual)) in
- self.ffi._parser._declarations.items()]
- lst.sort()
- return lst
-
- def _generate(self, step_name):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_cpy_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in verify(): %r" % name)
- try:
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _load(self, module, step_name, **kwds):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- method = getattr(self, '_%s_cpy_%s' % (step_name, kind))
- try:
- method(tp, realname, module, **kwds)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _generate_nothing(self, tp, name):
- pass
-
- def _loaded_noop(self, tp, name, module, **kwds):
- pass
-
- # ----------
-
- def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode):
- extraarg = ''
- if isinstance(tp, model.PrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- converter = '_cffi_to_c_int'
- extraarg = ', %s' % tp.name
- else:
- converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''),
- tp.name.replace(' ', '_'))
- errvalue = '-1'
- #
- elif isinstance(tp, model.PointerType):
- self._convert_funcarg_to_c_ptr_or_array(tp, fromvar,
- tovar, errcode)
- return
- #
- elif isinstance(tp, (model.StructOrUnion, model.EnumType)):
- # a struct (not a struct pointer) as a function argument
- self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)'
- % (tovar, self._gettypenum(tp), fromvar))
- self._prnt(' %s;' % errcode)
- return
- #
- elif isinstance(tp, model.FunctionPtrType):
- converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('')
- extraarg = ', _cffi_type(%d)' % self._gettypenum(tp)
- errvalue = 'NULL'
- #
- else:
- raise NotImplementedError(tp)
- #
- self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg))
- self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % (
- tovar, tp.get_c_name(''), errvalue))
- self._prnt(' %s;' % errcode)
-
- def _extra_local_variables(self, tp, localvars, freelines):
- if isinstance(tp, model.PointerType):
- localvars.add('Py_ssize_t datasize')
- localvars.add('struct _cffi_freeme_s *large_args_free = NULL')
- freelines.add('if (large_args_free != NULL)'
- ' _cffi_free_array_arguments(large_args_free);')
-
- def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode):
- self._prnt(' datasize = _cffi_prepare_pointer_call_argument(')
- self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % (
- self._gettypenum(tp), fromvar, tovar))
- self._prnt(' if (datasize != 0) {')
- self._prnt(' %s = ((size_t)datasize) <= 640 ? '
- 'alloca((size_t)datasize) : NULL;' % (tovar,))
- self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, '
- '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar))
- self._prnt(' datasize, &large_args_free) < 0)')
- self._prnt(' %s;' % errcode)
- self._prnt(' }')
-
- def _convert_expr_from_c(self, tp, var, context):
- if isinstance(tp, model.PrimitiveType):
- if tp.is_integer_type() and tp.name != '_Bool':
- return '_cffi_from_c_int(%s, %s)' % (var, tp.name)
- elif tp.name != 'long double':
- return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var)
- else:
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.ArrayType):
- return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % (
- var, self._gettypenum(model.PointerType(tp.item)))
- elif isinstance(tp, model.StructOrUnion):
- if tp.fldnames is None:
- raise TypeError("'%s' is used as %s, but is opaque" % (
- tp._get_c_name(), context))
- return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- elif isinstance(tp, model.EnumType):
- return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % (
- var, self._gettypenum(tp))
- else:
- raise NotImplementedError(tp)
-
- # ----------
- # typedefs: generates no code so far
-
- _generate_cpy_typedef_collecttype = _generate_nothing
- _generate_cpy_typedef_decl = _generate_nothing
- _generate_cpy_typedef_method = _generate_nothing
- _loading_cpy_typedef = _loaded_noop
- _loaded_cpy_typedef = _loaded_noop
-
- # ----------
- # function declarations
-
- def _generate_cpy_function_collecttype(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- self._do_collect_type(tp)
- else:
- # don't call _do_collect_type(tp) in this common case,
- # otherwise test_autofilled_struct_as_argument fails
- for type in tp.args:
- self._do_collect_type(type)
- self._do_collect_type(tp.result)
-
- def _generate_cpy_function_decl(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no CPython wrapper)
- self._generate_cpy_const(False, name, tp)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- if numargs == 0:
- argname = 'noarg'
- elif numargs == 1:
- argname = 'arg0'
- else:
- argname = 'args'
- prnt('static PyObject *')
- prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname))
- prnt('{')
- #
- context = 'argument of %s' % name
- for i, type in enumerate(tp.args):
- prnt(' %s;' % type.get_c_name(' x%d' % i, context))
- #
- localvars = set()
- freelines = set()
- for type in tp.args:
- self._extra_local_variables(type, localvars, freelines)
- for decl in sorted(localvars):
- prnt(' %s;' % (decl,))
- #
- if not isinstance(tp.result, model.VoidType):
- result_code = 'result = '
- context = 'result of %s' % name
- prnt(' %s;' % tp.result.get_c_name(' result', context))
- prnt(' PyObject *pyresult;')
- else:
- result_code = ''
- #
- if len(tp.args) > 1:
- rng = range(len(tp.args))
- for i in rng:
- prnt(' PyObject *arg%d;' % i)
- prnt()
- prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % (
- 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng])))
- prnt(' return NULL;')
- prnt()
- #
- for i, type in enumerate(tp.args):
- self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i,
- 'return NULL')
- prnt()
- #
- prnt(' Py_BEGIN_ALLOW_THREADS')
- prnt(' _cffi_restore_errno();')
- prnt(' { %s%s(%s); }' % (
- result_code, name,
- ', '.join(['x%d' % i for i in range(len(tp.args))])))
- prnt(' _cffi_save_errno();')
- prnt(' Py_END_ALLOW_THREADS')
- prnt()
- #
- prnt(' (void)self; /* unused */')
- if numargs == 0:
- prnt(' (void)noarg; /* unused */')
- if result_code:
- prnt(' pyresult = %s;' %
- self._convert_expr_from_c(tp.result, 'result', 'result type'))
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' return pyresult;')
- else:
- for freeline in freelines:
- prnt(' ' + freeline)
- prnt(' Py_INCREF(Py_None);')
- prnt(' return Py_None;')
- prnt('}')
- prnt()
-
- def _generate_cpy_function_method(self, tp, name):
- if tp.ellipsis:
- return
- numargs = len(tp.args)
- if numargs == 0:
- meth = 'METH_NOARGS'
- elif numargs == 1:
- meth = 'METH_O'
- else:
- meth = 'METH_VARARGS'
- self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth))
-
- _loading_cpy_function = _loaded_noop
-
- def _loaded_cpy_function(self, tp, name, module, library):
- if tp.ellipsis:
- return
- func = getattr(module, name)
- setattr(library, name, func)
- self._types_of_builtin_functions[func] = tp
-
- # ----------
- # named structs
-
- _generate_cpy_struct_collecttype = _generate_nothing
- def _generate_cpy_struct_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'struct', name)
- def _generate_cpy_struct_method(self, tp, name):
- self._generate_struct_or_union_method(tp, 'struct', name)
- def _loading_cpy_struct(self, tp, name, module):
- self._loading_struct_or_union(tp, 'struct', name, module)
- def _loaded_cpy_struct(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- _generate_cpy_union_collecttype = _generate_nothing
- def _generate_cpy_union_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'union', name)
- def _generate_cpy_union_method(self, tp, name):
- self._generate_struct_or_union_method(tp, 'union', name)
- def _loading_cpy_union(self, tp, name, module):
- self._loading_struct_or_union(tp, 'union', name, module)
- def _loaded_cpy_union(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_struct_or_union_decl(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- checkfuncname = '_cffi_check_%s_%s' % (prefix, name)
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- cname = ('%s %s' % (prefix, name)).strip()
- #
- prnt = self._prnt
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if (isinstance(ftype, model.PrimitiveType)
- and ftype.is_integer_type()) or fbitsize >= 0:
- # accept all integers, but complain on float or double
- prnt(' (void)((p->%s) << 1);' % fname)
- else:
- # only accept exactly the type declared.
- try:
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- prnt('static PyObject *')
- prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,))
- prnt('{')
- prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname)
- prnt(' static Py_ssize_t nums[] = {')
- prnt(' sizeof(%s),' % cname)
- prnt(' offsetof(struct _cffi_aligncheck, y),')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- prnt(' offsetof(%s, %s),' % (cname, fname))
- if isinstance(ftype, model.ArrayType) and ftype.length is None:
- prnt(' 0, /* %s */' % ftype._get_c_name())
- else:
- prnt(' sizeof(((%s *)0)->%s),' % (cname, fname))
- prnt(' -1')
- prnt(' };')
- prnt(' (void)self; /* unused */')
- prnt(' (void)noarg; /* unused */')
- prnt(' return _cffi_get_struct_layout(nums);')
- prnt(' /* the next line is not executed, but compiled */')
- prnt(' %s(0);' % (checkfuncname,))
- prnt('}')
- prnt()
-
- def _generate_struct_or_union_method(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname,
- layoutfuncname))
-
- def _loading_struct_or_union(self, tp, prefix, name, module):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- #
- function = getattr(module, layoutfuncname)
- layout = function()
- if isinstance(tp, model.StructOrUnion) and tp.partial:
- # use the function()'s sizes and offsets to guide the
- # layout of the struct
- totalsize = layout[0]
- totalalignment = layout[1]
- fieldofs = layout[2::2]
- fieldsize = layout[3::2]
- tp.force_flatten()
- assert len(fieldofs) == len(fieldsize) == len(tp.fldnames)
- tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment
- else:
- cname = ('%s %s' % (prefix, name)).strip()
- self._struct_pending_verification[tp] = layout, cname
-
- def _loaded_struct_or_union(self, tp):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered
-
- if tp in self._struct_pending_verification:
- # check that the layout sizes and offsets match the real ones
- def check(realvalue, expectedvalue, msg):
- if realvalue != expectedvalue:
- raise VerificationError(
- "%s (we have %d, but C compiler says %d)"
- % (msg, expectedvalue, realvalue))
- ffi = self.ffi
- BStruct = ffi._get_cached_btype(tp)
- layout, cname = self._struct_pending_verification.pop(tp)
- check(layout[0], ffi.sizeof(BStruct), "wrong total size")
- check(layout[1], ffi.alignof(BStruct), "wrong total alignment")
- i = 2
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- check(layout[i], ffi.offsetof(BStruct, fname),
- "wrong offset for field %r" % (fname,))
- if layout[i+1] != 0:
- BField = ffi._get_cached_btype(ftype)
- check(layout[i+1], ffi.sizeof(BField),
- "wrong size for field %r" % (fname,))
- i += 2
- assert i == len(layout)
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- _generate_cpy_anonymous_collecttype = _generate_nothing
-
- def _generate_cpy_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_cpy_enum_decl(tp, name, '')
- else:
- self._generate_struct_or_union_decl(tp, '', name)
-
- def _generate_cpy_anonymous_method(self, tp, name):
- if not isinstance(tp, model.EnumType):
- self._generate_struct_or_union_method(tp, '', name)
-
- def _loading_cpy_anonymous(self, tp, name, module):
- if isinstance(tp, model.EnumType):
- self._loading_cpy_enum(tp, name, module)
- else:
- self._loading_struct_or_union(tp, '', name, module)
-
- def _loaded_cpy_anonymous(self, tp, name, module, **kwds):
- if isinstance(tp, model.EnumType):
- self._loaded_cpy_enum(tp, name, module, **kwds)
- else:
- self._loaded_struct_or_union(tp)
-
- # ----------
- # constants, likely declared with '#define'
-
- def _generate_cpy_const(self, is_int, name, tp=None, category='const',
- vartp=None, delayed=True, size_too=False,
- check_value=None):
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- prnt('static int %s(PyObject *lib)' % funcname)
- prnt('{')
- prnt(' PyObject *o;')
- prnt(' int res;')
- if not is_int:
- prnt(' %s;' % (vartp or tp).get_c_name(' i', name))
- else:
- assert category == 'const'
- #
- if check_value is not None:
- self._check_int_constant_value(name, check_value)
- #
- if not is_int:
- if category == 'var':
- realexpr = '&' + name
- else:
- realexpr = name
- prnt(' i = (%s);' % (realexpr,))
- prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i',
- 'variable type'),))
- assert delayed
- else:
- prnt(' o = _cffi_from_c_int_const(%s);' % name)
- prnt(' if (o == NULL)')
- prnt(' return -1;')
- if size_too:
- prnt(' {')
- prnt(' PyObject *o1 = o;')
- prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));'
- % (name,))
- prnt(' Py_DECREF(o1);')
- prnt(' if (o == NULL)')
- prnt(' return -1;')
- prnt(' }')
- prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name)
- prnt(' Py_DECREF(o);')
- prnt(' if (res < 0)')
- prnt(' return -1;')
- prnt(' return %s;' % self._chained_list_constants[delayed])
- self._chained_list_constants[delayed] = funcname + '(lib)'
- prnt('}')
- prnt()
-
- def _generate_cpy_constant_collecttype(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- if not is_int:
- self._do_collect_type(tp)
-
- def _generate_cpy_constant_decl(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- self._generate_cpy_const(is_int, name, tp)
-
- _generate_cpy_constant_method = _generate_nothing
- _loading_cpy_constant = _loaded_noop
- _loaded_cpy_constant = _loaded_noop
-
- # ----------
- # enums
-
- def _check_int_constant_value(self, name, value, err_prefix=''):
- prnt = self._prnt
- if value <= 0:
- prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % (
- name, name, value))
- else:
- prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % (
- name, name, value))
- prnt(' char buf[64];')
- prnt(' if ((%s) <= 0)' % name)
- prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name)
- prnt(' else')
- prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' %
- name)
- prnt(' PyErr_Format(_cffi_VerificationError,')
- prnt(' "%s%s has the real value %s, not %s",')
- prnt(' "%s", "%s", buf, "%d");' % (
- err_prefix, name, value))
- prnt(' return -1;')
- prnt(' }')
-
- def _enum_funcname(self, prefix, name):
- # "$enum_$1" => "___D_enum____D_1"
- name = name.replace('$', '___D_')
- return '_cffi_e_%s_%s' % (prefix, name)
-
- def _generate_cpy_enum_decl(self, tp, name, prefix='enum'):
- if tp.partial:
- for enumerator in tp.enumerators:
- self._generate_cpy_const(True, enumerator, delayed=False)
- return
- #
- funcname = self._enum_funcname(prefix, name)
- prnt = self._prnt
- prnt('static int %s(PyObject *lib)' % funcname)
- prnt('{')
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._check_int_constant_value(enumerator, enumvalue,
- "enum %s: " % name)
- prnt(' return %s;' % self._chained_list_constants[True])
- self._chained_list_constants[True] = funcname + '(lib)'
- prnt('}')
- prnt()
-
- _generate_cpy_enum_collecttype = _generate_nothing
- _generate_cpy_enum_method = _generate_nothing
-
- def _loading_cpy_enum(self, tp, name, module):
- if tp.partial:
- enumvalues = [getattr(module, enumerator)
- for enumerator in tp.enumerators]
- tp.enumvalues = tuple(enumvalues)
- tp.partial_resolved = True
-
- def _loaded_cpy_enum(self, tp, name, module, library):
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- setattr(library, enumerator, enumvalue)
-
- # ----------
- # macros: for now only for integers
-
- def _generate_cpy_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_cpy_const(True, name, check_value=check_value)
-
- _generate_cpy_macro_collecttype = _generate_nothing
- _generate_cpy_macro_method = _generate_nothing
- _loading_cpy_macro = _loaded_noop
- _loaded_cpy_macro = _loaded_noop
-
- # ----------
- # global variables
-
- def _generate_cpy_variable_collecttype(self, tp, name):
- if isinstance(tp, model.ArrayType):
- tp_ptr = model.PointerType(tp.item)
- else:
- tp_ptr = model.PointerType(tp)
- self._do_collect_type(tp_ptr)
-
- def _generate_cpy_variable_decl(self, tp, name):
- if isinstance(tp, model.ArrayType):
- tp_ptr = model.PointerType(tp.item)
- self._generate_cpy_const(False, name, tp, vartp=tp_ptr,
- size_too = tp.length_is_unknown())
- else:
- tp_ptr = model.PointerType(tp)
- self._generate_cpy_const(False, name, tp_ptr, category='var')
-
- _generate_cpy_variable_method = _generate_nothing
- _loading_cpy_variable = _loaded_noop
-
- def _loaded_cpy_variable(self, tp, name, module, library):
- value = getattr(library, name)
- if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the
- # sense that "a=..." is forbidden
- if tp.length_is_unknown():
- assert isinstance(value, tuple)
- (value, size) = value
- BItemType = self.ffi._get_cached_btype(tp.item)
- length, rest = divmod(size, self.ffi.sizeof(BItemType))
- if rest != 0:
- raise VerificationError(
- "bad size: %r does not seem to be an array of %s" %
- (name, tp.item))
- tp = tp.resolve_length(length)
- # 'value' is a which we have to replace with
- # a if the N is actually known
- if tp.length is not None:
- BArray = self.ffi._get_cached_btype(tp)
- value = self.ffi.cast(BArray, value)
- setattr(library, name, value)
- return
- # remove ptr= from the library instance, and replace
- # it by a property on the class, which reads/writes into ptr[0].
- ptr = value
- delattr(library, name)
- def getter(library):
- return ptr[0]
- def setter(library, value):
- ptr[0] = value
- setattr(type(library), name, property(getter, setter))
- type(library)._cffi_dir.append(name)
-
- # ----------
-
- def _generate_setup_custom(self):
- prnt = self._prnt
- prnt('static int _cffi_setup_custom(PyObject *lib)')
- prnt('{')
- prnt(' return %s;' % self._chained_list_constants[True])
- prnt('}')
-
-cffimod_header = r'''
-#include
-#include
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-
-#if PY_MAJOR_VERSION < 3
-# undef PyCapsule_CheckExact
-# undef PyCapsule_GetPointer
-# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule))
-# define PyCapsule_GetPointer(capsule, name) \
- (PyCObject_AsVoidPtr(capsule))
-#endif
-
-#if PY_MAJOR_VERSION >= 3
-# define PyInt_FromLong PyLong_FromLong
-#endif
-
-#define _cffi_from_c_double PyFloat_FromDouble
-#define _cffi_from_c_float PyFloat_FromDouble
-#define _cffi_from_c_long PyInt_FromLong
-#define _cffi_from_c_ulong PyLong_FromUnsignedLong
-#define _cffi_from_c_longlong PyLong_FromLongLong
-#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
-#define _cffi_from_c__Bool PyBool_FromLong
-
-#define _cffi_to_c_double PyFloat_AsDouble
-#define _cffi_to_c_float PyFloat_AsDouble
-
-#define _cffi_from_c_int_const(x) \
- (((x) > 0) ? \
- ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \
- PyInt_FromLong((long)(x)) : \
- PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \
- ((long long)(x) >= (long long)LONG_MIN) ? \
- PyInt_FromLong((long)(x)) : \
- PyLong_FromLongLong((long long)(x)))
-
-#define _cffi_from_c_int(x, type) \
- (((type)-1) > 0 ? /* unsigned */ \
- (sizeof(type) < sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- sizeof(type) == sizeof(long) ? \
- PyLong_FromUnsignedLong((unsigned long)x) : \
- PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
- (sizeof(type) <= sizeof(long) ? \
- PyInt_FromLong((long)x) : \
- PyLong_FromLongLong((long long)x)))
-
-#define _cffi_to_c_int(o, type) \
- ((type)( \
- sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
- : (type)_cffi_to_c_i8(o)) : \
- sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
- : (type)_cffi_to_c_i16(o)) : \
- sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
- : (type)_cffi_to_c_i32(o)) : \
- sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
- : (type)_cffi_to_c_i64(o)) : \
- (Py_FatalError("unsupported size for type " #type), (type)0)))
-
-#define _cffi_to_c_i8 \
- ((int(*)(PyObject *))_cffi_exports[1])
-#define _cffi_to_c_u8 \
- ((int(*)(PyObject *))_cffi_exports[2])
-#define _cffi_to_c_i16 \
- ((int(*)(PyObject *))_cffi_exports[3])
-#define _cffi_to_c_u16 \
- ((int(*)(PyObject *))_cffi_exports[4])
-#define _cffi_to_c_i32 \
- ((int(*)(PyObject *))_cffi_exports[5])
-#define _cffi_to_c_u32 \
- ((unsigned int(*)(PyObject *))_cffi_exports[6])
-#define _cffi_to_c_i64 \
- ((long long(*)(PyObject *))_cffi_exports[7])
-#define _cffi_to_c_u64 \
- ((unsigned long long(*)(PyObject *))_cffi_exports[8])
-#define _cffi_to_c_char \
- ((int(*)(PyObject *))_cffi_exports[9])
-#define _cffi_from_c_pointer \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10])
-#define _cffi_to_c_pointer \
- ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11])
-#define _cffi_get_struct_layout \
- ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12])
-#define _cffi_restore_errno \
- ((void(*)(void))_cffi_exports[13])
-#define _cffi_save_errno \
- ((void(*)(void))_cffi_exports[14])
-#define _cffi_from_c_char \
- ((PyObject *(*)(char))_cffi_exports[15])
-#define _cffi_from_c_deref \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16])
-#define _cffi_to_c \
- ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17])
-#define _cffi_from_c_struct \
- ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18])
-#define _cffi_to_c_wchar_t \
- ((wchar_t(*)(PyObject *))_cffi_exports[19])
-#define _cffi_from_c_wchar_t \
- ((PyObject *(*)(wchar_t))_cffi_exports[20])
-#define _cffi_to_c_long_double \
- ((long double(*)(PyObject *))_cffi_exports[21])
-#define _cffi_to_c__Bool \
- ((_Bool(*)(PyObject *))_cffi_exports[22])
-#define _cffi_prepare_pointer_call_argument \
- ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23])
-#define _cffi_convert_array_from_object \
- ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24])
-#define _CFFI_NUM_EXPORTS 25
-
-typedef struct _ctypedescr CTypeDescrObject;
-
-static void *_cffi_exports[_CFFI_NUM_EXPORTS];
-static PyObject *_cffi_types, *_cffi_VerificationError;
-
-static int _cffi_setup_custom(PyObject *lib); /* forward */
-
-static PyObject *_cffi_setup(PyObject *self, PyObject *args)
-{
- PyObject *library;
- int was_alive = (_cffi_types != NULL);
- (void)self; /* unused */
- if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError,
- &library))
- return NULL;
- Py_INCREF(_cffi_types);
- Py_INCREF(_cffi_VerificationError);
- if (_cffi_setup_custom(library) < 0)
- return NULL;
- return PyBool_FromLong(was_alive);
-}
-
-union _cffi_union_alignment_u {
- unsigned char m_char;
- unsigned short m_short;
- unsigned int m_int;
- unsigned long m_long;
- unsigned long long m_longlong;
- float m_float;
- double m_double;
- long double m_longdouble;
-};
-
-struct _cffi_freeme_s {
- struct _cffi_freeme_s *next;
- union _cffi_union_alignment_u alignment;
-};
-
-#ifdef __GNUC__
- __attribute__((unused))
-#endif
-static int _cffi_convert_array_argument(CTypeDescrObject *ctptr, PyObject *arg,
- char **output_data, Py_ssize_t datasize,
- struct _cffi_freeme_s **freeme)
-{
- char *p;
- if (datasize < 0)
- return -1;
-
- p = *output_data;
- if (p == NULL) {
- struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc(
- offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize);
- if (fp == NULL)
- return -1;
- fp->next = *freeme;
- *freeme = fp;
- p = *output_data = (char *)&fp->alignment;
- }
- memset((void *)p, 0, (size_t)datasize);
- return _cffi_convert_array_from_object(p, ctptr, arg);
-}
-
-#ifdef __GNUC__
- __attribute__((unused))
-#endif
-static void _cffi_free_array_arguments(struct _cffi_freeme_s *freeme)
-{
- do {
- void *p = (void *)freeme;
- freeme = freeme->next;
- PyObject_Free(p);
- } while (freeme != NULL);
-}
-
-static int _cffi_init(void)
-{
- PyObject *module, *c_api_object = NULL;
-
- module = PyImport_ImportModule("_cffi_backend");
- if (module == NULL)
- goto failure;
-
- c_api_object = PyObject_GetAttrString(module, "_C_API");
- if (c_api_object == NULL)
- goto failure;
- if (!PyCapsule_CheckExact(c_api_object)) {
- PyErr_SetNone(PyExc_ImportError);
- goto failure;
- }
- memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"),
- _CFFI_NUM_EXPORTS * sizeof(void *));
-
- Py_DECREF(module);
- Py_DECREF(c_api_object);
- return 0;
-
- failure:
- Py_XDECREF(module);
- Py_XDECREF(c_api_object);
- return -1;
-}
-
-#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num))
-
-/**********/
-'''
diff --git a/resources/python/bin/3.7/mac/cffi/vengine_gen.py b/resources/python/bin/3.7/mac/cffi/vengine_gen.py
deleted file mode 100644
index 26421526f..000000000
--- a/resources/python/bin/3.7/mac/cffi/vengine_gen.py
+++ /dev/null
@@ -1,675 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, os
-import types
-
-from . import model
-from .error import VerificationError
-
-
-class VGenericEngine(object):
- _class_key = 'g'
- _gen_python_module = False
-
- def __init__(self, verifier):
- self.verifier = verifier
- self.ffi = verifier.ffi
- self.export_symbols = []
- self._struct_pending_verification = {}
-
- def patch_extension_kwds(self, kwds):
- # add 'export_symbols' to the dictionary. Note that we add the
- # list before filling it. When we fill it, it will thus also show
- # up in kwds['export_symbols'].
- kwds.setdefault('export_symbols', self.export_symbols)
-
- def find_module(self, module_name, path, so_suffixes):
- for so_suffix in so_suffixes:
- basename = module_name + so_suffix
- if path is None:
- path = sys.path
- for dirname in path:
- filename = os.path.join(dirname, basename)
- if os.path.isfile(filename):
- return filename
-
- def collect_types(self):
- pass # not needed in the generic engine
-
- def _prnt(self, what=''):
- self._f.write(what + '\n')
-
- def write_source_to_f(self):
- prnt = self._prnt
- # first paste some standard set of lines that are mostly '#include'
- prnt(cffimod_header)
- # then paste the C source given by the user, verbatim.
- prnt(self.verifier.preamble)
- #
- # call generate_gen_xxx_decl(), for every xxx found from
- # ffi._parser._declarations. This generates all the functions.
- self._generate('decl')
- #
- # on Windows, distutils insists on putting init_cffi_xyz in
- # 'export_symbols', so instead of fighting it, just give up and
- # give it one
- if sys.platform == 'win32':
- if sys.version_info >= (3,):
- prefix = 'PyInit_'
- else:
- prefix = 'init'
- modname = self.verifier.get_module_name()
- prnt("void %s%s(void) { }\n" % (prefix, modname))
-
- def load_library(self, flags=0):
- # import it with the CFFI backend
- backend = self.ffi._backend
- # needs to make a path that contains '/', on Posix
- filename = os.path.join(os.curdir, self.verifier.modulefilename)
- module = backend.load_library(filename, flags)
- #
- # call loading_gen_struct() to get the struct layout inferred by
- # the C compiler
- self._load(module, 'loading')
-
- # build the FFILibrary class and instance, this is a module subclass
- # because modules are expected to have usually-constant-attributes and
- # in PyPy this means the JIT is able to treat attributes as constant,
- # which we want.
- class FFILibrary(types.ModuleType):
- _cffi_generic_module = module
- _cffi_ffi = self.ffi
- _cffi_dir = []
- def __dir__(self):
- return FFILibrary._cffi_dir
- library = FFILibrary("")
- #
- # finally, call the loaded_gen_xxx() functions. This will set
- # up the 'library' object.
- self._load(module, 'loaded', library=library)
- return library
-
- def _get_declarations(self):
- lst = [(key, tp) for (key, (tp, qual)) in
- self.ffi._parser._declarations.items()]
- lst.sort()
- return lst
-
- def _generate(self, step_name):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- try:
- method = getattr(self, '_generate_gen_%s_%s' % (kind,
- step_name))
- except AttributeError:
- raise VerificationError(
- "not implemented in verify(): %r" % name)
- try:
- method(tp, realname)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _load(self, module, step_name, **kwds):
- for name, tp in self._get_declarations():
- kind, realname = name.split(' ', 1)
- method = getattr(self, '_%s_gen_%s' % (step_name, kind))
- try:
- method(tp, realname, module, **kwds)
- except Exception as e:
- model.attach_exception_info(e, name)
- raise
-
- def _generate_nothing(self, tp, name):
- pass
-
- def _loaded_noop(self, tp, name, module, **kwds):
- pass
-
- # ----------
- # typedefs: generates no code so far
-
- _generate_gen_typedef_decl = _generate_nothing
- _loading_gen_typedef = _loaded_noop
- _loaded_gen_typedef = _loaded_noop
-
- # ----------
- # function declarations
-
- def _generate_gen_function_decl(self, tp, name):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- # cannot support vararg functions better than this: check for its
- # exact type (including the fixed arguments), and build it as a
- # constant function pointer (no _cffi_f_%s wrapper)
- self._generate_gen_const(False, name, tp)
- return
- prnt = self._prnt
- numargs = len(tp.args)
- argnames = []
- for i, type in enumerate(tp.args):
- indirection = ''
- if isinstance(type, model.StructOrUnion):
- indirection = '*'
- argnames.append('%sx%d' % (indirection, i))
- context = 'argument of %s' % name
- arglist = [type.get_c_name(' %s' % arg, context)
- for type, arg in zip(tp.args, argnames)]
- tpresult = tp.result
- if isinstance(tpresult, model.StructOrUnion):
- arglist.insert(0, tpresult.get_c_name(' *r', context))
- tpresult = model.void_type
- arglist = ', '.join(arglist) or 'void'
- wrappername = '_cffi_f_%s' % name
- self.export_symbols.append(wrappername)
- if tp.abi:
- abi = tp.abi + ' '
- else:
- abi = ''
- funcdecl = ' %s%s(%s)' % (abi, wrappername, arglist)
- context = 'result of %s' % name
- prnt(tpresult.get_c_name(funcdecl, context))
- prnt('{')
- #
- if isinstance(tp.result, model.StructOrUnion):
- result_code = '*r = '
- elif not isinstance(tp.result, model.VoidType):
- result_code = 'return '
- else:
- result_code = ''
- prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames)))
- prnt('}')
- prnt()
-
- _loading_gen_function = _loaded_noop
-
- def _loaded_gen_function(self, tp, name, module, library):
- assert isinstance(tp, model.FunctionPtrType)
- if tp.ellipsis:
- newfunction = self._load_constant(False, tp, name, module)
- else:
- indirections = []
- base_tp = tp
- if (any(isinstance(typ, model.StructOrUnion) for typ in tp.args)
- or isinstance(tp.result, model.StructOrUnion)):
- indirect_args = []
- for i, typ in enumerate(tp.args):
- if isinstance(typ, model.StructOrUnion):
- typ = model.PointerType(typ)
- indirections.append((i, typ))
- indirect_args.append(typ)
- indirect_result = tp.result
- if isinstance(indirect_result, model.StructOrUnion):
- if indirect_result.fldtypes is None:
- raise TypeError("'%s' is used as result type, "
- "but is opaque" % (
- indirect_result._get_c_name(),))
- indirect_result = model.PointerType(indirect_result)
- indirect_args.insert(0, indirect_result)
- indirections.insert(0, ("result", indirect_result))
- indirect_result = model.void_type
- tp = model.FunctionPtrType(tuple(indirect_args),
- indirect_result, tp.ellipsis)
- BFunc = self.ffi._get_cached_btype(tp)
- wrappername = '_cffi_f_%s' % name
- newfunction = module.load_function(BFunc, wrappername)
- for i, typ in indirections:
- newfunction = self._make_struct_wrapper(newfunction, i, typ,
- base_tp)
- setattr(library, name, newfunction)
- type(library)._cffi_dir.append(name)
-
- def _make_struct_wrapper(self, oldfunc, i, tp, base_tp):
- backend = self.ffi._backend
- BType = self.ffi._get_cached_btype(tp)
- if i == "result":
- ffi = self.ffi
- def newfunc(*args):
- res = ffi.new(BType)
- oldfunc(res, *args)
- return res[0]
- else:
- def newfunc(*args):
- args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:]
- return oldfunc(*args)
- newfunc._cffi_base_type = base_tp
- return newfunc
-
- # ----------
- # named structs
-
- def _generate_gen_struct_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'struct', name)
-
- def _loading_gen_struct(self, tp, name, module):
- self._loading_struct_or_union(tp, 'struct', name, module)
-
- def _loaded_gen_struct(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_gen_union_decl(self, tp, name):
- assert name == tp.name
- self._generate_struct_or_union_decl(tp, 'union', name)
-
- def _loading_gen_union(self, tp, name, module):
- self._loading_struct_or_union(tp, 'union', name, module)
-
- def _loaded_gen_union(self, tp, name, module, **kwds):
- self._loaded_struct_or_union(tp)
-
- def _generate_struct_or_union_decl(self, tp, prefix, name):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- checkfuncname = '_cffi_check_%s_%s' % (prefix, name)
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- cname = ('%s %s' % (prefix, name)).strip()
- #
- prnt = self._prnt
- prnt('static void %s(%s *p)' % (checkfuncname, cname))
- prnt('{')
- prnt(' /* only to generate compile-time warnings or errors */')
- prnt(' (void)p;')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if (isinstance(ftype, model.PrimitiveType)
- and ftype.is_integer_type()) or fbitsize >= 0:
- # accept all integers, but complain on float or double
- prnt(' (void)((p->%s) << 1);' % fname)
- else:
- # only accept exactly the type declared.
- try:
- prnt(' { %s = &p->%s; (void)tmp; }' % (
- ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual),
- fname))
- except VerificationError as e:
- prnt(' /* %s */' % str(e)) # cannot verify it, ignore
- prnt('}')
- self.export_symbols.append(layoutfuncname)
- prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,))
- prnt('{')
- prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname)
- prnt(' static intptr_t nums[] = {')
- prnt(' sizeof(%s),' % cname)
- prnt(' offsetof(struct _cffi_aligncheck, y),')
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- prnt(' offsetof(%s, %s),' % (cname, fname))
- if isinstance(ftype, model.ArrayType) and ftype.length is None:
- prnt(' 0, /* %s */' % ftype._get_c_name())
- else:
- prnt(' sizeof(((%s *)0)->%s),' % (cname, fname))
- prnt(' -1')
- prnt(' };')
- prnt(' return nums[i];')
- prnt(' /* the next line is not executed, but compiled */')
- prnt(' %s(0);' % (checkfuncname,))
- prnt('}')
- prnt()
-
- def _loading_struct_or_union(self, tp, prefix, name, module):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name)
- #
- BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0]
- function = module.load_function(BFunc, layoutfuncname)
- layout = []
- num = 0
- while True:
- x = function(num)
- if x < 0: break
- layout.append(x)
- num += 1
- if isinstance(tp, model.StructOrUnion) and tp.partial:
- # use the function()'s sizes and offsets to guide the
- # layout of the struct
- totalsize = layout[0]
- totalalignment = layout[1]
- fieldofs = layout[2::2]
- fieldsize = layout[3::2]
- tp.force_flatten()
- assert len(fieldofs) == len(fieldsize) == len(tp.fldnames)
- tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment
- else:
- cname = ('%s %s' % (prefix, name)).strip()
- self._struct_pending_verification[tp] = layout, cname
-
- def _loaded_struct_or_union(self, tp):
- if tp.fldnames is None:
- return # nothing to do with opaque structs
- self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered
-
- if tp in self._struct_pending_verification:
- # check that the layout sizes and offsets match the real ones
- def check(realvalue, expectedvalue, msg):
- if realvalue != expectedvalue:
- raise VerificationError(
- "%s (we have %d, but C compiler says %d)"
- % (msg, expectedvalue, realvalue))
- ffi = self.ffi
- BStruct = ffi._get_cached_btype(tp)
- layout, cname = self._struct_pending_verification.pop(tp)
- check(layout[0], ffi.sizeof(BStruct), "wrong total size")
- check(layout[1], ffi.alignof(BStruct), "wrong total alignment")
- i = 2
- for fname, ftype, fbitsize, fqual in tp.enumfields():
- if fbitsize >= 0:
- continue # xxx ignore fbitsize for now
- check(layout[i], ffi.offsetof(BStruct, fname),
- "wrong offset for field %r" % (fname,))
- if layout[i+1] != 0:
- BField = ffi._get_cached_btype(ftype)
- check(layout[i+1], ffi.sizeof(BField),
- "wrong size for field %r" % (fname,))
- i += 2
- assert i == len(layout)
-
- # ----------
- # 'anonymous' declarations. These are produced for anonymous structs
- # or unions; the 'name' is obtained by a typedef.
-
- def _generate_gen_anonymous_decl(self, tp, name):
- if isinstance(tp, model.EnumType):
- self._generate_gen_enum_decl(tp, name, '')
- else:
- self._generate_struct_or_union_decl(tp, '', name)
-
- def _loading_gen_anonymous(self, tp, name, module):
- if isinstance(tp, model.EnumType):
- self._loading_gen_enum(tp, name, module, '')
- else:
- self._loading_struct_or_union(tp, '', name, module)
-
- def _loaded_gen_anonymous(self, tp, name, module, **kwds):
- if isinstance(tp, model.EnumType):
- self._loaded_gen_enum(tp, name, module, **kwds)
- else:
- self._loaded_struct_or_union(tp)
-
- # ----------
- # constants, likely declared with '#define'
-
- def _generate_gen_const(self, is_int, name, tp=None, category='const',
- check_value=None):
- prnt = self._prnt
- funcname = '_cffi_%s_%s' % (category, name)
- self.export_symbols.append(funcname)
- if check_value is not None:
- assert is_int
- assert category == 'const'
- prnt('int %s(char *out_error)' % funcname)
- prnt('{')
- self._check_int_constant_value(name, check_value)
- prnt(' return 0;')
- prnt('}')
- elif is_int:
- assert category == 'const'
- prnt('int %s(long long *out_value)' % funcname)
- prnt('{')
- prnt(' *out_value = (long long)(%s);' % (name,))
- prnt(' return (%s) <= 0;' % (name,))
- prnt('}')
- else:
- assert tp is not None
- assert check_value is None
- if category == 'var':
- ampersand = '&'
- else:
- ampersand = ''
- extra = ''
- if category == 'const' and isinstance(tp, model.StructOrUnion):
- extra = 'const *'
- ampersand = '&'
- prnt(tp.get_c_name(' %s%s(void)' % (extra, funcname), name))
- prnt('{')
- prnt(' return (%s%s);' % (ampersand, name))
- prnt('}')
- prnt()
-
- def _generate_gen_constant_decl(self, tp, name):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- self._generate_gen_const(is_int, name, tp)
-
- _loading_gen_constant = _loaded_noop
-
- def _load_constant(self, is_int, tp, name, module, check_value=None):
- funcname = '_cffi_const_%s' % name
- if check_value is not None:
- assert is_int
- self._load_known_int_constant(module, funcname)
- value = check_value
- elif is_int:
- BType = self.ffi._typeof_locked("long long*")[0]
- BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0]
- function = module.load_function(BFunc, funcname)
- p = self.ffi.new(BType)
- negative = function(p)
- value = int(p[0])
- if value < 0 and not negative:
- BLongLong = self.ffi._typeof_locked("long long")[0]
- value += (1 << (8*self.ffi.sizeof(BLongLong)))
- else:
- assert check_value is None
- fntypeextra = '(*)(void)'
- if isinstance(tp, model.StructOrUnion):
- fntypeextra = '*' + fntypeextra
- BFunc = self.ffi._typeof_locked(tp.get_c_name(fntypeextra, name))[0]
- function = module.load_function(BFunc, funcname)
- value = function()
- if isinstance(tp, model.StructOrUnion):
- value = value[0]
- return value
-
- def _loaded_gen_constant(self, tp, name, module, library):
- is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type()
- value = self._load_constant(is_int, tp, name, module)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
-
- # ----------
- # enums
-
- def _check_int_constant_value(self, name, value):
- prnt = self._prnt
- if value <= 0:
- prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % (
- name, name, value))
- else:
- prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % (
- name, name, value))
- prnt(' char buf[64];')
- prnt(' if ((%s) <= 0)' % name)
- prnt(' sprintf(buf, "%%ld", (long)(%s));' % name)
- prnt(' else')
- prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' %
- name)
- prnt(' sprintf(out_error, "%s has the real value %s, not %s",')
- prnt(' "%s", buf, "%d");' % (name[:100], value))
- prnt(' return -1;')
- prnt(' }')
-
- def _load_known_int_constant(self, module, funcname):
- BType = self.ffi._typeof_locked("char[]")[0]
- BFunc = self.ffi._typeof_locked("int(*)(char*)")[0]
- function = module.load_function(BFunc, funcname)
- p = self.ffi.new(BType, 256)
- if function(p) < 0:
- error = self.ffi.string(p)
- if sys.version_info >= (3,):
- error = str(error, 'utf-8')
- raise VerificationError(error)
-
- def _enum_funcname(self, prefix, name):
- # "$enum_$1" => "___D_enum____D_1"
- name = name.replace('$', '___D_')
- return '_cffi_e_%s_%s' % (prefix, name)
-
- def _generate_gen_enum_decl(self, tp, name, prefix='enum'):
- if tp.partial:
- for enumerator in tp.enumerators:
- self._generate_gen_const(True, enumerator)
- return
- #
- funcname = self._enum_funcname(prefix, name)
- self.export_symbols.append(funcname)
- prnt = self._prnt
- prnt('int %s(char *out_error)' % funcname)
- prnt('{')
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- self._check_int_constant_value(enumerator, enumvalue)
- prnt(' return 0;')
- prnt('}')
- prnt()
-
- def _loading_gen_enum(self, tp, name, module, prefix='enum'):
- if tp.partial:
- enumvalues = [self._load_constant(True, tp, enumerator, module)
- for enumerator in tp.enumerators]
- tp.enumvalues = tuple(enumvalues)
- tp.partial_resolved = True
- else:
- funcname = self._enum_funcname(prefix, name)
- self._load_known_int_constant(module, funcname)
-
- def _loaded_gen_enum(self, tp, name, module, library):
- for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues):
- setattr(library, enumerator, enumvalue)
- type(library)._cffi_dir.append(enumerator)
-
- # ----------
- # macros: for now only for integers
-
- def _generate_gen_macro_decl(self, tp, name):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- self._generate_gen_const(True, name, check_value=check_value)
-
- _loading_gen_macro = _loaded_noop
-
- def _loaded_gen_macro(self, tp, name, module, library):
- if tp == '...':
- check_value = None
- else:
- check_value = tp # an integer
- value = self._load_constant(True, tp, name, module,
- check_value=check_value)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
-
- # ----------
- # global variables
-
- def _generate_gen_variable_decl(self, tp, name):
- if isinstance(tp, model.ArrayType):
- if tp.length_is_unknown():
- prnt = self._prnt
- funcname = '_cffi_sizeof_%s' % (name,)
- self.export_symbols.append(funcname)
- prnt("size_t %s(void)" % funcname)
- prnt("{")
- prnt(" return sizeof(%s);" % (name,))
- prnt("}")
- tp_ptr = model.PointerType(tp.item)
- self._generate_gen_const(False, name, tp_ptr)
- else:
- tp_ptr = model.PointerType(tp)
- self._generate_gen_const(False, name, tp_ptr, category='var')
-
- _loading_gen_variable = _loaded_noop
-
- def _loaded_gen_variable(self, tp, name, module, library):
- if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the
- # sense that "a=..." is forbidden
- if tp.length_is_unknown():
- funcname = '_cffi_sizeof_%s' % (name,)
- BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0]
- function = module.load_function(BFunc, funcname)
- size = function()
- BItemType = self.ffi._get_cached_btype(tp.item)
- length, rest = divmod(size, self.ffi.sizeof(BItemType))
- if rest != 0:
- raise VerificationError(
- "bad size: %r does not seem to be an array of %s" %
- (name, tp.item))
- tp = tp.resolve_length(length)
- tp_ptr = model.PointerType(tp.item)
- value = self._load_constant(False, tp_ptr, name, module)
- # 'value' is a which we have to replace with
- # a if the N is actually known
- if tp.length is not None:
- BArray = self.ffi._get_cached_btype(tp)
- value = self.ffi.cast(BArray, value)
- setattr(library, name, value)
- type(library)._cffi_dir.append(name)
- return
- # remove ptr= from the library instance, and replace
- # it by a property on the class, which reads/writes into ptr[0].
- funcname = '_cffi_var_%s' % name
- BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0]
- function = module.load_function(BFunc, funcname)
- ptr = function()
- def getter(library):
- return ptr[0]
- def setter(library, value):
- ptr[0] = value
- setattr(type(library), name, property(getter, setter))
- type(library)._cffi_dir.append(name)
-
-cffimod_header = r'''
-#include
-#include
-#include
-#include
-#include /* XXX for ssize_t on some platforms */
-
-/* this block of #ifs should be kept exactly identical between
- c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
- and cffi/_cffi_include.h */
-#if defined(_MSC_VER)
-# include /* for alloca() */
-# if _MSC_VER < 1600 /* MSVC < 2010 */
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
- typedef __int8 int_least8_t;
- typedef __int16 int_least16_t;
- typedef __int32 int_least32_t;
- typedef __int64 int_least64_t;
- typedef unsigned __int8 uint_least8_t;
- typedef unsigned __int16 uint_least16_t;
- typedef unsigned __int32 uint_least32_t;
- typedef unsigned __int64 uint_least64_t;
- typedef __int8 int_fast8_t;
- typedef __int16 int_fast16_t;
- typedef __int32 int_fast32_t;
- typedef __int64 int_fast64_t;
- typedef unsigned __int8 uint_fast8_t;
- typedef unsigned __int16 uint_fast16_t;
- typedef unsigned __int32 uint_fast32_t;
- typedef unsigned __int64 uint_fast64_t;
- typedef __int64 intmax_t;
- typedef unsigned __int64 uintmax_t;
-# else
-# include
-# endif
-# if _MSC_VER < 1800 /* MSVC < 2013 */
-# ifndef __cplusplus
- typedef unsigned char _Bool;
-# endif
-# endif
-#else
-# include
-# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
-# include
-# endif
-#endif
-'''
diff --git a/resources/python/bin/3.7/mac/cffi/verifier.py b/resources/python/bin/3.7/mac/cffi/verifier.py
deleted file mode 100644
index a500c7814..000000000
--- a/resources/python/bin/3.7/mac/cffi/verifier.py
+++ /dev/null
@@ -1,307 +0,0 @@
-#
-# DEPRECATED: implementation for ffi.verify()
-#
-import sys, os, binascii, shutil, io
-from . import __version_verifier_modules__
-from . import ffiplatform
-from .error import VerificationError
-
-if sys.version_info >= (3, 3):
- import importlib.machinery
- def _extension_suffixes():
- return importlib.machinery.EXTENSION_SUFFIXES[:]
-else:
- import imp
- def _extension_suffixes():
- return [suffix for suffix, _, type in imp.get_suffixes()
- if type == imp.C_EXTENSION]
-
-
-if sys.version_info >= (3,):
- NativeIO = io.StringIO
-else:
- class NativeIO(io.BytesIO):
- def write(self, s):
- if isinstance(s, unicode):
- s = s.encode('ascii')
- super(NativeIO, self).write(s)
-
-
-class Verifier(object):
-
- def __init__(self, ffi, preamble, tmpdir=None, modulename=None,
- ext_package=None, tag='', force_generic_engine=False,
- source_extension='.c', flags=None, relative_to=None, **kwds):
- if ffi._parser._uses_new_feature:
- raise VerificationError(
- "feature not supported with ffi.verify(), but only "
- "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,))
- self.ffi = ffi
- self.preamble = preamble
- if not modulename:
- flattened_kwds = ffiplatform.flatten(kwds)
- vengine_class = _locate_engine_class(ffi, force_generic_engine)
- self._vengine = vengine_class(self)
- self._vengine.patch_extension_kwds(kwds)
- self.flags = flags
- self.kwds = self.make_relative_to(kwds, relative_to)
- #
- if modulename:
- if tag:
- raise TypeError("can't specify both 'modulename' and 'tag'")
- else:
- key = '\x00'.join(['%d.%d' % sys.version_info[:2],
- __version_verifier_modules__,
- preamble, flattened_kwds] +
- ffi._cdefsources)
- if sys.version_info >= (3,):
- key = key.encode('utf-8')
- k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff)
- k1 = k1.lstrip('0x').rstrip('L')
- k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff)
- k2 = k2.lstrip('0').rstrip('L')
- modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key,
- k1, k2)
- suffix = _get_so_suffixes()[0]
- self.tmpdir = tmpdir or _caller_dir_pycache()
- self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension)
- self.modulefilename = os.path.join(self.tmpdir, modulename + suffix)
- self.ext_package = ext_package
- self._has_source = False
- self._has_module = False
-
- def write_source(self, file=None):
- """Write the C source code. It is produced in 'self.sourcefilename',
- which can be tweaked beforehand."""
- with self.ffi._lock:
- if self._has_source and file is None:
- raise VerificationError(
- "source code already written")
- self._write_source(file)
-
- def compile_module(self):
- """Write the C source code (if not done already) and compile it.
- This produces a dynamic link library in 'self.modulefilename'."""
- with self.ffi._lock:
- if self._has_module:
- raise VerificationError("module already compiled")
- if not self._has_source:
- self._write_source()
- self._compile_module()
-
- def load_library(self):
- """Get a C module from this Verifier instance.
- Returns an instance of a FFILibrary class that behaves like the
- objects returned by ffi.dlopen(), but that delegates all
- operations to the C module. If necessary, the C code is written
- and compiled first.
- """
- with self.ffi._lock:
- if not self._has_module:
- self._locate_module()
- if not self._has_module:
- if not self._has_source:
- self._write_source()
- self._compile_module()
- return self._load_library()
-
- def get_module_name(self):
- basename = os.path.basename(self.modulefilename)
- # kill both the .so extension and the other .'s, as introduced
- # by Python 3: 'basename.cpython-33m.so'
- basename = basename.split('.', 1)[0]
- # and the _d added in Python 2 debug builds --- but try to be
- # conservative and not kill a legitimate _d
- if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'):
- basename = basename[:-2]
- return basename
-
- def get_extension(self):
- ffiplatform._hack_at_distutils() # backward compatibility hack
- if not self._has_source:
- with self.ffi._lock:
- if not self._has_source:
- self._write_source()
- sourcename = ffiplatform.maybe_relative_path(self.sourcefilename)
- modname = self.get_module_name()
- return ffiplatform.get_extension(sourcename, modname, **self.kwds)
-
- def generates_python_module(self):
- return self._vengine._gen_python_module
-
- def make_relative_to(self, kwds, relative_to):
- if relative_to and os.path.dirname(relative_to):
- dirname = os.path.dirname(relative_to)
- kwds = kwds.copy()
- for key in ffiplatform.LIST_OF_FILE_NAMES:
- if key in kwds:
- lst = kwds[key]
- if not isinstance(lst, (list, tuple)):
- raise TypeError("keyword '%s' should be a list or tuple"
- % (key,))
- lst = [os.path.join(dirname, fn) for fn in lst]
- kwds[key] = lst
- return kwds
-
- # ----------
-
- def _locate_module(self):
- if not os.path.isfile(self.modulefilename):
- if self.ext_package:
- try:
- pkg = __import__(self.ext_package, None, None, ['__doc__'])
- except ImportError:
- return # cannot import the package itself, give up
- # (e.g. it might be called differently before installation)
- path = pkg.__path__
- else:
- path = None
- filename = self._vengine.find_module(self.get_module_name(), path,
- _get_so_suffixes())
- if filename is None:
- return
- self.modulefilename = filename
- self._vengine.collect_types()
- self._has_module = True
-
- def _write_source_to(self, file):
- self._vengine._f = file
- try:
- self._vengine.write_source_to_f()
- finally:
- del self._vengine._f
-
- def _write_source(self, file=None):
- if file is not None:
- self._write_source_to(file)
- else:
- # Write our source file to an in memory file.
- f = NativeIO()
- self._write_source_to(f)
- source_data = f.getvalue()
-
- # Determine if this matches the current file
- if os.path.exists(self.sourcefilename):
- with open(self.sourcefilename, "r") as fp:
- needs_written = not (fp.read() == source_data)
- else:
- needs_written = True
-
- # Actually write the file out if it doesn't match
- if needs_written:
- _ensure_dir(self.sourcefilename)
- with open(self.sourcefilename, "w") as fp:
- fp.write(source_data)
-
- # Set this flag
- self._has_source = True
-
- def _compile_module(self):
- # compile this C source
- tmpdir = os.path.dirname(self.sourcefilename)
- outputfilename = ffiplatform.compile(tmpdir, self.get_extension())
- try:
- same = ffiplatform.samefile(outputfilename, self.modulefilename)
- except OSError:
- same = False
- if not same:
- _ensure_dir(self.modulefilename)
- shutil.move(outputfilename, self.modulefilename)
- self._has_module = True
-
- def _load_library(self):
- assert self._has_module
- if self.flags is not None:
- return self._vengine.load_library(self.flags)
- else:
- return self._vengine.load_library()
-
-# ____________________________________________________________
-
-_FORCE_GENERIC_ENGINE = False # for tests
-
-def _locate_engine_class(ffi, force_generic_engine):
- if _FORCE_GENERIC_ENGINE:
- force_generic_engine = True
- if not force_generic_engine:
- if '__pypy__' in sys.builtin_module_names:
- force_generic_engine = True
- else:
- try:
- import _cffi_backend
- except ImportError:
- _cffi_backend = '?'
- if ffi._backend is not _cffi_backend:
- force_generic_engine = True
- if force_generic_engine:
- from . import vengine_gen
- return vengine_gen.VGenericEngine
- else:
- from . import vengine_cpy
- return vengine_cpy.VCPythonEngine
-
-# ____________________________________________________________
-
-_TMPDIR = None
-
-def _caller_dir_pycache():
- if _TMPDIR:
- return _TMPDIR
- result = os.environ.get('CFFI_TMPDIR')
- if result:
- return result
- filename = sys._getframe(2).f_code.co_filename
- return os.path.abspath(os.path.join(os.path.dirname(filename),
- '__pycache__'))
-
-def set_tmpdir(dirname):
- """Set the temporary directory to use instead of __pycache__."""
- global _TMPDIR
- _TMPDIR = dirname
-
-def cleanup_tmpdir(tmpdir=None, keep_so=False):
- """Clean up the temporary directory by removing all files in it
- called `_cffi_*.{c,so}` as well as the `build` subdirectory."""
- tmpdir = tmpdir or _caller_dir_pycache()
- try:
- filelist = os.listdir(tmpdir)
- except OSError:
- return
- if keep_so:
- suffix = '.c' # only remove .c files
- else:
- suffix = _get_so_suffixes()[0].lower()
- for fn in filelist:
- if fn.lower().startswith('_cffi_') and (
- fn.lower().endswith(suffix) or fn.lower().endswith('.c')):
- try:
- os.unlink(os.path.join(tmpdir, fn))
- except OSError:
- pass
- clean_dir = [os.path.join(tmpdir, 'build')]
- for dir in clean_dir:
- try:
- for fn in os.listdir(dir):
- fn = os.path.join(dir, fn)
- if os.path.isdir(fn):
- clean_dir.append(fn)
- else:
- os.unlink(fn)
- except OSError:
- pass
-
-def _get_so_suffixes():
- suffixes = _extension_suffixes()
- if not suffixes:
- # bah, no C_EXTENSION available. Occurs on pypy without cpyext
- if sys.platform == 'win32':
- suffixes = [".pyd"]
- else:
- suffixes = [".so"]
-
- return suffixes
-
-def _ensure_dir(filename):
- dirname = os.path.dirname(filename)
- if dirname and not os.path.isdir(dirname):
- os.makedirs(dirname)
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/INSTALLER b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/METADATA b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/METADATA
deleted file mode 100644
index a67ad96ac..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/METADATA
+++ /dev/null
@@ -1,140 +0,0 @@
-Metadata-Version: 2.3
-Name: cryptography
-Version: 44.0.3
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Natural Language :: English
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: BSD
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: 3.13
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Security :: Cryptography
-Requires-Dist: cffi >=1.12 ; platform_python_implementation != 'PyPy'
-Requires-Dist: bcrypt >=3.1.5 ; extra == 'ssh'
-Requires-Dist: nox >=2024.4.15 ; extra == 'nox'
-Requires-Dist: nox[uv] >=2024.3.2 ; python_version >= '3.8' and extra == 'nox'
-Requires-Dist: cryptography-vectors ==44.0.3 ; extra == 'test'
-Requires-Dist: pytest >=7.4.0 ; extra == 'test'
-Requires-Dist: pytest-benchmark >=4.0 ; extra == 'test'
-Requires-Dist: pytest-cov >=2.10.1 ; extra == 'test'
-Requires-Dist: pytest-xdist >=3.5.0 ; extra == 'test'
-Requires-Dist: pretend >=0.7 ; extra == 'test'
-Requires-Dist: certifi >=2024 ; extra == 'test'
-Requires-Dist: pytest-randomly ; extra == 'test-randomorder'
-Requires-Dist: sphinx >=5.3.0 ; extra == 'docs'
-Requires-Dist: sphinx-rtd-theme >=3.0.0 ; python_version >= '3.8' and extra == 'docs'
-Requires-Dist: pyenchant >=3 ; extra == 'docstest'
-Requires-Dist: readme-renderer >=30.0 ; extra == 'docstest'
-Requires-Dist: sphinxcontrib-spelling >=7.3.1 ; extra == 'docstest'
-Requires-Dist: build >=1.0.0 ; extra == 'sdist'
-Requires-Dist: ruff >=0.3.6 ; extra == 'pep8test'
-Requires-Dist: mypy >=1.4 ; extra == 'pep8test'
-Requires-Dist: check-sdist ; python_version >= '3.8' and extra == 'pep8test'
-Requires-Dist: click >=8.0.1 ; extra == 'pep8test'
-Provides-Extra: ssh
-Provides-Extra: nox
-Provides-Extra: test
-Provides-Extra: test-randomorder
-Provides-Extra: docs
-Provides-Extra: docstest
-Provides-Extra: sdist
-Provides-Extra: pep8test
-License-File: LICENSE
-License-File: LICENSE.APACHE
-License-File: LICENSE.BSD
-Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.
-Author: The cryptography developers
-Author-email: The Python Cryptographic Authority and individual contributors
-License: Apache-2.0 OR BSD-3-Clause
-Requires-Python: >=3.7, !=3.9.0, !=3.9.1
-Description-Content-Type: text/x-rst; charset=UTF-8
-Project-URL: homepage, https://github.com/pyca/cryptography
-Project-URL: documentation, https://cryptography.io/
-Project-URL: source, https://github.com/pyca/cryptography/
-Project-URL: issues, https://github.com/pyca/cryptography/issues
-Project-URL: changelog, https://cryptography.io/en/latest/changelog/
-
-pyca/cryptography
-=================
-
-.. image:: https://img.shields.io/pypi/v/cryptography.svg
- :target: https://pypi.org/project/cryptography/
- :alt: Latest Version
-
-.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest
- :target: https://cryptography.io
- :alt: Latest Docs
-
-.. image:: https://github.com/pyca/cryptography/workflows/CI/badge.svg?branch=main
- :target: https://github.com/pyca/cryptography/actions?query=workflow%3ACI+branch%3Amain
-
-
-``cryptography`` is a package which provides cryptographic recipes and
-primitives to Python developers. Our goal is for it to be your "cryptographic
-standard library". It supports Python 3.7+ and PyPy3 7.3.11+.
-
-``cryptography`` includes both high level recipes and low level interfaces to
-common cryptographic algorithms such as symmetric ciphers, message digests, and
-key derivation functions. For example, to encrypt something with
-``cryptography``'s high level symmetric encryption recipe:
-
-.. code-block:: pycon
-
- >>> from cryptography.fernet import Fernet
- >>> # Put this somewhere safe!
- >>> key = Fernet.generate_key()
- >>> f = Fernet(key)
- >>> token = f.encrypt(b"A really secret message. Not for prying eyes.")
- >>> token
- b'...'
- >>> f.decrypt(token)
- b'A really secret message. Not for prying eyes.'
-
-You can find more information in the `documentation`_.
-
-You can install ``cryptography`` with:
-
-.. code-block:: console
-
- $ pip install cryptography
-
-For full details see `the installation documentation`_.
-
-Discussion
-~~~~~~~~~~
-
-If you run into bugs, you can file them in our `issue tracker`_.
-
-We maintain a `cryptography-dev`_ mailing list for development discussion.
-
-You can also join ``#pyca`` on ``irc.libera.chat`` to ask questions or get
-involved.
-
-Security
-~~~~~~~~
-
-Need to report a security issue? Please consult our `security reporting`_
-documentation.
-
-
-.. _`documentation`: https://cryptography.io/
-.. _`the installation documentation`: https://cryptography.io/en/latest/installation/
-.. _`issue tracker`: https://github.com/pyca/cryptography/issues
-.. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev
-.. _`security reporting`: https://cryptography.io/en/latest/security/
-
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/RECORD b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/RECORD
deleted file mode 100644
index 578af7c1c..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/RECORD
+++ /dev/null
@@ -1,183 +0,0 @@
-cryptography-44.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-cryptography-44.0.3.dist-info/METADATA,sha256=N2HCybALCy-5akCnV9cwLVzy7MWOxK7US732RZhSnOw,5724
-cryptography-44.0.3.dist-info/RECORD,,
-cryptography-44.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cryptography-44.0.3.dist-info/WHEEL,sha256=ogtQC347jRLuFsVQOBM2Vg5uwQEKv5i8IREq1IbCq2Q,107
-cryptography-44.0.3.dist-info/licenses/LICENSE,sha256=Pgx8CRqUi4JTO6mP18u0BDLW8amsv4X1ki0vmak65rs,197
-cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE,sha256=qsc7MUj20dcRHbyjIJn2jSbGRMaBOuHk8F9leaomY_4,11360
-cryptography-44.0.3.dist-info/licenses/LICENSE.BSD,sha256=YCxMdILeZHndLpeTzaJ15eY9dz2s0eymiSMqtwCPtPs,1532
-cryptography/__about__.py,sha256=awPE0zq9hPdDu1cYrUd7hGJcA-POPpSD-ams74j4eag,445
-cryptography/__init__.py,sha256=XsRL_PxbU6UgoyoglAgJQSrJCP97ovBA8YIEQ2-uI68,762
-cryptography/__pycache__/__about__.cpython-37.pyc,,
-cryptography/__pycache__/__init__.cpython-37.pyc,,
-cryptography/__pycache__/exceptions.cpython-37.pyc,,
-cryptography/__pycache__/fernet.cpython-37.pyc,,
-cryptography/__pycache__/utils.cpython-37.pyc,,
-cryptography/exceptions.py,sha256=835EWILc2fwxw-gyFMriciC2SqhViETB10LBSytnDIc,1087
-cryptography/fernet.py,sha256=aMU2HyDJ5oRGjg8AkFvHwE7BSmHY4fVUCaioxZcd8gA,6933
-cryptography/hazmat/__init__.py,sha256=5IwrLWrVp0AjEr_4FdWG_V057NSJGY_W4egNNsuct0g,455
-cryptography/hazmat/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/__pycache__/_oid.cpython-37.pyc,,
-cryptography/hazmat/_oid.py,sha256=xcGtygUQX1p2ozVjhqKk016E5--BC7ituI1EGuoiWds,15294
-cryptography/hazmat/backends/__init__.py,sha256=O5jvKFQdZnXhKeqJ-HtulaEL9Ni7mr1mDzZY5kHlYhI,361
-cryptography/hazmat/backends/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/__init__.py,sha256=p3jmJfnCag9iE5sdMrN6VvVEu55u46xaS_IjoI0SrmA,305
-cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-37.pyc,,
-cryptography/hazmat/backends/openssl/backend.py,sha256=_H02YwpjWOV19Mcc04QgedqGTSSjBaWEb6KIIvLyfzk,9655
-cryptography/hazmat/bindings/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/bindings/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/bindings/_rust.abi3.so,sha256=LsMVzUUk_geFliGg-amPVTA7HRcap4EmRM2effsi7xU,20008720
-cryptography/hazmat/bindings/_rust/__init__.pyi,sha256=s73-NWxZs-5r2vAzDT9Eqo9mRiWE__A4VJKyFBkjHdM,879
-cryptography/hazmat/bindings/_rust/_openssl.pyi,sha256=mpNJLuYLbCVrd5i33FBTmWwL_55Dw7JPkSLlSX9Q7oI,230
-cryptography/hazmat/bindings/_rust/asn1.pyi,sha256=BrGjC8J6nwuS-r3EVcdXJB8ndotfY9mbQYOfpbPG0HA,354
-cryptography/hazmat/bindings/_rust/exceptions.pyi,sha256=exXr2xw_0pB1kk93cYbM3MohbzoUkjOms1ZMUi0uQZE,640
-cryptography/hazmat/bindings/_rust/ocsp.pyi,sha256=mNrMO5sYEnftD_b2-NvvR6M8QdYGZ1jpTdazpgzXgl0,4004
-cryptography/hazmat/bindings/_rust/openssl/__init__.pyi,sha256=FS2gi2eALVzqTTic8an8enD431pkwKbRxeAZaNMV4Ts,1410
-cryptography/hazmat/bindings/_rust/openssl/aead.pyi,sha256=i0gA3jUQ4rkJXTGGZrq-AuY-VQLN31lyDeWuDZ0zJYw,2553
-cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi,sha256=iK0ZhQ-WyCQbjaraaFgK6q4PpD-7Rf5RDHkFD3YEW_g,1301
-cryptography/hazmat/bindings/_rust/openssl/cmac.pyi,sha256=nPH0X57RYpsAkRowVpjQiHE566ThUTx7YXrsadmrmHk,564
-cryptography/hazmat/bindings/_rust/openssl/dh.pyi,sha256=Z3TC-G04-THtSdAOPLM1h2G7ml5bda1ElZUcn5wpuhk,1564
-cryptography/hazmat/bindings/_rust/openssl/dsa.pyi,sha256=qBtkgj2albt2qFcnZ9UDrhzoNhCVO7HTby5VSf1EXMI,1299
-cryptography/hazmat/bindings/_rust/openssl/ec.pyi,sha256=zJy0pRa5n-_p2dm45PxECB_-B6SVZyNKfjxFDpPqT38,1691
-cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi,sha256=OJsrblS2nHptZctva-pAKFL5q8yPEAkhmjPZpJ6TA94,493
-cryptography/hazmat/bindings/_rust/openssl/ed448.pyi,sha256=SkPHK2HdbYN02TVQEUOgW3iTdiEY7HBE4DijpdkAzmk,475
-cryptography/hazmat/bindings/_rust/openssl/hashes.pyi,sha256=p8sdf41mPBlV_W9v_18JItuMoHE8UkBxj9Tuqi0WiTE,639
-cryptography/hazmat/bindings/_rust/openssl/hmac.pyi,sha256=ZmLJ73pmxcZFC1XosWEiXMRYtvJJor3ZLdCQOJu85Cw,662
-cryptography/hazmat/bindings/_rust/openssl/kdf.pyi,sha256=hvZSV2C3MQd9jC1Tuh5Lsb0iGBgcLVF2xFYdTo7USO4,1129
-cryptography/hazmat/bindings/_rust/openssl/keys.pyi,sha256=JSrlGNaW49ZCZ1hcb-YJdS1EAbsMwRbVEcLL0P9OApA,872
-cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi,sha256=9iogF7Q4i81IkOS-IMXp6HvxFF_3cNy_ucrAjVQnn14,540
-cryptography/hazmat/bindings/_rust/openssl/rsa.pyi,sha256=2OQCNSXkxgc-3uw1xiCCloIQTV6p9_kK79Yu0rhZgPc,1364
-cryptography/hazmat/bindings/_rust/openssl/x25519.pyi,sha256=2BKdbrddM_9SMUpdvHKGhb9MNjURCarPxccbUDzHeoA,484
-cryptography/hazmat/bindings/_rust/openssl/x448.pyi,sha256=AoRMWNvCJTiH5L-lkIkCdPlrPLUdJvvfXpIvf1GmxpM,466
-cryptography/hazmat/bindings/_rust/pkcs12.pyi,sha256=afhB_6M8xI1MIE5vxkaDF1jSxA48ib1--NiOxtf6boM,1394
-cryptography/hazmat/bindings/_rust/pkcs7.pyi,sha256=Ag9coB8kRwrUJEg1do6BJABs9DqxZiY8WJIFUVa7StE,1545
-cryptography/hazmat/bindings/_rust/test_support.pyi,sha256=FXe7t_tqI3e9ULirYcr5Zlw5szGY7TiZyb7W83ak0Nk,718
-cryptography/hazmat/bindings/_rust/x509.pyi,sha256=0p-Ak_zj-9WfyZKPo08YT6cOx1c-lhjeYd0jJ8c4oT0,8318
-cryptography/hazmat/bindings/openssl/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-37.pyc,,
-cryptography/hazmat/bindings/openssl/_conditional.py,sha256=dkGKGU-22uR2ZKeOOwaSxEJCGaafgUjb2romWcu03QE,5163
-cryptography/hazmat/bindings/openssl/binding.py,sha256=e1gnFAZBPrkJ3CsiZV-ug6kaPdNTAEROaUFiFrUh71M,4042
-cryptography/hazmat/decrepit/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216
-cryptography/hazmat/decrepit/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216
-cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-37.pyc,,
-cryptography/hazmat/decrepit/ciphers/algorithms.py,sha256=HWA4PKDS2w4D2dQoRerpLRU7Kntt5vJeJC7j--AlZVU,2520
-cryptography/hazmat/primitives/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/primitives/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/_serialization.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/cmac.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/constant_time.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/hashes.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/hmac.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/keywrap.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/padding.cpython-37.pyc,,
-cryptography/hazmat/primitives/__pycache__/poly1305.cpython-37.pyc,,
-cryptography/hazmat/primitives/_asymmetric.py,sha256=RhgcouUB6HTiFDBrR1LxqkMjpUxIiNvQ1r_zJjRG6qQ,532
-cryptography/hazmat/primitives/_cipheralgorithm.py,sha256=gKa0WrLz6K4fqhnGbfBYKDSxgLxsPU0uj_EK2UT47W4,1495
-cryptography/hazmat/primitives/_serialization.py,sha256=qrozc8fw2WZSbjk3DAlSl3ResxpauwJ74ZgGoUL-mj0,5142
-cryptography/hazmat/primitives/asymmetric/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180
-cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-37.pyc,,
-cryptography/hazmat/primitives/asymmetric/dh.py,sha256=OOCjMClH1Bf14Sy7jAdwzEeCxFPb8XUe2qePbExvXwc,3420
-cryptography/hazmat/primitives/asymmetric/dsa.py,sha256=xBwdf0pZOgvqjUKcO7Q0L3NxwalYj0SJDUqThemhSmI,3945
-cryptography/hazmat/primitives/asymmetric/ec.py,sha256=lwZmtAwi3PM8lsY1MsNaby_bVi--49OCxwE_1yqKC-A,10428
-cryptography/hazmat/primitives/asymmetric/ed25519.py,sha256=kl63fg7myuMjNTmMoVFeH6iVr0x5FkjNmggxIRTloJk,3423
-cryptography/hazmat/primitives/asymmetric/ed448.py,sha256=2UzEDzzfkPn83UFVFlMZfIMbAixxY09WmQyrwinWTn8,3456
-cryptography/hazmat/primitives/asymmetric/padding.py,sha256=eZcvUqVLbe3u48SunLdeniaPlV4-k6pwBl67OW4jSy8,2885
-cryptography/hazmat/primitives/asymmetric/rsa.py,sha256=dvj4i2js78qpgotEKn3SU5Eh2unDSMiZpTVo2kx_NWU,7668
-cryptography/hazmat/primitives/asymmetric/types.py,sha256=LnsOJym-wmPUJ7Knu_7bCNU3kIiELCd6krOaW_JU08I,2996
-cryptography/hazmat/primitives/asymmetric/utils.py,sha256=DPTs6T4F-UhwzFQTh-1fSEpQzazH2jf2xpIro3ItF4o,790
-cryptography/hazmat/primitives/asymmetric/x25519.py,sha256=VGYuRdIYuVBtizpFdNWd2bTrT10JRa1admQdBr08xz8,3341
-cryptography/hazmat/primitives/asymmetric/x448.py,sha256=GKKJBqYLr03VewMF18bXIM941aaWcZIQ4rC02GLLEmw,3374
-cryptography/hazmat/primitives/ciphers/__init__.py,sha256=eyEXmjk6_CZXaOPYDr7vAYGXr29QvzgWL2-4CSolLFs,680
-cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-37.pyc,,
-cryptography/hazmat/primitives/ciphers/aead.py,sha256=Fzlyx7w8KYQakzDp1zWgJnIr62zgZrgVh1u2h4exB54,634
-cryptography/hazmat/primitives/ciphers/algorithms.py,sha256=cPzrUizm_RfUi7DDqf3WNezkFy2IxfllsJv6s16bWS8,4493
-cryptography/hazmat/primitives/ciphers/base.py,sha256=tg-XNaKUyETBi7ounGDEL1_ICn-s4FF9LR7moV58blI,4211
-cryptography/hazmat/primitives/ciphers/modes.py,sha256=BFpxEGSaxoeZjrQ4sqpyPDvKClrqfDKIBv7kYtFURhE,8192
-cryptography/hazmat/primitives/cmac.py,sha256=sz_s6H_cYnOvx-VNWdIKhRhe3Ymp8z8J0D3CBqOX3gg,338
-cryptography/hazmat/primitives/constant_time.py,sha256=xdunWT0nf8OvKdcqUhhlFKayGp4_PgVJRU2W1wLSr_A,422
-cryptography/hazmat/primitives/hashes.py,sha256=EvDIJBhj83Z7f-oHbsA0TzZLFSDV_Yv8hQRdM4o8FD0,5091
-cryptography/hazmat/primitives/hmac.py,sha256=RpB3z9z5skirCQrm7zQbtnp9pLMnAjrlTUvKqF5aDDc,423
-cryptography/hazmat/primitives/kdf/__init__.py,sha256=4XibZnrYq4hh5xBjWiIXzaYW6FKx8hPbVaa_cB9zS64,750
-cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/argon2.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/concatkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/kbkdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/scrypt.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/__pycache__/x963kdf.cpython-37.pyc,,
-cryptography/hazmat/primitives/kdf/argon2.py,sha256=UFDNXG0v-rw3DqAQTB1UQAsQC2M5Ejg0k_6OCyhLKus,460
-cryptography/hazmat/primitives/kdf/concatkdf.py,sha256=bcn4NGXse-EsFl7nlU83e5ilop7TSHcX-CJJS107W80,3686
-cryptography/hazmat/primitives/kdf/hkdf.py,sha256=uhN5L87w4JvtAqQcPh_Ji2TPSc18IDThpaYJiHOWy3A,3015
-cryptography/hazmat/primitives/kdf/kbkdf.py,sha256=eSuLK1sATkamgCAit794jLr7sDNlu5X0USdcWhwJdmk,9146
-cryptography/hazmat/primitives/kdf/pbkdf2.py,sha256=Xj3YIeX30h2BUaoJAtOo1RMXV_em0-eCG0PU_0FHJzM,1950
-cryptography/hazmat/primitives/kdf/scrypt.py,sha256=XyWUdUUmhuI9V6TqAPOvujCSMGv1XQdg0a21IWCmO-U,590
-cryptography/hazmat/primitives/kdf/x963kdf.py,sha256=wCpWmwQjZ2vAu2rlk3R_PX0nINl8WGXYBmlyMOC5iPw,1992
-cryptography/hazmat/primitives/keywrap.py,sha256=XV4Pj2fqSeD-RqZVvY2cA3j5_7RwJSFygYuLfk2ujCo,5650
-cryptography/hazmat/primitives/padding.py,sha256=Qu1VVsCiqfQMPPqU0qU6ig9Y802jZlXVOUDLIxN5KeQ,4932
-cryptography/hazmat/primitives/poly1305.py,sha256=P5EPQV-RB_FJPahpg01u0Ts4S_PnAmsroxIGXbGeRRo,355
-cryptography/hazmat/primitives/serialization/__init__.py,sha256=jyNx_7NcOEbVRBY4nP9ks0IVXBafbcYnTK27vafPLW8,1653
-cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/pkcs12.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/pkcs7.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-37.pyc,,
-cryptography/hazmat/primitives/serialization/base.py,sha256=ikq5MJIwp_oUnjiaBco_PmQwOTYuGi-XkYUYHKy8Vo0,615
-cryptography/hazmat/primitives/serialization/pkcs12.py,sha256=7vVXbiP7qhhvKAHJT_M8-LBZdbpOwrpWRHWxNrNqzXE,4492
-cryptography/hazmat/primitives/serialization/pkcs7.py,sha256=n25jEw__vkZWSlumwgYnqJ0lzyPh5xljMsJDyp2QomM,12346
-cryptography/hazmat/primitives/serialization/ssh.py,sha256=VKscMrVdYK5B9PQISjjdRMglRvqa_L3sDNm5vdjVHJY,51915
-cryptography/hazmat/primitives/twofactor/__init__.py,sha256=tmMZGB-g4IU1r7lIFqASU019zr0uPp_wEBYcwdDCKCA,258
-cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-37.pyc,,
-cryptography/hazmat/primitives/twofactor/hotp.py,sha256=rv507uNznUs22XlaqGBbZKkkGjmiTUAcwghTYMem6uM,3219
-cryptography/hazmat/primitives/twofactor/totp.py,sha256=BQ0oPTp2JW1SMZqdgv95NBG3u_ODiDtzVJENHWYhvXY,1613
-cryptography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-cryptography/utils.py,sha256=Rp7ppg4XIBVVzNQ6XngGndwkICJoYp6FoFOOgTWLJ7g,3925
-cryptography/x509/__init__.py,sha256=Q8P-MnUGrgFxRt5423bE-gzSvgZLAdddWuPheHnuA_c,8132
-cryptography/x509/__pycache__/__init__.cpython-37.pyc,,
-cryptography/x509/__pycache__/base.cpython-37.pyc,,
-cryptography/x509/__pycache__/certificate_transparency.cpython-37.pyc,,
-cryptography/x509/__pycache__/extensions.cpython-37.pyc,,
-cryptography/x509/__pycache__/general_name.cpython-37.pyc,,
-cryptography/x509/__pycache__/name.cpython-37.pyc,,
-cryptography/x509/__pycache__/ocsp.cpython-37.pyc,,
-cryptography/x509/__pycache__/oid.cpython-37.pyc,,
-cryptography/x509/__pycache__/verification.cpython-37.pyc,,
-cryptography/x509/base.py,sha256=-F5KWjxbyjSqluUSr7LRC_sqN_s-qHP5K0rW-41PI4E,26909
-cryptography/x509/certificate_transparency.py,sha256=JqoOIDhlwInrYMFW6IFn77WJ0viF-PB_rlZV3vs9MYc,797
-cryptography/x509/extensions.py,sha256=iX-3WFm4yFjstFIs1F30f3tixIp6i0WgGdc6GwJ-QiQ,76158
-cryptography/x509/general_name.py,sha256=sP_rV11Qlpsk4x3XXGJY_Mv0Q_s9dtjeLckHsjpLQoQ,7836
-cryptography/x509/name.py,sha256=MYCxCSTQTpzhjxFPZaANqJ9fGrhESH73vPkoay8HSWM,14830
-cryptography/x509/ocsp.py,sha256=vbrg3p1hBJQEEFIZ35GHcjbGwTrsxPhlot-OVpyP-C8,11390
-cryptography/x509/oid.py,sha256=X8EbhkRTLrGuv9vHZSGqPd9zpvRVsonU_joWAL5LLY8,885
-cryptography/x509/verification.py,sha256=alfx3VaTSb2bMz7_7s788oL90vzgHwBjVINssdz0Gv0,796
-rust/Cargo.toml,sha256=gaBJTn9TwBCG7U3JgETYbTmK8DNUxl4gKKS65nDWuwM,1320
-rust/cryptography-cffi/Cargo.toml,sha256=CjVBJTYW1TwzXgLgY8TZ92NP_9XSmHzSfRIzVaZh9Bk,386
-rust/cryptography-keepalive/Cargo.toml,sha256=_ABt1o-uFnxDqhb7YzNynb6YEQ2eW2QpnPD1RXBUsrI,210
-rust/cryptography-key-parsing/Cargo.toml,sha256=yLWh172kspq6BJVZA2PjFw17Rt0xTYKn_TTzp3IVhxg,455
-rust/cryptography-openssl/Cargo.toml,sha256=mI0cIDv-kQTl24C-bLvDCqiWn6QobBdqCMYSi_UWPE0,545
-rust/cryptography-x509-verification/Cargo.toml,sha256=vECbxPiNu-dQhW4baTuSPzgqaBnBgwZYnJCSaJQbIUA,426
-rust/cryptography-x509/Cargo.toml,sha256=wAuwnc1eKnSUNFjf4GpQM__FTig-hqF2ZPXJPmqb6cA,248
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/REQUESTED b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/REQUESTED
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/WHEEL b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/WHEEL
deleted file mode 100644
index 033540aa5..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/WHEEL
+++ /dev/null
@@ -1,4 +0,0 @@
-Wheel-Version: 1.0
-Generator: maturin (1.7.5)
-Root-Is-Purelib: false
-Tag: cp37-abi3-macosx_10_9_universal2
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE
deleted file mode 100644
index b11f379ef..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE
+++ /dev/null
@@ -1,3 +0,0 @@
-This software is made available under the terms of *either* of the licenses
-found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made
-under the terms of *both* these licenses.
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE
deleted file mode 100644
index 62589edd1..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.APACHE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- https://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD b/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD
deleted file mode 100644
index ec1a29d34..000000000
--- a/resources/python/bin/3.7/mac/cryptography-44.0.3.dist-info/licenses/LICENSE.BSD
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) Individual contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of PyCA Cryptography nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/resources/python/bin/3.7/mac/cryptography/__about__.py b/resources/python/bin/3.7/mac/cryptography/__about__.py
deleted file mode 100644
index 8bbf96e34..000000000
--- a/resources/python/bin/3.7/mac/cryptography/__about__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-__all__ = [
- "__author__",
- "__copyright__",
- "__version__",
-]
-
-__version__ = "44.0.3"
-
-
-__author__ = "The Python Cryptographic Authority and individual contributors"
-__copyright__ = f"Copyright 2013-2024 {__author__}"
diff --git a/resources/python/bin/3.7/mac/cryptography/__init__.py b/resources/python/bin/3.7/mac/cryptography/__init__.py
deleted file mode 100644
index f37370e90..000000000
--- a/resources/python/bin/3.7/mac/cryptography/__init__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import sys
-import warnings
-
-from cryptography import utils
-from cryptography.__about__ import __author__, __copyright__, __version__
-
-__all__ = [
- "__author__",
- "__copyright__",
- "__version__",
-]
-
-if sys.version_info[:2] == (3, 7):
- warnings.warn(
- "Python 3.7 is no longer supported by the Python core team "
- "and support for it is deprecated in cryptography. A future "
- "release of cryptography will remove support for Python 3.7.",
- utils.CryptographyDeprecationWarning,
- stacklevel=2,
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/exceptions.py b/resources/python/bin/3.7/mac/cryptography/exceptions.py
deleted file mode 100644
index fe125ea9a..000000000
--- a/resources/python/bin/3.7/mac/cryptography/exceptions.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.bindings._rust import exceptions as rust_exceptions
-
-if typing.TYPE_CHECKING:
- from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-_Reasons = rust_exceptions._Reasons
-
-
-class UnsupportedAlgorithm(Exception):
- def __init__(self, message: str, reason: _Reasons | None = None) -> None:
- super().__init__(message)
- self._reason = reason
-
-
-class AlreadyFinalized(Exception):
- pass
-
-
-class AlreadyUpdated(Exception):
- pass
-
-
-class NotYetFinalized(Exception):
- pass
-
-
-class InvalidTag(Exception):
- pass
-
-
-class InvalidSignature(Exception):
- pass
-
-
-class InternalError(Exception):
- def __init__(
- self, msg: str, err_code: list[rust_openssl.OpenSSLError]
- ) -> None:
- super().__init__(msg)
- self.err_code = err_code
-
-
-class InvalidKey(Exception):
- pass
diff --git a/resources/python/bin/3.7/mac/cryptography/fernet.py b/resources/python/bin/3.7/mac/cryptography/fernet.py
deleted file mode 100644
index 868ecb277..000000000
--- a/resources/python/bin/3.7/mac/cryptography/fernet.py
+++ /dev/null
@@ -1,223 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import base64
-import binascii
-import os
-import time
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import InvalidSignature
-from cryptography.hazmat.primitives import hashes, padding
-from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
-from cryptography.hazmat.primitives.hmac import HMAC
-
-
-class InvalidToken(Exception):
- pass
-
-
-_MAX_CLOCK_SKEW = 60
-
-
-class Fernet:
- def __init__(
- self,
- key: bytes | str,
- backend: typing.Any = None,
- ) -> None:
- try:
- key = base64.urlsafe_b64decode(key)
- except binascii.Error as exc:
- raise ValueError(
- "Fernet key must be 32 url-safe base64-encoded bytes."
- ) from exc
- if len(key) != 32:
- raise ValueError(
- "Fernet key must be 32 url-safe base64-encoded bytes."
- )
-
- self._signing_key = key[:16]
- self._encryption_key = key[16:]
-
- @classmethod
- def generate_key(cls) -> bytes:
- return base64.urlsafe_b64encode(os.urandom(32))
-
- def encrypt(self, data: bytes) -> bytes:
- return self.encrypt_at_time(data, int(time.time()))
-
- def encrypt_at_time(self, data: bytes, current_time: int) -> bytes:
- iv = os.urandom(16)
- return self._encrypt_from_parts(data, current_time, iv)
-
- def _encrypt_from_parts(
- self, data: bytes, current_time: int, iv: bytes
- ) -> bytes:
- utils._check_bytes("data", data)
-
- padder = padding.PKCS7(algorithms.AES.block_size).padder()
- padded_data = padder.update(data) + padder.finalize()
- encryptor = Cipher(
- algorithms.AES(self._encryption_key),
- modes.CBC(iv),
- ).encryptor()
- ciphertext = encryptor.update(padded_data) + encryptor.finalize()
-
- basic_parts = (
- b"\x80"
- + current_time.to_bytes(length=8, byteorder="big")
- + iv
- + ciphertext
- )
-
- h = HMAC(self._signing_key, hashes.SHA256())
- h.update(basic_parts)
- hmac = h.finalize()
- return base64.urlsafe_b64encode(basic_parts + hmac)
-
- def decrypt(self, token: bytes | str, ttl: int | None = None) -> bytes:
- timestamp, data = Fernet._get_unverified_token_data(token)
- if ttl is None:
- time_info = None
- else:
- time_info = (ttl, int(time.time()))
- return self._decrypt_data(data, timestamp, time_info)
-
- def decrypt_at_time(
- self, token: bytes | str, ttl: int, current_time: int
- ) -> bytes:
- if ttl is None:
- raise ValueError(
- "decrypt_at_time() can only be used with a non-None ttl"
- )
- timestamp, data = Fernet._get_unverified_token_data(token)
- return self._decrypt_data(data, timestamp, (ttl, current_time))
-
- def extract_timestamp(self, token: bytes | str) -> int:
- timestamp, data = Fernet._get_unverified_token_data(token)
- # Verify the token was not tampered with.
- self._verify_signature(data)
- return timestamp
-
- @staticmethod
- def _get_unverified_token_data(token: bytes | str) -> tuple[int, bytes]:
- if not isinstance(token, (str, bytes)):
- raise TypeError("token must be bytes or str")
-
- try:
- data = base64.urlsafe_b64decode(token)
- except (TypeError, binascii.Error):
- raise InvalidToken
-
- if not data or data[0] != 0x80:
- raise InvalidToken
-
- if len(data) < 9:
- raise InvalidToken
-
- timestamp = int.from_bytes(data[1:9], byteorder="big")
- return timestamp, data
-
- def _verify_signature(self, data: bytes) -> None:
- h = HMAC(self._signing_key, hashes.SHA256())
- h.update(data[:-32])
- try:
- h.verify(data[-32:])
- except InvalidSignature:
- raise InvalidToken
-
- def _decrypt_data(
- self,
- data: bytes,
- timestamp: int,
- time_info: tuple[int, int] | None,
- ) -> bytes:
- if time_info is not None:
- ttl, current_time = time_info
- if timestamp + ttl < current_time:
- raise InvalidToken
-
- if current_time + _MAX_CLOCK_SKEW < timestamp:
- raise InvalidToken
-
- self._verify_signature(data)
-
- iv = data[9:25]
- ciphertext = data[25:-32]
- decryptor = Cipher(
- algorithms.AES(self._encryption_key), modes.CBC(iv)
- ).decryptor()
- plaintext_padded = decryptor.update(ciphertext)
- try:
- plaintext_padded += decryptor.finalize()
- except ValueError:
- raise InvalidToken
- unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
-
- unpadded = unpadder.update(plaintext_padded)
- try:
- unpadded += unpadder.finalize()
- except ValueError:
- raise InvalidToken
- return unpadded
-
-
-class MultiFernet:
- def __init__(self, fernets: typing.Iterable[Fernet]):
- fernets = list(fernets)
- if not fernets:
- raise ValueError(
- "MultiFernet requires at least one Fernet instance"
- )
- self._fernets = fernets
-
- def encrypt(self, msg: bytes) -> bytes:
- return self.encrypt_at_time(msg, int(time.time()))
-
- def encrypt_at_time(self, msg: bytes, current_time: int) -> bytes:
- return self._fernets[0].encrypt_at_time(msg, current_time)
-
- def rotate(self, msg: bytes | str) -> bytes:
- timestamp, data = Fernet._get_unverified_token_data(msg)
- for f in self._fernets:
- try:
- p = f._decrypt_data(data, timestamp, None)
- break
- except InvalidToken:
- pass
- else:
- raise InvalidToken
-
- iv = os.urandom(16)
- return self._fernets[0]._encrypt_from_parts(p, timestamp, iv)
-
- def decrypt(self, msg: bytes | str, ttl: int | None = None) -> bytes:
- for f in self._fernets:
- try:
- return f.decrypt(msg, ttl)
- except InvalidToken:
- pass
- raise InvalidToken
-
- def decrypt_at_time(
- self, msg: bytes | str, ttl: int, current_time: int
- ) -> bytes:
- for f in self._fernets:
- try:
- return f.decrypt_at_time(msg, ttl, current_time)
- except InvalidToken:
- pass
- raise InvalidToken
-
- def extract_timestamp(self, msg: bytes | str) -> int:
- for f in self._fernets:
- try:
- return f.extract_timestamp(msg)
- except InvalidToken:
- pass
- raise InvalidToken
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/__init__.py
deleted file mode 100644
index b9f118701..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-"""
-Hazardous Materials
-
-This is a "Hazardous Materials" module. You should ONLY use it if you're
-100% absolutely sure that you know what you're doing because this module
-is full of land mines, dragons, and dinosaurs with laser guns.
-"""
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/_oid.py b/resources/python/bin/3.7/mac/cryptography/hazmat/_oid.py
deleted file mode 100644
index 8bd240d09..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/_oid.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import (
- ObjectIdentifier as ObjectIdentifier,
-)
-from cryptography.hazmat.primitives import hashes
-
-
-class ExtensionOID:
- SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9")
- SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14")
- KEY_USAGE = ObjectIdentifier("2.5.29.15")
- SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17")
- ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18")
- BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19")
- NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30")
- CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31")
- CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32")
- POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33")
- AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35")
- POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36")
- EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37")
- FRESHEST_CRL = ObjectIdentifier("2.5.29.46")
- INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54")
- ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28")
- AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1")
- SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11")
- OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5")
- TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24")
- CRL_NUMBER = ObjectIdentifier("2.5.29.20")
- DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27")
- PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier(
- "1.3.6.1.4.1.11129.2.4.2"
- )
- PRECERT_POISON = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3")
- SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.5")
- MS_CERTIFICATE_TEMPLATE = ObjectIdentifier("1.3.6.1.4.1.311.21.7")
- ADMISSIONS = ObjectIdentifier("1.3.36.8.3.3")
-
-
-class OCSPExtensionOID:
- NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2")
- ACCEPTABLE_RESPONSES = ObjectIdentifier("1.3.6.1.5.5.7.48.1.4")
-
-
-class CRLEntryExtensionOID:
- CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29")
- CRL_REASON = ObjectIdentifier("2.5.29.21")
- INVALIDITY_DATE = ObjectIdentifier("2.5.29.24")
-
-
-class NameOID:
- COMMON_NAME = ObjectIdentifier("2.5.4.3")
- COUNTRY_NAME = ObjectIdentifier("2.5.4.6")
- LOCALITY_NAME = ObjectIdentifier("2.5.4.7")
- STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8")
- STREET_ADDRESS = ObjectIdentifier("2.5.4.9")
- ORGANIZATION_IDENTIFIER = ObjectIdentifier("2.5.4.97")
- ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10")
- ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11")
- SERIAL_NUMBER = ObjectIdentifier("2.5.4.5")
- SURNAME = ObjectIdentifier("2.5.4.4")
- GIVEN_NAME = ObjectIdentifier("2.5.4.42")
- TITLE = ObjectIdentifier("2.5.4.12")
- INITIALS = ObjectIdentifier("2.5.4.43")
- GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44")
- X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45")
- DN_QUALIFIER = ObjectIdentifier("2.5.4.46")
- PSEUDONYM = ObjectIdentifier("2.5.4.65")
- USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1")
- DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25")
- EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1")
- JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3")
- JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1")
- JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier(
- "1.3.6.1.4.1.311.60.2.1.2"
- )
- BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15")
- POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16")
- POSTAL_CODE = ObjectIdentifier("2.5.4.17")
- INN = ObjectIdentifier("1.2.643.3.131.1.1")
- OGRN = ObjectIdentifier("1.2.643.100.1")
- SNILS = ObjectIdentifier("1.2.643.100.3")
- UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")
-
-
-class SignatureAlgorithmOID:
- RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4")
- RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5")
- # This is an alternate OID for RSA with SHA1 that is occasionally seen
- _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29")
- RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14")
- RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11")
- RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12")
- RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13")
- RSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.13")
- RSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.14")
- RSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.15")
- RSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.16")
- RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")
- ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1")
- ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1")
- ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2")
- ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3")
- ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4")
- ECDSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.9")
- ECDSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.10")
- ECDSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.11")
- ECDSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.12")
- DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3")
- DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1")
- DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2")
- DSA_WITH_SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.3.3")
- DSA_WITH_SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.3.4")
- ED25519 = ObjectIdentifier("1.3.101.112")
- ED448 = ObjectIdentifier("1.3.101.113")
- GOSTR3411_94_WITH_3410_2001 = ObjectIdentifier("1.2.643.2.2.3")
- GOSTR3410_2012_WITH_3411_2012_256 = ObjectIdentifier("1.2.643.7.1.1.3.2")
- GOSTR3410_2012_WITH_3411_2012_512 = ObjectIdentifier("1.2.643.7.1.1.3.3")
-
-
-_SIG_OIDS_TO_HASH: dict[ObjectIdentifier, hashes.HashAlgorithm | None] = {
- SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(),
- SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(),
- SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_224: hashes.SHA3_224(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_256: hashes.SHA3_256(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_384: hashes.SHA3_384(),
- SignatureAlgorithmOID.RSA_WITH_SHA3_512: hashes.SHA3_512(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_224: hashes.SHA3_224(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_256: hashes.SHA3_256(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_384: hashes.SHA3_384(),
- SignatureAlgorithmOID.ECDSA_WITH_SHA3_512: hashes.SHA3_512(),
- SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(),
- SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(),
- SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256(),
- SignatureAlgorithmOID.ED25519: None,
- SignatureAlgorithmOID.ED448: None,
- SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: None,
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: None,
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: None,
-}
-
-
-class PublicKeyAlgorithmOID:
- DSA = ObjectIdentifier("1.2.840.10040.4.1")
- EC_PUBLIC_KEY = ObjectIdentifier("1.2.840.10045.2.1")
- RSAES_PKCS1_v1_5 = ObjectIdentifier("1.2.840.113549.1.1.1")
- RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10")
- X25519 = ObjectIdentifier("1.3.101.110")
- X448 = ObjectIdentifier("1.3.101.111")
- ED25519 = ObjectIdentifier("1.3.101.112")
- ED448 = ObjectIdentifier("1.3.101.113")
-
-
-class ExtendedKeyUsageOID:
- SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1")
- CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2")
- CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3")
- EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4")
- TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8")
- OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9")
- ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0")
- SMARTCARD_LOGON = ObjectIdentifier("1.3.6.1.4.1.311.20.2.2")
- KERBEROS_PKINIT_KDC = ObjectIdentifier("1.3.6.1.5.2.3.5")
- IPSEC_IKE = ObjectIdentifier("1.3.6.1.5.5.7.3.17")
- CERTIFICATE_TRANSPARENCY = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.4")
-
-
-class AuthorityInformationAccessOID:
- CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2")
- OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1")
-
-
-class SubjectInformationAccessOID:
- CA_REPOSITORY = ObjectIdentifier("1.3.6.1.5.5.7.48.5")
-
-
-class CertificatePoliciesOID:
- CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1")
- CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2")
- ANY_POLICY = ObjectIdentifier("2.5.29.32.0")
-
-
-class AttributeOID:
- CHALLENGE_PASSWORD = ObjectIdentifier("1.2.840.113549.1.9.7")
- UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2")
-
-
-_OID_NAMES = {
- NameOID.COMMON_NAME: "commonName",
- NameOID.COUNTRY_NAME: "countryName",
- NameOID.LOCALITY_NAME: "localityName",
- NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName",
- NameOID.STREET_ADDRESS: "streetAddress",
- NameOID.ORGANIZATION_NAME: "organizationName",
- NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName",
- NameOID.SERIAL_NUMBER: "serialNumber",
- NameOID.SURNAME: "surname",
- NameOID.GIVEN_NAME: "givenName",
- NameOID.TITLE: "title",
- NameOID.GENERATION_QUALIFIER: "generationQualifier",
- NameOID.X500_UNIQUE_IDENTIFIER: "x500UniqueIdentifier",
- NameOID.DN_QUALIFIER: "dnQualifier",
- NameOID.PSEUDONYM: "pseudonym",
- NameOID.USER_ID: "userID",
- NameOID.DOMAIN_COMPONENT: "domainComponent",
- NameOID.EMAIL_ADDRESS: "emailAddress",
- NameOID.JURISDICTION_COUNTRY_NAME: "jurisdictionCountryName",
- NameOID.JURISDICTION_LOCALITY_NAME: "jurisdictionLocalityName",
- NameOID.JURISDICTION_STATE_OR_PROVINCE_NAME: (
- "jurisdictionStateOrProvinceName"
- ),
- NameOID.BUSINESS_CATEGORY: "businessCategory",
- NameOID.POSTAL_ADDRESS: "postalAddress",
- NameOID.POSTAL_CODE: "postalCode",
- NameOID.INN: "INN",
- NameOID.OGRN: "OGRN",
- NameOID.SNILS: "SNILS",
- NameOID.UNSTRUCTURED_NAME: "unstructuredName",
- SignatureAlgorithmOID.RSA_WITH_MD5: "md5WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA1: "sha1WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA224: "sha224WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA256: "sha256WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA384: "sha384WithRSAEncryption",
- SignatureAlgorithmOID.RSA_WITH_SHA512: "sha512WithRSAEncryption",
- SignatureAlgorithmOID.RSASSA_PSS: "RSASSA-PSS",
- SignatureAlgorithmOID.ECDSA_WITH_SHA1: "ecdsa-with-SHA1",
- SignatureAlgorithmOID.ECDSA_WITH_SHA224: "ecdsa-with-SHA224",
- SignatureAlgorithmOID.ECDSA_WITH_SHA256: "ecdsa-with-SHA256",
- SignatureAlgorithmOID.ECDSA_WITH_SHA384: "ecdsa-with-SHA384",
- SignatureAlgorithmOID.ECDSA_WITH_SHA512: "ecdsa-with-SHA512",
- SignatureAlgorithmOID.DSA_WITH_SHA1: "dsa-with-sha1",
- SignatureAlgorithmOID.DSA_WITH_SHA224: "dsa-with-sha224",
- SignatureAlgorithmOID.DSA_WITH_SHA256: "dsa-with-sha256",
- SignatureAlgorithmOID.ED25519: "ed25519",
- SignatureAlgorithmOID.ED448: "ed448",
- SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: (
- "GOST R 34.11-94 with GOST R 34.10-2001"
- ),
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: (
- "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)"
- ),
- SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: (
- "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)"
- ),
- PublicKeyAlgorithmOID.DSA: "dsaEncryption",
- PublicKeyAlgorithmOID.EC_PUBLIC_KEY: "id-ecPublicKey",
- PublicKeyAlgorithmOID.RSAES_PKCS1_v1_5: "rsaEncryption",
- PublicKeyAlgorithmOID.RSASSA_PSS: "rsassaPss",
- PublicKeyAlgorithmOID.X25519: "X25519",
- PublicKeyAlgorithmOID.X448: "X448",
- ExtendedKeyUsageOID.SERVER_AUTH: "serverAuth",
- ExtendedKeyUsageOID.CLIENT_AUTH: "clientAuth",
- ExtendedKeyUsageOID.CODE_SIGNING: "codeSigning",
- ExtendedKeyUsageOID.EMAIL_PROTECTION: "emailProtection",
- ExtendedKeyUsageOID.TIME_STAMPING: "timeStamping",
- ExtendedKeyUsageOID.OCSP_SIGNING: "OCSPSigning",
- ExtendedKeyUsageOID.SMARTCARD_LOGON: "msSmartcardLogin",
- ExtendedKeyUsageOID.KERBEROS_PKINIT_KDC: "pkInitKDC",
- ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES: "subjectDirectoryAttributes",
- ExtensionOID.SUBJECT_KEY_IDENTIFIER: "subjectKeyIdentifier",
- ExtensionOID.KEY_USAGE: "keyUsage",
- ExtensionOID.SUBJECT_ALTERNATIVE_NAME: "subjectAltName",
- ExtensionOID.ISSUER_ALTERNATIVE_NAME: "issuerAltName",
- ExtensionOID.BASIC_CONSTRAINTS: "basicConstraints",
- ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS: (
- "signedCertificateTimestampList"
- ),
- ExtensionOID.SIGNED_CERTIFICATE_TIMESTAMPS: (
- "signedCertificateTimestampList"
- ),
- ExtensionOID.PRECERT_POISON: "ctPoison",
- ExtensionOID.MS_CERTIFICATE_TEMPLATE: "msCertificateTemplate",
- ExtensionOID.ADMISSIONS: "Admissions",
- CRLEntryExtensionOID.CRL_REASON: "cRLReason",
- CRLEntryExtensionOID.INVALIDITY_DATE: "invalidityDate",
- CRLEntryExtensionOID.CERTIFICATE_ISSUER: "certificateIssuer",
- ExtensionOID.NAME_CONSTRAINTS: "nameConstraints",
- ExtensionOID.CRL_DISTRIBUTION_POINTS: "cRLDistributionPoints",
- ExtensionOID.CERTIFICATE_POLICIES: "certificatePolicies",
- ExtensionOID.POLICY_MAPPINGS: "policyMappings",
- ExtensionOID.AUTHORITY_KEY_IDENTIFIER: "authorityKeyIdentifier",
- ExtensionOID.POLICY_CONSTRAINTS: "policyConstraints",
- ExtensionOID.EXTENDED_KEY_USAGE: "extendedKeyUsage",
- ExtensionOID.FRESHEST_CRL: "freshestCRL",
- ExtensionOID.INHIBIT_ANY_POLICY: "inhibitAnyPolicy",
- ExtensionOID.ISSUING_DISTRIBUTION_POINT: "issuingDistributionPoint",
- ExtensionOID.AUTHORITY_INFORMATION_ACCESS: "authorityInfoAccess",
- ExtensionOID.SUBJECT_INFORMATION_ACCESS: "subjectInfoAccess",
- ExtensionOID.OCSP_NO_CHECK: "OCSPNoCheck",
- ExtensionOID.CRL_NUMBER: "cRLNumber",
- ExtensionOID.DELTA_CRL_INDICATOR: "deltaCRLIndicator",
- ExtensionOID.TLS_FEATURE: "TLSFeature",
- AuthorityInformationAccessOID.OCSP: "OCSP",
- AuthorityInformationAccessOID.CA_ISSUERS: "caIssuers",
- SubjectInformationAccessOID.CA_REPOSITORY: "caRepository",
- CertificatePoliciesOID.CPS_QUALIFIER: "id-qt-cps",
- CertificatePoliciesOID.CPS_USER_NOTICE: "id-qt-unotice",
- OCSPExtensionOID.NONCE: "OCSPNonce",
- AttributeOID.CHALLENGE_PASSWORD: "challengePassword",
-}
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/backends/__init__.py
deleted file mode 100644
index b4400aa03..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from typing import Any
-
-
-def default_backend() -> Any:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- return backend
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/__init__.py
deleted file mode 100644
index 51b04476c..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.backends.openssl.backend import backend
-
-__all__ = ["backend"]
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/backend.py b/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/backend.py
deleted file mode 100644
index 34899d4eb..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/backends/openssl/backend.py
+++ /dev/null
@@ -1,288 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.bindings.openssl import binding
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding
-from cryptography.hazmat.primitives.asymmetric import ec
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-from cryptography.hazmat.primitives.asymmetric.padding import (
- MGF1,
- OAEP,
- PSS,
- PKCS1v15,
-)
-from cryptography.hazmat.primitives.ciphers import (
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers.algorithms import (
- AES,
-)
-from cryptography.hazmat.primitives.ciphers.modes import (
- CBC,
- Mode,
-)
-
-
-class Backend:
- """
- OpenSSL API binding interfaces.
- """
-
- name = "openssl"
-
- # TripleDES encryption is disallowed/deprecated throughout 2023 in
- # FIPS 140-3. To keep it simple we denylist any use of TripleDES (TDEA).
- _fips_ciphers = (AES,)
- # Sometimes SHA1 is still permissible. That logic is contained
- # within the various *_supported methods.
- _fips_hashes = (
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- hashes.SHA512_224,
- hashes.SHA512_256,
- hashes.SHA3_224,
- hashes.SHA3_256,
- hashes.SHA3_384,
- hashes.SHA3_512,
- hashes.SHAKE128,
- hashes.SHAKE256,
- )
- _fips_ecdh_curves = (
- ec.SECP224R1,
- ec.SECP256R1,
- ec.SECP384R1,
- ec.SECP521R1,
- )
- _fips_rsa_min_key_size = 2048
- _fips_rsa_min_public_exponent = 65537
- _fips_dsa_min_modulus = 1 << 2048
- _fips_dh_min_key_size = 2048
- _fips_dh_min_modulus = 1 << _fips_dh_min_key_size
-
- def __init__(self) -> None:
- self._binding = binding.Binding()
- self._ffi = self._binding.ffi
- self._lib = self._binding.lib
- self._fips_enabled = rust_openssl.is_fips_enabled()
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def openssl_assert(self, ok: bool) -> None:
- return binding._openssl_assert(ok)
-
- def _enable_fips(self) -> None:
- # This function enables FIPS mode for OpenSSL 3.0.0 on installs that
- # have the FIPS provider installed properly.
- rust_openssl.enable_fips(rust_openssl._providers)
- assert rust_openssl.is_fips_enabled()
- self._fips_enabled = rust_openssl.is_fips_enabled()
-
- def openssl_version_text(self) -> str:
- """
- Friendly string name of the loaded OpenSSL library. This is not
- necessarily the same version as it was compiled against.
-
- Example: OpenSSL 3.2.1 30 Jan 2024
- """
- return rust_openssl.openssl_version_text()
-
- def openssl_version_number(self) -> int:
- return rust_openssl.openssl_version()
-
- def hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if self._fips_enabled and not isinstance(algorithm, self._fips_hashes):
- return False
-
- return rust_openssl.hashes.hash_supported(algorithm)
-
- def signature_hash_supported(
- self, algorithm: hashes.HashAlgorithm
- ) -> bool:
- # Dedicated check for hashing algorithm use in message digest for
- # signatures, e.g. RSA PKCS#1 v1.5 SHA1 (sha1WithRSAEncryption).
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return False
- return self.hash_supported(algorithm)
-
- def scrypt_supported(self) -> bool:
- if self._fips_enabled:
- return False
- else:
- return hasattr(rust_openssl.kdf.Scrypt, "derive")
-
- def argon2_supported(self) -> bool:
- if self._fips_enabled:
- return False
- else:
- return hasattr(rust_openssl.kdf.Argon2id, "derive")
-
- def hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- # FIPS mode still allows SHA1 for HMAC
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return True
-
- return self.hash_supported(algorithm)
-
- def cipher_supported(self, cipher: CipherAlgorithm, mode: Mode) -> bool:
- if self._fips_enabled:
- # FIPS mode requires AES. TripleDES is disallowed/deprecated in
- # FIPS 140-3.
- if not isinstance(cipher, self._fips_ciphers):
- return False
-
- return rust_openssl.ciphers.cipher_supported(cipher, mode)
-
- def pbkdf2_hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- return self.hmac_supported(algorithm)
-
- def _consume_errors(self) -> list[rust_openssl.OpenSSLError]:
- return rust_openssl.capture_error_stack()
-
- def _oaep_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if self._fips_enabled and isinstance(algorithm, hashes.SHA1):
- return False
-
- return isinstance(
- algorithm,
- (
- hashes.SHA1,
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- ),
- )
-
- def rsa_padding_supported(self, padding: AsymmetricPadding) -> bool:
- if isinstance(padding, PKCS1v15):
- return True
- elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1):
- # FIPS 186-4 only allows salt length == digest length for PSS
- # It is technically acceptable to set an explicit salt length
- # equal to the digest length and this will incorrectly fail, but
- # since we don't do that in the tests and this method is
- # private, we'll ignore that until we need to do otherwise.
- if (
- self._fips_enabled
- and padding._salt_length != PSS.DIGEST_LENGTH
- ):
- return False
- return self.hash_supported(padding._mgf._algorithm)
- elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1):
- return self._oaep_hash_supported(
- padding._mgf._algorithm
- ) and self._oaep_hash_supported(padding._algorithm)
- else:
- return False
-
- def rsa_encryption_supported(self, padding: AsymmetricPadding) -> bool:
- if self._fips_enabled and isinstance(padding, PKCS1v15):
- return False
- else:
- return self.rsa_padding_supported(padding)
-
- def dsa_supported(self) -> bool:
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- and not self._fips_enabled
- )
-
- def dsa_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool:
- if not self.dsa_supported():
- return False
- return self.signature_hash_supported(algorithm)
-
- def cmac_algorithm_supported(self, algorithm) -> bool:
- return self.cipher_supported(
- algorithm, CBC(b"\x00" * algorithm.block_size)
- )
-
- def elliptic_curve_supported(self, curve: ec.EllipticCurve) -> bool:
- if self._fips_enabled and not isinstance(
- curve, self._fips_ecdh_curves
- ):
- return False
-
- return rust_openssl.ec.curve_supported(curve)
-
- def elliptic_curve_signature_algorithm_supported(
- self,
- signature_algorithm: ec.EllipticCurveSignatureAlgorithm,
- curve: ec.EllipticCurve,
- ) -> bool:
- # We only support ECDSA right now.
- if not isinstance(signature_algorithm, ec.ECDSA):
- return False
-
- return self.elliptic_curve_supported(curve) and (
- isinstance(signature_algorithm.algorithm, asym_utils.Prehashed)
- or self.hash_supported(signature_algorithm.algorithm)
- )
-
- def elliptic_curve_exchange_algorithm_supported(
- self, algorithm: ec.ECDH, curve: ec.EllipticCurve
- ) -> bool:
- return self.elliptic_curve_supported(curve) and isinstance(
- algorithm, ec.ECDH
- )
-
- def dh_supported(self) -> bool:
- return not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
-
- def dh_x942_serialization_supported(self) -> bool:
- return self._lib.Cryptography_HAS_EVP_PKEY_DHX == 1
-
- def x25519_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def x448_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL
- and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- )
-
- def ed25519_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def ed448_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return (
- not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL
- and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
- )
-
- def ecdsa_deterministic_supported(self) -> bool:
- return (
- rust_openssl.CRYPTOGRAPHY_OPENSSL_320_OR_GREATER
- and not self._fips_enabled
- )
-
- def poly1305_supported(self) -> bool:
- if self._fips_enabled:
- return False
- return True
-
- def pkcs7_supported(self) -> bool:
- return not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL
-
-
-backend = Backend()
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust.abi3.so b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust.abi3.so
deleted file mode 100755
index ab0c3db9c..000000000
Binary files a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust.abi3.so and /dev/null differ
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/__init__.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/__init__.pyi
deleted file mode 100644
index 30b67d855..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/__init__.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import padding
-
-def check_ansix923_padding(data: bytes) -> bool: ...
-
-class PKCS7PaddingContext(padding.PaddingContext):
- def __init__(self, block_size: int) -> None: ...
- def update(self, data: bytes) -> bytes: ...
- def finalize(self) -> bytes: ...
-
-class PKCS7UnpaddingContext(padding.PaddingContext):
- def __init__(self, block_size: int) -> None: ...
- def update(self, data: bytes) -> bytes: ...
- def finalize(self) -> bytes: ...
-
-class ObjectIdentifier:
- def __init__(self, val: str) -> None: ...
- @property
- def dotted_string(self) -> str: ...
- @property
- def _name(self) -> str: ...
-
-T = typing.TypeVar("T")
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/_openssl.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/_openssl.pyi
deleted file mode 100644
index 80100082a..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/_openssl.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-lib = typing.Any
-ffi = typing.Any
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/asn1.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/asn1.pyi
deleted file mode 100644
index 3b5f208ec..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/asn1.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-def decode_dss_signature(signature: bytes) -> tuple[int, int]: ...
-def encode_dss_signature(r: int, s: int) -> bytes: ...
-def parse_spki_for_data(data: bytes) -> bytes: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/exceptions.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/exceptions.pyi
deleted file mode 100644
index 09f46b1e8..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/exceptions.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class _Reasons:
- BACKEND_MISSING_INTERFACE: _Reasons
- UNSUPPORTED_HASH: _Reasons
- UNSUPPORTED_CIPHER: _Reasons
- UNSUPPORTED_PADDING: _Reasons
- UNSUPPORTED_MGF: _Reasons
- UNSUPPORTED_PUBLIC_KEY_ALGORITHM: _Reasons
- UNSUPPORTED_ELLIPTIC_CURVE: _Reasons
- UNSUPPORTED_SERIALIZATION: _Reasons
- UNSUPPORTED_X509: _Reasons
- UNSUPPORTED_EXCHANGE_ALGORITHM: _Reasons
- UNSUPPORTED_DIFFIE_HELLMAN: _Reasons
- UNSUPPORTED_MAC: _Reasons
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/ocsp.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/ocsp.pyi
deleted file mode 100644
index e4321bec2..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/ocsp.pyi
+++ /dev/null
@@ -1,117 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import datetime
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-from cryptography.x509 import ocsp
-
-class OCSPRequest:
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- @property
- def extensions(self) -> x509.Extensions: ...
-
-class OCSPResponse:
- @property
- def responses(self) -> typing.Iterator[OCSPSingleResponse]: ...
- @property
- def response_status(self) -> ocsp.OCSPResponseStatus: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_response_bytes(self) -> bytes: ...
- @property
- def certificates(self) -> list[x509.Certificate]: ...
- @property
- def responder_key_hash(self) -> bytes | None: ...
- @property
- def responder_name(self) -> x509.Name | None: ...
- @property
- def produced_at(self) -> datetime.datetime: ...
- @property
- def produced_at_utc(self) -> datetime.datetime: ...
- @property
- def certificate_status(self) -> ocsp.OCSPCertStatus: ...
- @property
- def revocation_time(self) -> datetime.datetime | None: ...
- @property
- def revocation_time_utc(self) -> datetime.datetime | None: ...
- @property
- def revocation_reason(self) -> x509.ReasonFlags | None: ...
- @property
- def this_update(self) -> datetime.datetime: ...
- @property
- def this_update_utc(self) -> datetime.datetime: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def single_extensions(self) -> x509.Extensions: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
-
-class OCSPSingleResponse:
- @property
- def certificate_status(self) -> ocsp.OCSPCertStatus: ...
- @property
- def revocation_time(self) -> datetime.datetime | None: ...
- @property
- def revocation_time_utc(self) -> datetime.datetime | None: ...
- @property
- def revocation_reason(self) -> x509.ReasonFlags | None: ...
- @property
- def this_update(self) -> datetime.datetime: ...
- @property
- def this_update_utc(self) -> datetime.datetime: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def issuer_key_hash(self) -> bytes: ...
- @property
- def issuer_name_hash(self) -> bytes: ...
- @property
- def hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def serial_number(self) -> int: ...
-
-def load_der_ocsp_request(data: bytes) -> ocsp.OCSPRequest: ...
-def load_der_ocsp_response(data: bytes) -> ocsp.OCSPResponse: ...
-def create_ocsp_request(
- builder: ocsp.OCSPRequestBuilder,
-) -> ocsp.OCSPRequest: ...
-def create_ocsp_response(
- status: ocsp.OCSPResponseStatus,
- builder: ocsp.OCSPResponseBuilder | None,
- private_key: PrivateKeyTypes | None,
- hash_algorithm: hashes.HashAlgorithm | None,
-) -> ocsp.OCSPResponse: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi
deleted file mode 100644
index 320cef102..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi
+++ /dev/null
@@ -1,72 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.bindings._rust.openssl import (
- aead,
- ciphers,
- cmac,
- dh,
- dsa,
- ec,
- ed448,
- ed25519,
- hashes,
- hmac,
- kdf,
- keys,
- poly1305,
- rsa,
- x448,
- x25519,
-)
-
-__all__ = [
- "aead",
- "ciphers",
- "cmac",
- "dh",
- "dsa",
- "ec",
- "ed448",
- "ed25519",
- "hashes",
- "hmac",
- "kdf",
- "keys",
- "openssl_version",
- "openssl_version_text",
- "poly1305",
- "raise_openssl_error",
- "rsa",
- "x448",
- "x25519",
-]
-
-CRYPTOGRAPHY_IS_LIBRESSL: bool
-CRYPTOGRAPHY_IS_BORINGSSL: bool
-CRYPTOGRAPHY_OPENSSL_300_OR_GREATER: bool
-CRYPTOGRAPHY_OPENSSL_309_OR_GREATER: bool
-CRYPTOGRAPHY_OPENSSL_320_OR_GREATER: bool
-
-class Providers: ...
-
-_legacy_provider_loaded: bool
-_providers: Providers
-
-def openssl_version() -> int: ...
-def openssl_version_text() -> str: ...
-def raise_openssl_error() -> typing.NoReturn: ...
-def capture_error_stack() -> list[OpenSSLError]: ...
-def is_fips_enabled() -> bool: ...
-def enable_fips(providers: Providers) -> None: ...
-
-class OpenSSLError:
- @property
- def lib(self) -> int: ...
- @property
- def reason(self) -> int: ...
- @property
- def reason_text(self) -> bytes: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/aead.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/aead.pyi
deleted file mode 100644
index 047f49d81..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/aead.pyi
+++ /dev/null
@@ -1,103 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class AESGCM:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class ChaCha20Poly1305:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key() -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESCCM:
- def __init__(self, key: bytes, tag_length: int = 16) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESSIV:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- data: bytes,
- associated_data: list[bytes] | None,
- ) -> bytes: ...
- def decrypt(
- self,
- data: bytes,
- associated_data: list[bytes] | None,
- ) -> bytes: ...
-
-class AESOCB3:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
-
-class AESGCMSIV:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_key(key_size: int) -> bytes: ...
- def encrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
- def decrypt(
- self,
- nonce: bytes,
- data: bytes,
- associated_data: bytes | None,
- ) -> bytes: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi
deleted file mode 100644
index 759f3b591..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import ciphers
-from cryptography.hazmat.primitives.ciphers import modes
-
-@typing.overload
-def create_encryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.ModeWithAuthenticationTag
-) -> ciphers.AEADEncryptionContext: ...
-@typing.overload
-def create_encryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> ciphers.CipherContext: ...
-@typing.overload
-def create_decryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.ModeWithAuthenticationTag
-) -> ciphers.AEADDecryptionContext: ...
-@typing.overload
-def create_decryption_ctx(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> ciphers.CipherContext: ...
-def cipher_supported(
- algorithm: ciphers.CipherAlgorithm, mode: modes.Mode
-) -> bool: ...
-def _advance(
- ctx: ciphers.AEADEncryptionContext | ciphers.AEADDecryptionContext, n: int
-) -> None: ...
-def _advance_aad(
- ctx: ciphers.AEADEncryptionContext | ciphers.AEADDecryptionContext, n: int
-) -> None: ...
-
-class CipherContext: ...
-class AEADEncryptionContext: ...
-class AEADDecryptionContext: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi
deleted file mode 100644
index 9c03508bc..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import ciphers
-
-class CMAC:
- def __init__(
- self,
- algorithm: ciphers.BlockCipherAlgorithm,
- backend: typing.Any = None,
- ) -> None: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, signature: bytes) -> None: ...
- def copy(self) -> CMAC: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dh.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dh.pyi
deleted file mode 100644
index 08733d745..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dh.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import dh
-
-MIN_MODULUS_SIZE: int
-
-class DHPrivateKey: ...
-class DHPublicKey: ...
-class DHParameters: ...
-
-class DHPrivateNumbers:
- def __init__(self, x: int, public_numbers: DHPublicNumbers) -> None: ...
- def private_key(self, backend: typing.Any = None) -> dh.DHPrivateKey: ...
- @property
- def x(self) -> int: ...
- @property
- def public_numbers(self) -> DHPublicNumbers: ...
-
-class DHPublicNumbers:
- def __init__(
- self, y: int, parameter_numbers: DHParameterNumbers
- ) -> None: ...
- def public_key(self, backend: typing.Any = None) -> dh.DHPublicKey: ...
- @property
- def y(self) -> int: ...
- @property
- def parameter_numbers(self) -> DHParameterNumbers: ...
-
-class DHParameterNumbers:
- def __init__(self, p: int, g: int, q: int | None = None) -> None: ...
- def parameters(self, backend: typing.Any = None) -> dh.DHParameters: ...
- @property
- def p(self) -> int: ...
- @property
- def g(self) -> int: ...
- @property
- def q(self) -> int | None: ...
-
-def generate_parameters(
- generator: int, key_size: int, backend: typing.Any = None
-) -> dh.DHParameters: ...
-def from_pem_parameters(
- data: bytes, backend: typing.Any = None
-) -> dh.DHParameters: ...
-def from_der_parameters(
- data: bytes, backend: typing.Any = None
-) -> dh.DHParameters: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi
deleted file mode 100644
index 0922a4c40..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import dsa
-
-class DSAPrivateKey: ...
-class DSAPublicKey: ...
-class DSAParameters: ...
-
-class DSAPrivateNumbers:
- def __init__(self, x: int, public_numbers: DSAPublicNumbers) -> None: ...
- @property
- def x(self) -> int: ...
- @property
- def public_numbers(self) -> DSAPublicNumbers: ...
- def private_key(self, backend: typing.Any = None) -> dsa.DSAPrivateKey: ...
-
-class DSAPublicNumbers:
- def __init__(
- self, y: int, parameter_numbers: DSAParameterNumbers
- ) -> None: ...
- @property
- def y(self) -> int: ...
- @property
- def parameter_numbers(self) -> DSAParameterNumbers: ...
- def public_key(self, backend: typing.Any = None) -> dsa.DSAPublicKey: ...
-
-class DSAParameterNumbers:
- def __init__(self, p: int, q: int, g: int) -> None: ...
- @property
- def p(self) -> int: ...
- @property
- def q(self) -> int: ...
- @property
- def g(self) -> int: ...
- def parameters(self, backend: typing.Any = None) -> dsa.DSAParameters: ...
-
-def generate_parameters(key_size: int) -> dsa.DSAParameters: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ec.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ec.pyi
deleted file mode 100644
index 5c3b7bf6e..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ec.pyi
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import ec
-
-class ECPrivateKey: ...
-class ECPublicKey: ...
-
-class EllipticCurvePrivateNumbers:
- def __init__(
- self, private_value: int, public_numbers: EllipticCurvePublicNumbers
- ) -> None: ...
- def private_key(
- self, backend: typing.Any = None
- ) -> ec.EllipticCurvePrivateKey: ...
- @property
- def private_value(self) -> int: ...
- @property
- def public_numbers(self) -> EllipticCurvePublicNumbers: ...
-
-class EllipticCurvePublicNumbers:
- def __init__(self, x: int, y: int, curve: ec.EllipticCurve) -> None: ...
- def public_key(
- self, backend: typing.Any = None
- ) -> ec.EllipticCurvePublicKey: ...
- @property
- def x(self) -> int: ...
- @property
- def y(self) -> int: ...
- @property
- def curve(self) -> ec.EllipticCurve: ...
- def __eq__(self, other: object) -> bool: ...
-
-def curve_supported(curve: ec.EllipticCurve) -> bool: ...
-def generate_private_key(
- curve: ec.EllipticCurve, backend: typing.Any = None
-) -> ec.EllipticCurvePrivateKey: ...
-def from_private_numbers(
- numbers: ec.EllipticCurvePrivateNumbers,
-) -> ec.EllipticCurvePrivateKey: ...
-def from_public_numbers(
- numbers: ec.EllipticCurvePublicNumbers,
-) -> ec.EllipticCurvePublicKey: ...
-def from_public_bytes(
- curve: ec.EllipticCurve, data: bytes
-) -> ec.EllipticCurvePublicKey: ...
-def derive_private_key(
- private_value: int, curve: ec.EllipticCurve
-) -> ec.EllipticCurvePrivateKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi
deleted file mode 100644
index 5233f9a1d..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import ed25519
-
-class Ed25519PrivateKey: ...
-class Ed25519PublicKey: ...
-
-def generate_key() -> ed25519.Ed25519PrivateKey: ...
-def from_private_bytes(data: bytes) -> ed25519.Ed25519PrivateKey: ...
-def from_public_bytes(data: bytes) -> ed25519.Ed25519PublicKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi
deleted file mode 100644
index 7a0652038..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import ed448
-
-class Ed448PrivateKey: ...
-class Ed448PublicKey: ...
-
-def generate_key() -> ed448.Ed448PrivateKey: ...
-def from_private_bytes(data: bytes) -> ed448.Ed448PrivateKey: ...
-def from_public_bytes(data: bytes) -> ed448.Ed448PublicKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi
deleted file mode 100644
index 56f317001..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import hashes
-
-class Hash(hashes.HashContext):
- def __init__(
- self, algorithm: hashes.HashAlgorithm, backend: typing.Any = None
- ) -> None: ...
- @property
- def algorithm(self) -> hashes.HashAlgorithm: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def copy(self) -> Hash: ...
-
-def hash_supported(algorithm: hashes.HashAlgorithm) -> bool: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi
deleted file mode 100644
index e38d9b54d..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives import hashes
-
-class HMAC(hashes.HashContext):
- def __init__(
- self,
- key: bytes,
- algorithm: hashes.HashAlgorithm,
- backend: typing.Any = None,
- ) -> None: ...
- @property
- def algorithm(self) -> hashes.HashAlgorithm: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, signature: bytes) -> None: ...
- def copy(self) -> HMAC: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi
deleted file mode 100644
index 4b90bb4f7..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.hashes import HashAlgorithm
-
-def derive_pbkdf2_hmac(
- key_material: bytes,
- algorithm: HashAlgorithm,
- salt: bytes,
- iterations: int,
- length: int,
-) -> bytes: ...
-
-class Scrypt:
- def __init__(
- self,
- salt: bytes,
- length: int,
- n: int,
- r: int,
- p: int,
- backend: typing.Any = None,
- ) -> None: ...
- def derive(self, key_material: bytes) -> bytes: ...
- def verify(self, key_material: bytes, expected_key: bytes) -> None: ...
-
-class Argon2id:
- def __init__(
- self,
- *,
- salt: bytes,
- length: int,
- iterations: int,
- lanes: int,
- memory_cost: int,
- ad: bytes | None = None,
- secret: bytes | None = None,
- ) -> None: ...
- def derive(self, key_material: bytes) -> bytes: ...
- def verify(self, key_material: bytes, expected_key: bytes) -> None: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/keys.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/keys.pyi
deleted file mode 100644
index 6815b7d91..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/keys.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric.types import (
- PrivateKeyTypes,
- PublicKeyTypes,
-)
-
-def load_der_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
-) -> PrivateKeyTypes: ...
-def load_pem_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
-) -> PrivateKeyTypes: ...
-def load_der_public_key(
- data: bytes,
- backend: typing.Any = None,
-) -> PublicKeyTypes: ...
-def load_pem_public_key(
- data: bytes,
- backend: typing.Any = None,
-) -> PublicKeyTypes: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi
deleted file mode 100644
index 2e9b0a9e1..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-class Poly1305:
- def __init__(self, key: bytes) -> None: ...
- @staticmethod
- def generate_tag(key: bytes, data: bytes) -> bytes: ...
- @staticmethod
- def verify_tag(key: bytes, data: bytes, tag: bytes) -> None: ...
- def update(self, data: bytes) -> None: ...
- def finalize(self) -> bytes: ...
- def verify(self, tag: bytes) -> None: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi
deleted file mode 100644
index ef7752ddb..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi
+++ /dev/null
@@ -1,55 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography.hazmat.primitives.asymmetric import rsa
-
-class RSAPrivateKey: ...
-class RSAPublicKey: ...
-
-class RSAPrivateNumbers:
- def __init__(
- self,
- p: int,
- q: int,
- d: int,
- dmp1: int,
- dmq1: int,
- iqmp: int,
- public_numbers: RSAPublicNumbers,
- ) -> None: ...
- @property
- def p(self) -> int: ...
- @property
- def q(self) -> int: ...
- @property
- def d(self) -> int: ...
- @property
- def dmp1(self) -> int: ...
- @property
- def dmq1(self) -> int: ...
- @property
- def iqmp(self) -> int: ...
- @property
- def public_numbers(self) -> RSAPublicNumbers: ...
- def private_key(
- self,
- backend: typing.Any = None,
- *,
- unsafe_skip_rsa_key_validation: bool = False,
- ) -> rsa.RSAPrivateKey: ...
-
-class RSAPublicNumbers:
- def __init__(self, e: int, n: int) -> None: ...
- @property
- def n(self) -> int: ...
- @property
- def e(self) -> int: ...
- def public_key(self, backend: typing.Any = None) -> rsa.RSAPublicKey: ...
-
-def generate_private_key(
- public_exponent: int,
- key_size: int,
-) -> rsa.RSAPrivateKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi
deleted file mode 100644
index da0f3ec58..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import x25519
-
-class X25519PrivateKey: ...
-class X25519PublicKey: ...
-
-def generate_key() -> x25519.X25519PrivateKey: ...
-def from_private_bytes(data: bytes) -> x25519.X25519PrivateKey: ...
-def from_public_bytes(data: bytes) -> x25519.X25519PublicKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x448.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x448.pyi
deleted file mode 100644
index e51cfebe1..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/openssl/x448.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.primitives.asymmetric import x448
-
-class X448PrivateKey: ...
-class X448PublicKey: ...
-
-def generate_key() -> x448.X448PrivateKey: ...
-def from_private_bytes(data: bytes) -> x448.X448PrivateKey: ...
-def from_public_bytes(data: bytes) -> x448.X448PublicKey: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs12.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs12.pyi
deleted file mode 100644
index 40514c462..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs12.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-from cryptography.hazmat.primitives.serialization import (
- KeySerializationEncryption,
-)
-from cryptography.hazmat.primitives.serialization.pkcs12 import (
- PKCS12KeyAndCertificates,
- PKCS12PrivateKeyTypes,
-)
-
-class PKCS12Certificate:
- def __init__(
- self, cert: x509.Certificate, friendly_name: bytes | None
- ) -> None: ...
- @property
- def friendly_name(self) -> bytes | None: ...
- @property
- def certificate(self) -> x509.Certificate: ...
-
-def load_key_and_certificates(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> tuple[
- PrivateKeyTypes | None,
- x509.Certificate | None,
- list[x509.Certificate],
-]: ...
-def load_pkcs12(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> PKCS12KeyAndCertificates: ...
-def serialize_key_and_certificates(
- name: bytes | None,
- key: PKCS12PrivateKeyTypes | None,
- cert: x509.Certificate | None,
- cas: typing.Iterable[x509.Certificate | PKCS12Certificate] | None,
- encryption_algorithm: KeySerializationEncryption,
-) -> bytes: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs7.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs7.pyi
deleted file mode 100644
index f9aa81ea0..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/pkcs7.pyi
+++ /dev/null
@@ -1,49 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives.asymmetric import rsa
-from cryptography.hazmat.primitives.serialization import pkcs7
-
-def serialize_certificates(
- certs: list[x509.Certificate],
- encoding: serialization.Encoding,
-) -> bytes: ...
-def encrypt_and_serialize(
- builder: pkcs7.PKCS7EnvelopeBuilder,
- encoding: serialization.Encoding,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def sign_and_serialize(
- builder: pkcs7.PKCS7SignatureBuilder,
- encoding: serialization.Encoding,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_der(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_pem(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def decrypt_smime(
- data: bytes,
- certificate: x509.Certificate,
- private_key: rsa.RSAPrivateKey,
- options: typing.Iterable[pkcs7.PKCS7Options],
-) -> bytes: ...
-def load_pem_pkcs7_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
-def load_der_pkcs7_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/test_support.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/test_support.pyi
deleted file mode 100644
index ef9f779f2..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/test_support.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography import x509
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives.serialization import pkcs7
-
-class TestCertificate:
- not_after_tag: int
- not_before_tag: int
- issuer_value_tags: list[int]
- subject_value_tags: list[int]
-
-def test_parse_certificate(data: bytes) -> TestCertificate: ...
-def pkcs7_verify(
- encoding: serialization.Encoding,
- sig: bytes,
- msg: bytes | None,
- certs: list[x509.Certificate],
- options: list[pkcs7.PKCS7Options],
-) -> None: ...
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/x509.pyi b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/x509.pyi
deleted file mode 100644
index b494fb61d..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/_rust/x509.pyi
+++ /dev/null
@@ -1,246 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-import datetime
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric.ec import ECDSA
-from cryptography.hazmat.primitives.asymmetric.padding import PSS, PKCS1v15
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPublicKeyTypes,
- CertificatePublicKeyTypes,
- PrivateKeyTypes,
-)
-from cryptography.x509 import certificate_transparency
-
-def load_pem_x509_certificate(
- data: bytes, backend: typing.Any = None
-) -> x509.Certificate: ...
-def load_der_x509_certificate(
- data: bytes, backend: typing.Any = None
-) -> x509.Certificate: ...
-def load_pem_x509_certificates(
- data: bytes,
-) -> list[x509.Certificate]: ...
-def load_pem_x509_crl(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateRevocationList: ...
-def load_der_x509_crl(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateRevocationList: ...
-def load_pem_x509_csr(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateSigningRequest: ...
-def load_der_x509_csr(
- data: bytes, backend: typing.Any = None
-) -> x509.CertificateSigningRequest: ...
-def encode_name_bytes(name: x509.Name) -> bytes: ...
-def encode_extension_value(extension: x509.ExtensionType) -> bytes: ...
-def create_x509_certificate(
- builder: x509.CertificateBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.Certificate: ...
-def create_x509_csr(
- builder: x509.CertificateSigningRequestBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.CertificateSigningRequest: ...
-def create_x509_crl(
- builder: x509.CertificateRevocationListBuilder,
- private_key: PrivateKeyTypes,
- hash_algorithm: hashes.HashAlgorithm | None,
- rsa_padding: PKCS1v15 | PSS | None,
-) -> x509.CertificateRevocationList: ...
-
-class Sct:
- @property
- def version(self) -> certificate_transparency.Version: ...
- @property
- def log_id(self) -> bytes: ...
- @property
- def timestamp(self) -> datetime.datetime: ...
- @property
- def entry_type(self) -> certificate_transparency.LogEntryType: ...
- @property
- def signature_hash_algorithm(self) -> hashes.HashAlgorithm: ...
- @property
- def signature_algorithm(
- self,
- ) -> certificate_transparency.SignatureAlgorithm: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def extension_bytes(self) -> bytes: ...
-
-class Certificate:
- def fingerprint(self, algorithm: hashes.HashAlgorithm) -> bytes: ...
- @property
- def serial_number(self) -> int: ...
- @property
- def version(self) -> x509.Version: ...
- def public_key(self) -> CertificatePublicKeyTypes: ...
- @property
- def public_key_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def not_valid_before(self) -> datetime.datetime: ...
- @property
- def not_valid_before_utc(self) -> datetime.datetime: ...
- @property
- def not_valid_after(self) -> datetime.datetime: ...
- @property
- def not_valid_after_utc(self) -> datetime.datetime: ...
- @property
- def issuer(self) -> x509.Name: ...
- @property
- def subject(self) -> x509.Name: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certificate_bytes(self) -> bytes: ...
- @property
- def tbs_precertificate_bytes(self) -> bytes: ...
- def __eq__(self, other: object) -> bool: ...
- def __hash__(self) -> int: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- def verify_directly_issued_by(self, issuer: Certificate) -> None: ...
-
-class RevokedCertificate: ...
-
-class CertificateRevocationList:
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- def fingerprint(self, algorithm: hashes.HashAlgorithm) -> bytes: ...
- def get_revoked_certificate_by_serial_number(
- self, serial_number: int
- ) -> RevokedCertificate | None: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def issuer(self) -> x509.Name: ...
- @property
- def next_update(self) -> datetime.datetime | None: ...
- @property
- def next_update_utc(self) -> datetime.datetime | None: ...
- @property
- def last_update(self) -> datetime.datetime: ...
- @property
- def last_update_utc(self) -> datetime.datetime: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certlist_bytes(self) -> bytes: ...
- def __eq__(self, other: object) -> bool: ...
- def __len__(self) -> int: ...
- @typing.overload
- def __getitem__(self, idx: int) -> x509.RevokedCertificate: ...
- @typing.overload
- def __getitem__(self, idx: slice) -> list[x509.RevokedCertificate]: ...
- def __iter__(self) -> typing.Iterator[x509.RevokedCertificate]: ...
- def is_signature_valid(
- self, public_key: CertificateIssuerPublicKeyTypes
- ) -> bool: ...
-
-class CertificateSigningRequest:
- def __eq__(self, other: object) -> bool: ...
- def __hash__(self) -> int: ...
- def public_key(self) -> CertificatePublicKeyTypes: ...
- @property
- def subject(self) -> x509.Name: ...
- @property
- def signature_hash_algorithm(
- self,
- ) -> hashes.HashAlgorithm | None: ...
- @property
- def signature_algorithm_oid(self) -> x509.ObjectIdentifier: ...
- @property
- def signature_algorithm_parameters(
- self,
- ) -> None | PSS | PKCS1v15 | ECDSA: ...
- @property
- def extensions(self) -> x509.Extensions: ...
- @property
- def attributes(self) -> x509.Attributes: ...
- def public_bytes(self, encoding: serialization.Encoding) -> bytes: ...
- @property
- def signature(self) -> bytes: ...
- @property
- def tbs_certrequest_bytes(self) -> bytes: ...
- @property
- def is_signature_valid(self) -> bool: ...
- def get_attribute_for_oid(self, oid: x509.ObjectIdentifier) -> bytes: ...
-
-class PolicyBuilder:
- def time(self, new_time: datetime.datetime) -> PolicyBuilder: ...
- def store(self, new_store: Store) -> PolicyBuilder: ...
- def max_chain_depth(self, new_max_chain_depth: int) -> PolicyBuilder: ...
- def build_client_verifier(self) -> ClientVerifier: ...
- def build_server_verifier(
- self, subject: x509.verification.Subject
- ) -> ServerVerifier: ...
-
-class VerifiedClient:
- @property
- def subjects(self) -> list[x509.GeneralName] | None: ...
- @property
- def chain(self) -> list[x509.Certificate]: ...
-
-class ClientVerifier:
- @property
- def validation_time(self) -> datetime.datetime: ...
- @property
- def store(self) -> Store: ...
- @property
- def max_chain_depth(self) -> int: ...
- def verify(
- self,
- leaf: x509.Certificate,
- intermediates: list[x509.Certificate],
- ) -> VerifiedClient: ...
-
-class ServerVerifier:
- @property
- def subject(self) -> x509.verification.Subject: ...
- @property
- def validation_time(self) -> datetime.datetime: ...
- @property
- def store(self) -> Store: ...
- @property
- def max_chain_depth(self) -> int: ...
- def verify(
- self,
- leaf: x509.Certificate,
- intermediates: list[x509.Certificate],
- ) -> list[x509.Certificate]: ...
-
-class Store:
- def __init__(self, certs: list[x509.Certificate]) -> None: ...
-
-class VerificationError(Exception):
- pass
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/_conditional.py b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/_conditional.py
deleted file mode 100644
index 73c06f7d0..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/_conditional.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-
-def cryptography_has_set_cert_cb() -> list[str]:
- return [
- "SSL_CTX_set_cert_cb",
- "SSL_set_cert_cb",
- ]
-
-
-def cryptography_has_ssl_st() -> list[str]:
- return [
- "SSL_ST_BEFORE",
- "SSL_ST_OK",
- "SSL_ST_INIT",
- "SSL_ST_RENEGOTIATE",
- ]
-
-
-def cryptography_has_tls_st() -> list[str]:
- return [
- "TLS_ST_BEFORE",
- "TLS_ST_OK",
- ]
-
-
-def cryptography_has_ssl_sigalgs() -> list[str]:
- return [
- "SSL_CTX_set1_sigalgs_list",
- ]
-
-
-def cryptography_has_psk() -> list[str]:
- return [
- "SSL_CTX_use_psk_identity_hint",
- "SSL_CTX_set_psk_server_callback",
- "SSL_CTX_set_psk_client_callback",
- ]
-
-
-def cryptography_has_psk_tlsv13() -> list[str]:
- return [
- "SSL_CTX_set_psk_find_session_callback",
- "SSL_CTX_set_psk_use_session_callback",
- "Cryptography_SSL_SESSION_new",
- "SSL_CIPHER_find",
- "SSL_SESSION_set1_master_key",
- "SSL_SESSION_set_cipher",
- "SSL_SESSION_set_protocol_version",
- ]
-
-
-def cryptography_has_custom_ext() -> list[str]:
- return [
- "SSL_CTX_add_client_custom_ext",
- "SSL_CTX_add_server_custom_ext",
- "SSL_extension_supported",
- ]
-
-
-def cryptography_has_tlsv13_functions() -> list[str]:
- return [
- "SSL_VERIFY_POST_HANDSHAKE",
- "SSL_CTX_set_ciphersuites",
- "SSL_verify_client_post_handshake",
- "SSL_CTX_set_post_handshake_auth",
- "SSL_set_post_handshake_auth",
- "SSL_SESSION_get_max_early_data",
- "SSL_write_early_data",
- "SSL_read_early_data",
- "SSL_CTX_set_max_early_data",
- ]
-
-
-def cryptography_has_engine() -> list[str]:
- return [
- "ENGINE_by_id",
- "ENGINE_init",
- "ENGINE_finish",
- "ENGINE_get_default_RAND",
- "ENGINE_set_default_RAND",
- "ENGINE_unregister_RAND",
- "ENGINE_ctrl_cmd",
- "ENGINE_free",
- "ENGINE_get_name",
- "ENGINE_ctrl_cmd_string",
- "ENGINE_load_builtin_engines",
- "ENGINE_load_private_key",
- "ENGINE_load_public_key",
- "SSL_CTX_set_client_cert_engine",
- ]
-
-
-def cryptography_has_verified_chain() -> list[str]:
- return [
- "SSL_get0_verified_chain",
- ]
-
-
-def cryptography_has_srtp() -> list[str]:
- return [
- "SSL_CTX_set_tlsext_use_srtp",
- "SSL_set_tlsext_use_srtp",
- "SSL_get_selected_srtp_profile",
- ]
-
-
-def cryptography_has_op_no_renegotiation() -> list[str]:
- return [
- "SSL_OP_NO_RENEGOTIATION",
- ]
-
-
-def cryptography_has_dtls_get_data_mtu() -> list[str]:
- return [
- "DTLS_get_data_mtu",
- ]
-
-
-def cryptography_has_ssl_cookie() -> list[str]:
- return [
- "SSL_OP_COOKIE_EXCHANGE",
- "DTLSv1_listen",
- "SSL_CTX_set_cookie_generate_cb",
- "SSL_CTX_set_cookie_verify_cb",
- ]
-
-
-def cryptography_has_prime_checks() -> list[str]:
- return [
- "BN_prime_checks_for_size",
- ]
-
-
-def cryptography_has_unexpected_eof_while_reading() -> list[str]:
- return ["SSL_R_UNEXPECTED_EOF_WHILE_READING"]
-
-
-def cryptography_has_ssl_op_ignore_unexpected_eof() -> list[str]:
- return [
- "SSL_OP_IGNORE_UNEXPECTED_EOF",
- ]
-
-
-def cryptography_has_get_extms_support() -> list[str]:
- return ["SSL_get_extms_support"]
-
-
-# This is a mapping of
-# {condition: function-returning-names-dependent-on-that-condition} so we can
-# loop over them and delete unsupported names at runtime. It will be removed
-# when cffi supports #if in cdef. We use functions instead of just a dict of
-# lists so we can use coverage to measure which are used.
-CONDITIONAL_NAMES = {
- "Cryptography_HAS_SET_CERT_CB": cryptography_has_set_cert_cb,
- "Cryptography_HAS_SSL_ST": cryptography_has_ssl_st,
- "Cryptography_HAS_TLS_ST": cryptography_has_tls_st,
- "Cryptography_HAS_SIGALGS": cryptography_has_ssl_sigalgs,
- "Cryptography_HAS_PSK": cryptography_has_psk,
- "Cryptography_HAS_PSK_TLSv1_3": cryptography_has_psk_tlsv13,
- "Cryptography_HAS_CUSTOM_EXT": cryptography_has_custom_ext,
- "Cryptography_HAS_TLSv1_3_FUNCTIONS": cryptography_has_tlsv13_functions,
- "Cryptography_HAS_ENGINE": cryptography_has_engine,
- "Cryptography_HAS_VERIFIED_CHAIN": cryptography_has_verified_chain,
- "Cryptography_HAS_SRTP": cryptography_has_srtp,
- "Cryptography_HAS_OP_NO_RENEGOTIATION": (
- cryptography_has_op_no_renegotiation
- ),
- "Cryptography_HAS_DTLS_GET_DATA_MTU": cryptography_has_dtls_get_data_mtu,
- "Cryptography_HAS_SSL_COOKIE": cryptography_has_ssl_cookie,
- "Cryptography_HAS_PRIME_CHECKS": cryptography_has_prime_checks,
- "Cryptography_HAS_UNEXPECTED_EOF_WHILE_READING": (
- cryptography_has_unexpected_eof_while_reading
- ),
- "Cryptography_HAS_SSL_OP_IGNORE_UNEXPECTED_EOF": (
- cryptography_has_ssl_op_ignore_unexpected_eof
- ),
- "Cryptography_HAS_GET_EXTMS_SUPPORT": cryptography_has_get_extms_support,
-}
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/binding.py b/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/binding.py
deleted file mode 100644
index d4dfeef48..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/bindings/openssl/binding.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import os
-import sys
-import threading
-import types
-import typing
-import warnings
-
-import cryptography
-from cryptography.exceptions import InternalError
-from cryptography.hazmat.bindings._rust import _openssl, openssl
-from cryptography.hazmat.bindings.openssl._conditional import CONDITIONAL_NAMES
-
-
-def _openssl_assert(ok: bool) -> None:
- if not ok:
- errors = openssl.capture_error_stack()
-
- raise InternalError(
- "Unknown OpenSSL error. This error is commonly encountered when "
- "another library is not cleaning up the OpenSSL error stack. If "
- "you are using cryptography with another library that uses "
- "OpenSSL try disabling it before reporting a bug. Otherwise "
- "please file an issue at https://github.com/pyca/cryptography/"
- "issues with information on how to reproduce "
- f"this. ({errors!r})",
- errors,
- )
-
-
-def build_conditional_library(
- lib: typing.Any,
- conditional_names: dict[str, typing.Callable[[], list[str]]],
-) -> typing.Any:
- conditional_lib = types.ModuleType("lib")
- conditional_lib._original_lib = lib # type: ignore[attr-defined]
- excluded_names = set()
- for condition, names_cb in conditional_names.items():
- if not getattr(lib, condition):
- excluded_names.update(names_cb())
-
- for attr in dir(lib):
- if attr not in excluded_names:
- setattr(conditional_lib, attr, getattr(lib, attr))
-
- return conditional_lib
-
-
-class Binding:
- """
- OpenSSL API wrapper.
- """
-
- lib: typing.ClassVar = None
- ffi = _openssl.ffi
- _lib_loaded = False
- _init_lock = threading.Lock()
-
- def __init__(self) -> None:
- self._ensure_ffi_initialized()
-
- @classmethod
- def _ensure_ffi_initialized(cls) -> None:
- with cls._init_lock:
- if not cls._lib_loaded:
- cls.lib = build_conditional_library(
- _openssl.lib, CONDITIONAL_NAMES
- )
- cls._lib_loaded = True
-
- @classmethod
- def init_static_locks(cls) -> None:
- cls._ensure_ffi_initialized()
-
-
-def _verify_package_version(version: str) -> None:
- # Occasionally we run into situations where the version of the Python
- # package does not match the version of the shared object that is loaded.
- # This may occur in environments where multiple versions of cryptography
- # are installed and available in the python path. To avoid errors cropping
- # up later this code checks that the currently imported package and the
- # shared object that were loaded have the same version and raise an
- # ImportError if they do not
- so_package_version = _openssl.ffi.string(
- _openssl.lib.CRYPTOGRAPHY_PACKAGE_VERSION
- )
- if version.encode("ascii") != so_package_version:
- raise ImportError(
- "The version of cryptography does not match the loaded "
- "shared object. This can happen if you have multiple copies of "
- "cryptography installed in your Python path. Please try creating "
- "a new virtual environment to resolve this issue. "
- f"Loaded python version: {version}, "
- f"shared object version: {so_package_version}"
- )
-
- _openssl_assert(
- _openssl.lib.OpenSSL_version_num() == openssl.openssl_version(),
- )
-
-
-_verify_package_version(cryptography.__version__)
-
-Binding.init_static_locks()
-
-if (
- sys.platform == "win32"
- and os.environ.get("PROCESSOR_ARCHITEW6432") is not None
-):
- warnings.warn(
- "You are using cryptography on a 32-bit Python on a 64-bit Windows "
- "Operating System. Cryptography will be significantly faster if you "
- "switch to using a 64-bit Python.",
- UserWarning,
- stacklevel=2,
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/__init__.py
deleted file mode 100644
index 41d731863..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/__init__.py
deleted file mode 100644
index 41d731863..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/algorithms.py b/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/algorithms.py
deleted file mode 100644
index a7d4aa3c5..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/decrepit/ciphers/algorithms.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
- _verify_key_size,
-)
-
-
-class ARC4(CipherAlgorithm):
- name = "RC4"
- key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class TripleDES(BlockCipherAlgorithm):
- name = "3DES"
- block_size = 64
- key_sizes = frozenset([64, 128, 192])
-
- def __init__(self, key: bytes):
- if len(key) == 8:
- key += key + key
- elif len(key) == 16:
- key += key[:8]
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class Blowfish(BlockCipherAlgorithm):
- name = "Blowfish"
- block_size = 64
- key_sizes = frozenset(range(32, 449, 8))
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class CAST5(BlockCipherAlgorithm):
- name = "CAST5"
- block_size = 64
- key_sizes = frozenset(range(40, 129, 8))
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class SEED(BlockCipherAlgorithm):
- name = "SEED"
- block_size = 128
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class IDEA(BlockCipherAlgorithm):
- name = "IDEA"
- block_size = 64
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-# This class only allows RC2 with a 128-bit key. No support for
-# effective key bits or other key sizes is provided.
-class RC2(BlockCipherAlgorithm):
- name = "RC2"
- block_size = 64
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_asymmetric.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_asymmetric.py
deleted file mode 100644
index ea55ffdf1..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_asymmetric.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-# This exists to break an import cycle. It is normally accessible from the
-# asymmetric padding module.
-
-
-class AsymmetricPadding(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this padding (e.g. "PSS", "PKCS1").
- """
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_cipheralgorithm.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_cipheralgorithm.py
deleted file mode 100644
index 588a61698..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_cipheralgorithm.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-
-# This exists to break an import cycle. It is normally accessible from the
-# ciphers module.
-
-
-class CipherAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this mode (e.g. "AES", "Camellia").
- """
-
- @property
- @abc.abstractmethod
- def key_sizes(self) -> frozenset[int]:
- """
- Valid key sizes for this algorithm in bits
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The size of the key being used as an integer in bits (e.g. 128, 256).
- """
-
-
-class BlockCipherAlgorithm(CipherAlgorithm):
- key: bytes
-
- @property
- @abc.abstractmethod
- def block_size(self) -> int:
- """
- The size of a block as an integer in bits (e.g. 64, 128).
- """
-
-
-def _verify_key_size(algorithm: CipherAlgorithm, key: bytes) -> bytes:
- # Verify that the key is instance of bytes
- utils._check_byteslike("key", key)
-
- # Verify that the key size matches the expected key size
- if len(key) * 8 not in algorithm.key_sizes:
- raise ValueError(
- f"Invalid key size ({len(key) * 8}) for {algorithm.name}."
- )
- return key
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_serialization.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_serialization.py
deleted file mode 100644
index 461577219..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/_serialization.py
+++ /dev/null
@@ -1,169 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-from cryptography.hazmat.primitives.hashes import HashAlgorithm
-
-# This exists to break an import cycle. These classes are normally accessible
-# from the serialization module.
-
-
-class PBES(utils.Enum):
- PBESv1SHA1And3KeyTripleDESCBC = "PBESv1 using SHA1 and 3-Key TripleDES"
- PBESv2SHA256AndAES256CBC = "PBESv2 using SHA256 PBKDF2 and AES256 CBC"
-
-
-class Encoding(utils.Enum):
- PEM = "PEM"
- DER = "DER"
- OpenSSH = "OpenSSH"
- Raw = "Raw"
- X962 = "ANSI X9.62"
- SMIME = "S/MIME"
-
-
-class PrivateFormat(utils.Enum):
- PKCS8 = "PKCS8"
- TraditionalOpenSSL = "TraditionalOpenSSL"
- Raw = "Raw"
- OpenSSH = "OpenSSH"
- PKCS12 = "PKCS12"
-
- def encryption_builder(self) -> KeySerializationEncryptionBuilder:
- if self not in (PrivateFormat.OpenSSH, PrivateFormat.PKCS12):
- raise ValueError(
- "encryption_builder only supported with PrivateFormat.OpenSSH"
- " and PrivateFormat.PKCS12"
- )
- return KeySerializationEncryptionBuilder(self)
-
-
-class PublicFormat(utils.Enum):
- SubjectPublicKeyInfo = "X.509 subjectPublicKeyInfo with PKCS#1"
- PKCS1 = "Raw PKCS#1"
- OpenSSH = "OpenSSH"
- Raw = "Raw"
- CompressedPoint = "X9.62 Compressed Point"
- UncompressedPoint = "X9.62 Uncompressed Point"
-
-
-class ParameterFormat(utils.Enum):
- PKCS3 = "PKCS3"
-
-
-class KeySerializationEncryption(metaclass=abc.ABCMeta):
- pass
-
-
-class BestAvailableEncryption(KeySerializationEncryption):
- def __init__(self, password: bytes):
- if not isinstance(password, bytes) or len(password) == 0:
- raise ValueError("Password must be 1 or more bytes.")
-
- self.password = password
-
-
-class NoEncryption(KeySerializationEncryption):
- pass
-
-
-class KeySerializationEncryptionBuilder:
- def __init__(
- self,
- format: PrivateFormat,
- *,
- _kdf_rounds: int | None = None,
- _hmac_hash: HashAlgorithm | None = None,
- _key_cert_algorithm: PBES | None = None,
- ) -> None:
- self._format = format
-
- self._kdf_rounds = _kdf_rounds
- self._hmac_hash = _hmac_hash
- self._key_cert_algorithm = _key_cert_algorithm
-
- def kdf_rounds(self, rounds: int) -> KeySerializationEncryptionBuilder:
- if self._kdf_rounds is not None:
- raise ValueError("kdf_rounds already set")
-
- if not isinstance(rounds, int):
- raise TypeError("kdf_rounds must be an integer")
-
- if rounds < 1:
- raise ValueError("kdf_rounds must be a positive integer")
-
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=rounds,
- _hmac_hash=self._hmac_hash,
- _key_cert_algorithm=self._key_cert_algorithm,
- )
-
- def hmac_hash(
- self, algorithm: HashAlgorithm
- ) -> KeySerializationEncryptionBuilder:
- if self._format is not PrivateFormat.PKCS12:
- raise TypeError(
- "hmac_hash only supported with PrivateFormat.PKCS12"
- )
-
- if self._hmac_hash is not None:
- raise ValueError("hmac_hash already set")
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=self._kdf_rounds,
- _hmac_hash=algorithm,
- _key_cert_algorithm=self._key_cert_algorithm,
- )
-
- def key_cert_algorithm(
- self, algorithm: PBES
- ) -> KeySerializationEncryptionBuilder:
- if self._format is not PrivateFormat.PKCS12:
- raise TypeError(
- "key_cert_algorithm only supported with "
- "PrivateFormat.PKCS12"
- )
- if self._key_cert_algorithm is not None:
- raise ValueError("key_cert_algorithm already set")
- return KeySerializationEncryptionBuilder(
- self._format,
- _kdf_rounds=self._kdf_rounds,
- _hmac_hash=self._hmac_hash,
- _key_cert_algorithm=algorithm,
- )
-
- def build(self, password: bytes) -> KeySerializationEncryption:
- if not isinstance(password, bytes) or len(password) == 0:
- raise ValueError("Password must be 1 or more bytes.")
-
- return _KeySerializationEncryption(
- self._format,
- password,
- kdf_rounds=self._kdf_rounds,
- hmac_hash=self._hmac_hash,
- key_cert_algorithm=self._key_cert_algorithm,
- )
-
-
-class _KeySerializationEncryption(KeySerializationEncryption):
- def __init__(
- self,
- format: PrivateFormat,
- password: bytes,
- *,
- kdf_rounds: int | None,
- hmac_hash: HashAlgorithm | None,
- key_cert_algorithm: PBES | None,
- ):
- self._format = format
- self.password = password
-
- self._kdf_rounds = kdf_rounds
- self._hmac_hash = hmac_hash
- self._key_cert_algorithm = key_cert_algorithm
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/__init__.py
deleted file mode 100644
index b50933623..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dh.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dh.py
deleted file mode 100644
index 31c9748a9..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dh.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-generate_parameters = rust_openssl.dh.generate_parameters
-
-
-DHPrivateNumbers = rust_openssl.dh.DHPrivateNumbers
-DHPublicNumbers = rust_openssl.dh.DHPublicNumbers
-DHParameterNumbers = rust_openssl.dh.DHParameterNumbers
-
-
-class DHParameters(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def generate_private_key(self) -> DHPrivateKey:
- """
- Generates and returns a DHPrivateKey.
- """
-
- @abc.abstractmethod
- def parameter_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.ParameterFormat,
- ) -> bytes:
- """
- Returns the parameters serialized as bytes.
- """
-
- @abc.abstractmethod
- def parameter_numbers(self) -> DHParameterNumbers:
- """
- Returns a DHParameterNumbers.
- """
-
-
-DHParametersWithSerialization = DHParameters
-DHParameters.register(rust_openssl.dh.DHParameters)
-
-
-class DHPublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DHParameters:
- """
- The DHParameters object associated with this public key.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> DHPublicNumbers:
- """
- Returns a DHPublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-DHPublicKeyWithSerialization = DHPublicKey
-DHPublicKey.register(rust_openssl.dh.DHPublicKey)
-
-
-class DHPrivateKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> DHPublicKey:
- """
- The DHPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DHParameters:
- """
- The DHParameters object associated with this private key.
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: DHPublicKey) -> bytes:
- """
- Given peer's DHPublicKey, carry out the key exchange and
- return shared key as bytes.
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> DHPrivateNumbers:
- """
- Returns a DHPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-DHPrivateKeyWithSerialization = DHPrivateKey
-DHPrivateKey.register(rust_openssl.dh.DHPrivateKey)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dsa.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dsa.py
deleted file mode 100644
index 6dd34c0e0..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/dsa.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class DSAParameters(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def generate_private_key(self) -> DSAPrivateKey:
- """
- Generates and returns a DSAPrivateKey.
- """
-
- @abc.abstractmethod
- def parameter_numbers(self) -> DSAParameterNumbers:
- """
- Returns a DSAParameterNumbers.
- """
-
-
-DSAParametersWithNumbers = DSAParameters
-DSAParameters.register(rust_openssl.dsa.DSAParameters)
-
-
-class DSAPrivateKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> DSAPublicKey:
- """
- The DSAPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DSAParameters:
- """
- The DSAParameters object associated with this private key.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> bytes:
- """
- Signs the data
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> DSAPrivateNumbers:
- """
- Returns a DSAPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-DSAPrivateKeyWithSerialization = DSAPrivateKey
-DSAPrivateKey.register(rust_openssl.dsa.DSAPrivateKey)
-
-
-class DSAPublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the prime modulus.
- """
-
- @abc.abstractmethod
- def parameters(self) -> DSAParameters:
- """
- The DSAParameters object associated with this public key.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> DSAPublicNumbers:
- """
- Returns a DSAPublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-DSAPublicKeyWithSerialization = DSAPublicKey
-DSAPublicKey.register(rust_openssl.dsa.DSAPublicKey)
-
-DSAPrivateNumbers = rust_openssl.dsa.DSAPrivateNumbers
-DSAPublicNumbers = rust_openssl.dsa.DSAPublicNumbers
-DSAParameterNumbers = rust_openssl.dsa.DSAParameterNumbers
-
-
-def generate_parameters(
- key_size: int, backend: typing.Any = None
-) -> DSAParameters:
- if key_size not in (1024, 2048, 3072, 4096):
- raise ValueError("Key size must be 1024, 2048, 3072, or 4096 bits.")
-
- return rust_openssl.dsa.generate_parameters(key_size)
-
-
-def generate_private_key(
- key_size: int, backend: typing.Any = None
-) -> DSAPrivateKey:
- parameters = generate_parameters(key_size)
- return parameters.generate_private_key()
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ec.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ec.py
deleted file mode 100644
index da1fbea13..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ec.py
+++ /dev/null
@@ -1,403 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat._oid import ObjectIdentifier
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class EllipticCurveOID:
- SECP192R1 = ObjectIdentifier("1.2.840.10045.3.1.1")
- SECP224R1 = ObjectIdentifier("1.3.132.0.33")
- SECP256K1 = ObjectIdentifier("1.3.132.0.10")
- SECP256R1 = ObjectIdentifier("1.2.840.10045.3.1.7")
- SECP384R1 = ObjectIdentifier("1.3.132.0.34")
- SECP521R1 = ObjectIdentifier("1.3.132.0.35")
- BRAINPOOLP256R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.7")
- BRAINPOOLP384R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.11")
- BRAINPOOLP512R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.13")
- SECT163K1 = ObjectIdentifier("1.3.132.0.1")
- SECT163R2 = ObjectIdentifier("1.3.132.0.15")
- SECT233K1 = ObjectIdentifier("1.3.132.0.26")
- SECT233R1 = ObjectIdentifier("1.3.132.0.27")
- SECT283K1 = ObjectIdentifier("1.3.132.0.16")
- SECT283R1 = ObjectIdentifier("1.3.132.0.17")
- SECT409K1 = ObjectIdentifier("1.3.132.0.36")
- SECT409R1 = ObjectIdentifier("1.3.132.0.37")
- SECT571K1 = ObjectIdentifier("1.3.132.0.38")
- SECT571R1 = ObjectIdentifier("1.3.132.0.39")
-
-
-class EllipticCurve(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- The name of the curve. e.g. secp256r1.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
-
-class EllipticCurveSignatureAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def algorithm(
- self,
- ) -> asym_utils.Prehashed | hashes.HashAlgorithm:
- """
- The digest algorithm used with this signature.
- """
-
-
-class EllipticCurvePrivateKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def exchange(
- self, algorithm: ECDH, peer_public_key: EllipticCurvePublicKey
- ) -> bytes:
- """
- Performs a key exchange operation using the provided algorithm with the
- provided peer's public key.
- """
-
- @abc.abstractmethod
- def public_key(self) -> EllipticCurvePublicKey:
- """
- The EllipticCurvePublicKey for this private key.
- """
-
- @property
- @abc.abstractmethod
- def curve(self) -> EllipticCurve:
- """
- The EllipticCurve that this key is on.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- signature_algorithm: EllipticCurveSignatureAlgorithm,
- ) -> bytes:
- """
- Signs the data
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> EllipticCurvePrivateNumbers:
- """
- Returns an EllipticCurvePrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-EllipticCurvePrivateKeyWithSerialization = EllipticCurvePrivateKey
-EllipticCurvePrivateKey.register(rust_openssl.ec.ECPrivateKey)
-
-
-class EllipticCurvePublicKey(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def curve(self) -> EllipticCurve:
- """
- The EllipticCurve that this key is on.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- Bit size of a secret scalar for the curve.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> EllipticCurvePublicNumbers:
- """
- Returns an EllipticCurvePublicNumbers.
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- signature_algorithm: EllipticCurveSignatureAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @classmethod
- def from_encoded_point(
- cls, curve: EllipticCurve, data: bytes
- ) -> EllipticCurvePublicKey:
- utils._check_bytes("data", data)
-
- if len(data) == 0:
- raise ValueError("data must not be an empty byte string")
-
- if data[0] not in [0x02, 0x03, 0x04]:
- raise ValueError("Unsupported elliptic curve point type")
-
- return rust_openssl.ec.from_public_bytes(curve, data)
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-EllipticCurvePublicKeyWithSerialization = EllipticCurvePublicKey
-EllipticCurvePublicKey.register(rust_openssl.ec.ECPublicKey)
-
-EllipticCurvePrivateNumbers = rust_openssl.ec.EllipticCurvePrivateNumbers
-EllipticCurvePublicNumbers = rust_openssl.ec.EllipticCurvePublicNumbers
-
-
-class SECT571R1(EllipticCurve):
- name = "sect571r1"
- key_size = 570
-
-
-class SECT409R1(EllipticCurve):
- name = "sect409r1"
- key_size = 409
-
-
-class SECT283R1(EllipticCurve):
- name = "sect283r1"
- key_size = 283
-
-
-class SECT233R1(EllipticCurve):
- name = "sect233r1"
- key_size = 233
-
-
-class SECT163R2(EllipticCurve):
- name = "sect163r2"
- key_size = 163
-
-
-class SECT571K1(EllipticCurve):
- name = "sect571k1"
- key_size = 571
-
-
-class SECT409K1(EllipticCurve):
- name = "sect409k1"
- key_size = 409
-
-
-class SECT283K1(EllipticCurve):
- name = "sect283k1"
- key_size = 283
-
-
-class SECT233K1(EllipticCurve):
- name = "sect233k1"
- key_size = 233
-
-
-class SECT163K1(EllipticCurve):
- name = "sect163k1"
- key_size = 163
-
-
-class SECP521R1(EllipticCurve):
- name = "secp521r1"
- key_size = 521
-
-
-class SECP384R1(EllipticCurve):
- name = "secp384r1"
- key_size = 384
-
-
-class SECP256R1(EllipticCurve):
- name = "secp256r1"
- key_size = 256
-
-
-class SECP256K1(EllipticCurve):
- name = "secp256k1"
- key_size = 256
-
-
-class SECP224R1(EllipticCurve):
- name = "secp224r1"
- key_size = 224
-
-
-class SECP192R1(EllipticCurve):
- name = "secp192r1"
- key_size = 192
-
-
-class BrainpoolP256R1(EllipticCurve):
- name = "brainpoolP256r1"
- key_size = 256
-
-
-class BrainpoolP384R1(EllipticCurve):
- name = "brainpoolP384r1"
- key_size = 384
-
-
-class BrainpoolP512R1(EllipticCurve):
- name = "brainpoolP512r1"
- key_size = 512
-
-
-_CURVE_TYPES: dict[str, EllipticCurve] = {
- "prime192v1": SECP192R1(),
- "prime256v1": SECP256R1(),
- "secp192r1": SECP192R1(),
- "secp224r1": SECP224R1(),
- "secp256r1": SECP256R1(),
- "secp384r1": SECP384R1(),
- "secp521r1": SECP521R1(),
- "secp256k1": SECP256K1(),
- "sect163k1": SECT163K1(),
- "sect233k1": SECT233K1(),
- "sect283k1": SECT283K1(),
- "sect409k1": SECT409K1(),
- "sect571k1": SECT571K1(),
- "sect163r2": SECT163R2(),
- "sect233r1": SECT233R1(),
- "sect283r1": SECT283R1(),
- "sect409r1": SECT409R1(),
- "sect571r1": SECT571R1(),
- "brainpoolP256r1": BrainpoolP256R1(),
- "brainpoolP384r1": BrainpoolP384R1(),
- "brainpoolP512r1": BrainpoolP512R1(),
-}
-
-
-class ECDSA(EllipticCurveSignatureAlgorithm):
- def __init__(
- self,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- deterministic_signing: bool = False,
- ):
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if (
- deterministic_signing
- and not backend.ecdsa_deterministic_supported()
- ):
- raise UnsupportedAlgorithm(
- "ECDSA with deterministic signature (RFC 6979) is not "
- "supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
- self._algorithm = algorithm
- self._deterministic_signing = deterministic_signing
-
- @property
- def algorithm(
- self,
- ) -> asym_utils.Prehashed | hashes.HashAlgorithm:
- return self._algorithm
-
- @property
- def deterministic_signing(
- self,
- ) -> bool:
- return self._deterministic_signing
-
-
-generate_private_key = rust_openssl.ec.generate_private_key
-
-
-def derive_private_key(
- private_value: int,
- curve: EllipticCurve,
- backend: typing.Any = None,
-) -> EllipticCurvePrivateKey:
- if not isinstance(private_value, int):
- raise TypeError("private_value must be an integer type.")
-
- if private_value <= 0:
- raise ValueError("private_value must be a positive integer.")
-
- return rust_openssl.ec.derive_private_key(private_value, curve)
-
-
-class ECDH:
- pass
-
-
-_OID_TO_CURVE = {
- EllipticCurveOID.SECP192R1: SECP192R1,
- EllipticCurveOID.SECP224R1: SECP224R1,
- EllipticCurveOID.SECP256K1: SECP256K1,
- EllipticCurveOID.SECP256R1: SECP256R1,
- EllipticCurveOID.SECP384R1: SECP384R1,
- EllipticCurveOID.SECP521R1: SECP521R1,
- EllipticCurveOID.BRAINPOOLP256R1: BrainpoolP256R1,
- EllipticCurveOID.BRAINPOOLP384R1: BrainpoolP384R1,
- EllipticCurveOID.BRAINPOOLP512R1: BrainpoolP512R1,
- EllipticCurveOID.SECT163K1: SECT163K1,
- EllipticCurveOID.SECT163R2: SECT163R2,
- EllipticCurveOID.SECT233K1: SECT233K1,
- EllipticCurveOID.SECT233R1: SECT233R1,
- EllipticCurveOID.SECT283K1: SECT283K1,
- EllipticCurveOID.SECT283R1: SECT283R1,
- EllipticCurveOID.SECT409K1: SECT409K1,
- EllipticCurveOID.SECT409R1: SECT409R1,
- EllipticCurveOID.SECT571K1: SECT571K1,
- EllipticCurveOID.SECT571R1: SECT571R1,
-}
-
-
-def get_curve_for_oid(oid: ObjectIdentifier) -> type[EllipticCurve]:
- try:
- return _OID_TO_CURVE[oid]
- except KeyError:
- raise LookupError(
- "The provided object identifier has no matching elliptic "
- "curve class"
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed25519.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed25519.py
deleted file mode 100644
index 3a26185d7..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed25519.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class Ed25519PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> Ed25519PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def verify(self, signature: bytes, data: bytes) -> None:
- """
- Verify the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-Ed25519PublicKey.register(rust_openssl.ed25519.Ed25519PublicKey)
-
-
-class Ed25519PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> Ed25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> Ed25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed25519_supported():
- raise UnsupportedAlgorithm(
- "ed25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed25519.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> Ed25519PublicKey:
- """
- The Ed25519PublicKey derived from the private key.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def sign(self, data: bytes) -> bytes:
- """
- Signs the data.
- """
-
-
-Ed25519PrivateKey.register(rust_openssl.ed25519.Ed25519PrivateKey)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed448.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed448.py
deleted file mode 100644
index 78c82c4a3..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/ed448.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class Ed448PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> Ed448PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def verify(self, signature: bytes, data: bytes) -> None:
- """
- Verify the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-if hasattr(rust_openssl, "ed448"):
- Ed448PublicKey.register(rust_openssl.ed448.Ed448PublicKey)
-
-
-class Ed448PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> Ed448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> Ed448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.ed448_supported():
- raise UnsupportedAlgorithm(
- "ed448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
- )
-
- return rust_openssl.ed448.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> Ed448PublicKey:
- """
- The Ed448PublicKey derived from the private key.
- """
-
- @abc.abstractmethod
- def sign(self, data: bytes) -> bytes:
- """
- Signs the data.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
-
-if hasattr(rust_openssl, "x448"):
- Ed448PrivateKey.register(rust_openssl.ed448.Ed448PrivateKey)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/padding.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/padding.py
deleted file mode 100644
index b4babf44f..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/padding.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives._asymmetric import (
- AsymmetricPadding as AsymmetricPadding,
-)
-from cryptography.hazmat.primitives.asymmetric import rsa
-
-
-class PKCS1v15(AsymmetricPadding):
- name = "EMSA-PKCS1-v1_5"
-
-
-class _MaxLength:
- "Sentinel value for `MAX_LENGTH`."
-
-
-class _Auto:
- "Sentinel value for `AUTO`."
-
-
-class _DigestLength:
- "Sentinel value for `DIGEST_LENGTH`."
-
-
-class PSS(AsymmetricPadding):
- MAX_LENGTH = _MaxLength()
- AUTO = _Auto()
- DIGEST_LENGTH = _DigestLength()
- name = "EMSA-PSS"
- _salt_length: int | _MaxLength | _Auto | _DigestLength
-
- def __init__(
- self,
- mgf: MGF,
- salt_length: int | _MaxLength | _Auto | _DigestLength,
- ) -> None:
- self._mgf = mgf
-
- if not isinstance(
- salt_length, (int, _MaxLength, _Auto, _DigestLength)
- ):
- raise TypeError(
- "salt_length must be an integer, MAX_LENGTH, "
- "DIGEST_LENGTH, or AUTO"
- )
-
- if isinstance(salt_length, int) and salt_length < 0:
- raise ValueError("salt_length must be zero or greater.")
-
- self._salt_length = salt_length
-
- @property
- def mgf(self) -> MGF:
- return self._mgf
-
-
-class OAEP(AsymmetricPadding):
- name = "EME-OAEP"
-
- def __init__(
- self,
- mgf: MGF,
- algorithm: hashes.HashAlgorithm,
- label: bytes | None,
- ):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of hashes.HashAlgorithm.")
-
- self._mgf = mgf
- self._algorithm = algorithm
- self._label = label
-
- @property
- def algorithm(self) -> hashes.HashAlgorithm:
- return self._algorithm
-
- @property
- def mgf(self) -> MGF:
- return self._mgf
-
-
-class MGF(metaclass=abc.ABCMeta):
- _algorithm: hashes.HashAlgorithm
-
-
-class MGF1(MGF):
- MAX_LENGTH = _MaxLength()
-
- def __init__(self, algorithm: hashes.HashAlgorithm):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of hashes.HashAlgorithm.")
-
- self._algorithm = algorithm
-
-
-def calculate_max_pss_salt_length(
- key: rsa.RSAPrivateKey | rsa.RSAPublicKey,
- hash_algorithm: hashes.HashAlgorithm,
-) -> int:
- if not isinstance(key, (rsa.RSAPrivateKey, rsa.RSAPublicKey)):
- raise TypeError("key must be an RSA public or private key")
- # bit length - 1 per RFC 3447
- emlen = (key.key_size + 6) // 8
- salt_length = emlen - hash_algorithm.digest_size - 2
- assert salt_length >= 0
- return salt_length
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/rsa.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/rsa.py
deleted file mode 100644
index 905068e3b..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/rsa.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import random
-import typing
-from math import gcd
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization, hashes
-from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-
-
-class RSAPrivateKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def decrypt(self, ciphertext: bytes, padding: AsymmetricPadding) -> bytes:
- """
- Decrypts the provided ciphertext.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the public modulus.
- """
-
- @abc.abstractmethod
- def public_key(self) -> RSAPublicKey:
- """
- The RSAPublicKey associated with this private key.
- """
-
- @abc.abstractmethod
- def sign(
- self,
- data: bytes,
- padding: AsymmetricPadding,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> bytes:
- """
- Signs the data.
- """
-
- @abc.abstractmethod
- def private_numbers(self) -> RSAPrivateNumbers:
- """
- Returns an RSAPrivateNumbers.
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
-
-RSAPrivateKeyWithSerialization = RSAPrivateKey
-RSAPrivateKey.register(rust_openssl.rsa.RSAPrivateKey)
-
-
-class RSAPublicKey(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def encrypt(self, plaintext: bytes, padding: AsymmetricPadding) -> bytes:
- """
- Encrypts the given plaintext.
- """
-
- @property
- @abc.abstractmethod
- def key_size(self) -> int:
- """
- The bit length of the public modulus.
- """
-
- @abc.abstractmethod
- def public_numbers(self) -> RSAPublicNumbers:
- """
- Returns an RSAPublicNumbers
- """
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- Returns the key serialized as bytes.
- """
-
- @abc.abstractmethod
- def verify(
- self,
- signature: bytes,
- data: bytes,
- padding: AsymmetricPadding,
- algorithm: asym_utils.Prehashed | hashes.HashAlgorithm,
- ) -> None:
- """
- Verifies the signature of the data.
- """
-
- @abc.abstractmethod
- def recover_data_from_signature(
- self,
- signature: bytes,
- padding: AsymmetricPadding,
- algorithm: hashes.HashAlgorithm | None,
- ) -> bytes:
- """
- Recovers the original data from the signature.
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-RSAPublicKeyWithSerialization = RSAPublicKey
-RSAPublicKey.register(rust_openssl.rsa.RSAPublicKey)
-
-RSAPrivateNumbers = rust_openssl.rsa.RSAPrivateNumbers
-RSAPublicNumbers = rust_openssl.rsa.RSAPublicNumbers
-
-
-def generate_private_key(
- public_exponent: int,
- key_size: int,
- backend: typing.Any = None,
-) -> RSAPrivateKey:
- _verify_rsa_parameters(public_exponent, key_size)
- return rust_openssl.rsa.generate_private_key(public_exponent, key_size)
-
-
-def _verify_rsa_parameters(public_exponent: int, key_size: int) -> None:
- if public_exponent not in (3, 65537):
- raise ValueError(
- "public_exponent must be either 3 (for legacy compatibility) or "
- "65537. Almost everyone should choose 65537 here!"
- )
-
- if key_size < 1024:
- raise ValueError("key_size must be at least 1024-bits.")
-
-
-def _modinv(e: int, m: int) -> int:
- """
- Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
- """
- x1, x2 = 1, 0
- a, b = e, m
- while b > 0:
- q, r = divmod(a, b)
- xn = x1 - q * x2
- a, b, x1, x2 = b, r, x2, xn
- return x1 % m
-
-
-def rsa_crt_iqmp(p: int, q: int) -> int:
- """
- Compute the CRT (q ** -1) % p value from RSA primes p and q.
- """
- return _modinv(q, p)
-
-
-def rsa_crt_dmp1(private_exponent: int, p: int) -> int:
- """
- Compute the CRT private_exponent % (p - 1) value from the RSA
- private_exponent (d) and p.
- """
- return private_exponent % (p - 1)
-
-
-def rsa_crt_dmq1(private_exponent: int, q: int) -> int:
- """
- Compute the CRT private_exponent % (q - 1) value from the RSA
- private_exponent (d) and q.
- """
- return private_exponent % (q - 1)
-
-
-def rsa_recover_private_exponent(e: int, p: int, q: int) -> int:
- """
- Compute the RSA private_exponent (d) given the public exponent (e)
- and the RSA primes p and q.
-
- This uses the Carmichael totient function to generate the
- smallest possible working value of the private exponent.
- """
- # This lambda_n is the Carmichael totient function.
- # The original RSA paper uses the Euler totient function
- # here: phi_n = (p - 1) * (q - 1)
- # Either version of the private exponent will work, but the
- # one generated by the older formulation may be larger
- # than necessary. (lambda_n always divides phi_n)
- #
- # TODO: Replace with lcm(p - 1, q - 1) once the minimum
- # supported Python version is >= 3.9.
- lambda_n = (p - 1) * (q - 1) // gcd(p - 1, q - 1)
- return _modinv(e, lambda_n)
-
-
-# Controls the number of iterations rsa_recover_prime_factors will perform
-# to obtain the prime factors.
-_MAX_RECOVERY_ATTEMPTS = 500
-
-
-def rsa_recover_prime_factors(n: int, e: int, d: int) -> tuple[int, int]:
- """
- Compute factors p and q from the private exponent d. We assume that n has
- no more than two factors. This function is adapted from code in PyCrypto.
- """
- # reject invalid values early
- if 17 != pow(17, e * d, n):
- raise ValueError("n, d, e don't match")
- # See 8.2.2(i) in Handbook of Applied Cryptography.
- ktot = d * e - 1
- # The quantity d*e-1 is a multiple of phi(n), even,
- # and can be represented as t*2^s.
- t = ktot
- while t % 2 == 0:
- t = t // 2
- # Cycle through all multiplicative inverses in Zn.
- # The algorithm is non-deterministic, but there is a 50% chance
- # any candidate a leads to successful factoring.
- # See "Digitalized Signatures and Public Key Functions as Intractable
- # as Factorization", M. Rabin, 1979
- spotted = False
- tries = 0
- while not spotted and tries < _MAX_RECOVERY_ATTEMPTS:
- a = random.randint(2, n - 1)
- tries += 1
- k = t
- # Cycle through all values a^{t*2^i}=a^k
- while k < ktot:
- cand = pow(a, k, n)
- # Check if a^k is a non-trivial root of unity (mod n)
- if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1:
- # We have found a number such that (cand-1)(cand+1)=0 (mod n).
- # Either of the terms divides n.
- p = gcd(cand + 1, n)
- spotted = True
- break
- k *= 2
- if not spotted:
- raise ValueError("Unable to compute factors p and q from exponent d.")
- # Found !
- q, r = divmod(n, p)
- assert r == 0
- p, q = sorted((p, q), reverse=True)
- return (p, q)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/types.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/types.py
deleted file mode 100644
index 1fe4eaf51..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/types.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.hazmat.primitives.asymmetric import (
- dh,
- dsa,
- ec,
- ed448,
- ed25519,
- rsa,
- x448,
- x25519,
-)
-
-# Every asymmetric key type
-PublicKeyTypes = typing.Union[
- dh.DHPublicKey,
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
-]
-PUBLIC_KEY_TYPES = PublicKeyTypes
-utils.deprecated(
- PUBLIC_KEY_TYPES,
- __name__,
- "Use PublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="PUBLIC_KEY_TYPES",
-)
-# Every asymmetric key type
-PrivateKeyTypes = typing.Union[
- dh.DHPrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- x25519.X25519PrivateKey,
- x448.X448PrivateKey,
-]
-PRIVATE_KEY_TYPES = PrivateKeyTypes
-utils.deprecated(
- PRIVATE_KEY_TYPES,
- __name__,
- "Use PrivateKeyTypes instead",
- utils.DeprecatedIn40,
- name="PRIVATE_KEY_TYPES",
-)
-# Just the key types we allow to be used for x509 signing. This mirrors
-# the certificate public key types
-CertificateIssuerPrivateKeyTypes = typing.Union[
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
-]
-CERTIFICATE_PRIVATE_KEY_TYPES = CertificateIssuerPrivateKeyTypes
-utils.deprecated(
- CERTIFICATE_PRIVATE_KEY_TYPES,
- __name__,
- "Use CertificateIssuerPrivateKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_PRIVATE_KEY_TYPES",
-)
-# Just the key types we allow to be used for x509 signing. This mirrors
-# the certificate private key types
-CertificateIssuerPublicKeyTypes = typing.Union[
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
-]
-CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES = CertificateIssuerPublicKeyTypes
-utils.deprecated(
- CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES,
- __name__,
- "Use CertificateIssuerPublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES",
-)
-# This type removes DHPublicKey. x448/x25519 can be a public key
-# but cannot be used in signing so they are allowed here.
-CertificatePublicKeyTypes = typing.Union[
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
-]
-CERTIFICATE_PUBLIC_KEY_TYPES = CertificatePublicKeyTypes
-utils.deprecated(
- CERTIFICATE_PUBLIC_KEY_TYPES,
- __name__,
- "Use CertificatePublicKeyTypes instead",
- utils.DeprecatedIn40,
- name="CERTIFICATE_PUBLIC_KEY_TYPES",
-)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/utils.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/utils.py
deleted file mode 100644
index 826b9567b..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/utils.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import asn1
-from cryptography.hazmat.primitives import hashes
-
-decode_dss_signature = asn1.decode_dss_signature
-encode_dss_signature = asn1.encode_dss_signature
-
-
-class Prehashed:
- def __init__(self, algorithm: hashes.HashAlgorithm):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise TypeError("Expected instance of HashAlgorithm.")
-
- self._algorithm = algorithm
- self._digest_size = algorithm.digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x25519.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x25519.py
deleted file mode 100644
index 0cfa36e34..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x25519.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class X25519PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> X25519PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x25519.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-X25519PublicKey.register(rust_openssl.x25519.X25519PublicKey)
-
-
-class X25519PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> X25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
- return rust_openssl.x25519.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> X25519PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x25519_supported():
- raise UnsupportedAlgorithm(
- "X25519 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x25519.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> X25519PublicKey:
- """
- Returns the public key associated with this private key
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: X25519PublicKey) -> bytes:
- """
- Performs a key exchange operation using the provided peer's public key.
- """
-
-
-X25519PrivateKey.register(rust_openssl.x25519.X25519PrivateKey)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x448.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x448.py
deleted file mode 100644
index 86086ab44..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/asymmetric/x448.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import _serialization
-
-
-class X448PublicKey(metaclass=abc.ABCMeta):
- @classmethod
- def from_public_bytes(cls, data: bytes) -> X448PublicKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.from_public_bytes(data)
-
- @abc.abstractmethod
- def public_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PublicFormat,
- ) -> bytes:
- """
- The serialized bytes of the public key.
- """
-
- @abc.abstractmethod
- def public_bytes_raw(self) -> bytes:
- """
- The raw bytes of the public key.
- Equivalent to public_bytes(Raw, Raw).
- """
-
- @abc.abstractmethod
- def __eq__(self, other: object) -> bool:
- """
- Checks equality.
- """
-
-
-if hasattr(rust_openssl, "x448"):
- X448PublicKey.register(rust_openssl.x448.X448PublicKey)
-
-
-class X448PrivateKey(metaclass=abc.ABCMeta):
- @classmethod
- def generate(cls) -> X448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.generate_key()
-
- @classmethod
- def from_private_bytes(cls, data: bytes) -> X448PrivateKey:
- from cryptography.hazmat.backends.openssl.backend import backend
-
- if not backend.x448_supported():
- raise UnsupportedAlgorithm(
- "X448 is not supported by this version of OpenSSL.",
- _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM,
- )
-
- return rust_openssl.x448.from_private_bytes(data)
-
- @abc.abstractmethod
- def public_key(self) -> X448PublicKey:
- """
- Returns the public key associated with this private key
- """
-
- @abc.abstractmethod
- def private_bytes(
- self,
- encoding: _serialization.Encoding,
- format: _serialization.PrivateFormat,
- encryption_algorithm: _serialization.KeySerializationEncryption,
- ) -> bytes:
- """
- The serialized bytes of the private key.
- """
-
- @abc.abstractmethod
- def private_bytes_raw(self) -> bytes:
- """
- The raw bytes of the private key.
- Equivalent to private_bytes(Raw, Raw, NoEncryption()).
- """
-
- @abc.abstractmethod
- def exchange(self, peer_public_key: X448PublicKey) -> bytes:
- """
- Performs a key exchange operation using the provided peer's public key.
- """
-
-
-if hasattr(rust_openssl, "x448"):
- X448PrivateKey.register(rust_openssl.x448.X448PrivateKey)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/__init__.py
deleted file mode 100644
index 10c15d0f5..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers.base import (
- AEADCipherContext,
- AEADDecryptionContext,
- AEADEncryptionContext,
- Cipher,
- CipherContext,
-)
-
-__all__ = [
- "AEADCipherContext",
- "AEADDecryptionContext",
- "AEADEncryptionContext",
- "BlockCipherAlgorithm",
- "Cipher",
- "CipherAlgorithm",
- "CipherContext",
-]
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/aead.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/aead.py
deleted file mode 100644
index c8a582d78..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/aead.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = [
- "AESCCM",
- "AESGCM",
- "AESGCMSIV",
- "AESOCB3",
- "AESSIV",
- "ChaCha20Poly1305",
-]
-
-AESGCM = rust_openssl.aead.AESGCM
-ChaCha20Poly1305 = rust_openssl.aead.ChaCha20Poly1305
-AESCCM = rust_openssl.aead.AESCCM
-AESSIV = rust_openssl.aead.AESSIV
-AESOCB3 = rust_openssl.aead.AESOCB3
-AESGCMSIV = rust_openssl.aead.AESGCMSIV
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/algorithms.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/algorithms.py
deleted file mode 100644
index f9fa8a587..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/algorithms.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography import utils
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- ARC4 as ARC4,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- CAST5 as CAST5,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- IDEA as IDEA,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- SEED as SEED,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- Blowfish as Blowfish,
-)
-from cryptography.hazmat.decrepit.ciphers.algorithms import (
- TripleDES as TripleDES,
-)
-from cryptography.hazmat.primitives._cipheralgorithm import _verify_key_size
-from cryptography.hazmat.primitives.ciphers import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-
-
-class AES(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- # 512 added to support AES-256-XTS, which uses 512-bit keys
- key_sizes = frozenset([128, 192, 256, 512])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class AES128(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- key_sizes = frozenset([128])
- key_size = 128
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
-
-class AES256(BlockCipherAlgorithm):
- name = "AES"
- block_size = 128
- key_sizes = frozenset([256])
- key_size = 256
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
-
-class Camellia(BlockCipherAlgorithm):
- name = "camellia"
- block_size = 128
- key_sizes = frozenset([128, 192, 256])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-utils.deprecated(
- ARC4,
- __name__,
- "ARC4 has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.ARC4 and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.",
- utils.DeprecatedIn43,
- name="ARC4",
-)
-
-
-utils.deprecated(
- TripleDES,
- __name__,
- "TripleDES has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.",
- utils.DeprecatedIn43,
- name="TripleDES",
-)
-
-utils.deprecated(
- Blowfish,
- __name__,
- "Blowfish has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.Blowfish and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="Blowfish",
-)
-
-
-utils.deprecated(
- CAST5,
- __name__,
- "CAST5 has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.CAST5 and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="CAST5",
-)
-
-
-utils.deprecated(
- IDEA,
- __name__,
- "IDEA has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.IDEA and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="IDEA",
-)
-
-
-utils.deprecated(
- SEED,
- __name__,
- "SEED has been moved to "
- "cryptography.hazmat.decrepit.ciphers.algorithms.SEED and "
- "will be removed from "
- "cryptography.hazmat.primitives.ciphers.algorithms in 45.0.0.",
- utils.DeprecatedIn37,
- name="SEED",
-)
-
-
-class ChaCha20(CipherAlgorithm):
- name = "ChaCha20"
- key_sizes = frozenset([256])
-
- def __init__(self, key: bytes, nonce: bytes):
- self.key = _verify_key_size(self, key)
- utils._check_byteslike("nonce", nonce)
-
- if len(nonce) != 16:
- raise ValueError("nonce must be 128-bits (16 bytes)")
-
- self._nonce = nonce
-
- @property
- def nonce(self) -> bytes:
- return self._nonce
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
-
-
-class SM4(BlockCipherAlgorithm):
- name = "SM4"
- block_size = 128
- key_sizes = frozenset([128])
-
- def __init__(self, key: bytes):
- self.key = _verify_key_size(self, key)
-
- @property
- def key_size(self) -> int:
- return len(self.key) * 8
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/base.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/base.py
deleted file mode 100644
index ebfa8052c..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/base.py
+++ /dev/null
@@ -1,145 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives._cipheralgorithm import CipherAlgorithm
-from cryptography.hazmat.primitives.ciphers import modes
-
-
-class CipherContext(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def update(self, data: bytes) -> bytes:
- """
- Processes the provided bytes through the cipher and returns the results
- as bytes.
- """
-
- @abc.abstractmethod
- def update_into(self, data: bytes, buf: bytes) -> int:
- """
- Processes the provided bytes and writes the resulting data into the
- provided buffer. Returns the number of bytes written.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Returns the results of processing the final block as bytes.
- """
-
- @abc.abstractmethod
- def reset_nonce(self, nonce: bytes) -> None:
- """
- Resets the nonce for the cipher context to the provided value.
- Raises an exception if it does not support reset or if the
- provided nonce does not have a valid length.
- """
-
-
-class AEADCipherContext(CipherContext, metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def authenticate_additional_data(self, data: bytes) -> None:
- """
- Authenticates the provided bytes.
- """
-
-
-class AEADDecryptionContext(AEADCipherContext, metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def finalize_with_tag(self, tag: bytes) -> bytes:
- """
- Returns the results of processing the final block as bytes and allows
- delayed passing of the authentication tag.
- """
-
-
-class AEADEncryptionContext(AEADCipherContext, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tag(self) -> bytes:
- """
- Returns tag bytes. This is only available after encryption is
- finalized.
- """
-
-
-Mode = typing.TypeVar(
- "Mode", bound=typing.Optional[modes.Mode], covariant=True
-)
-
-
-class Cipher(typing.Generic[Mode]):
- def __init__(
- self,
- algorithm: CipherAlgorithm,
- mode: Mode,
- backend: typing.Any = None,
- ) -> None:
- if not isinstance(algorithm, CipherAlgorithm):
- raise TypeError("Expected interface of CipherAlgorithm.")
-
- if mode is not None:
- # mypy needs this assert to narrow the type from our generic
- # type. Maybe it won't some time in the future.
- assert isinstance(mode, modes.Mode)
- mode.validate_for_algorithm(algorithm)
-
- self.algorithm = algorithm
- self.mode = mode
-
- @typing.overload
- def encryptor(
- self: Cipher[modes.ModeWithAuthenticationTag],
- ) -> AEADEncryptionContext: ...
-
- @typing.overload
- def encryptor(
- self: _CIPHER_TYPE,
- ) -> CipherContext: ...
-
- def encryptor(self):
- if isinstance(self.mode, modes.ModeWithAuthenticationTag):
- if self.mode.tag is not None:
- raise ValueError(
- "Authentication tag must be None when encrypting."
- )
-
- return rust_openssl.ciphers.create_encryption_ctx(
- self.algorithm, self.mode
- )
-
- @typing.overload
- def decryptor(
- self: Cipher[modes.ModeWithAuthenticationTag],
- ) -> AEADDecryptionContext: ...
-
- @typing.overload
- def decryptor(
- self: _CIPHER_TYPE,
- ) -> CipherContext: ...
-
- def decryptor(self):
- return rust_openssl.ciphers.create_decryption_ctx(
- self.algorithm, self.mode
- )
-
-
-_CIPHER_TYPE = Cipher[
- typing.Union[
- modes.ModeWithNonce,
- modes.ModeWithTweak,
- None,
- modes.ECB,
- modes.ModeWithInitializationVector,
- ]
-]
-
-CipherContext.register(rust_openssl.ciphers.CipherContext)
-AEADEncryptionContext.register(rust_openssl.ciphers.AEADEncryptionContext)
-AEADDecryptionContext.register(rust_openssl.ciphers.AEADDecryptionContext)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/modes.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/modes.py
deleted file mode 100644
index 1dd2cc1e8..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/ciphers/modes.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.primitives._cipheralgorithm import (
- BlockCipherAlgorithm,
- CipherAlgorithm,
-)
-from cryptography.hazmat.primitives.ciphers import algorithms
-
-
-class Mode(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this mode (e.g. "ECB", "CBC").
- """
-
- @abc.abstractmethod
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- """
- Checks that all the necessary invariants of this (mode, algorithm)
- combination are met.
- """
-
-
-class ModeWithInitializationVector(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def initialization_vector(self) -> bytes:
- """
- The value of the initialization vector for this mode as bytes.
- """
-
-
-class ModeWithTweak(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tweak(self) -> bytes:
- """
- The value of the tweak for this mode as bytes.
- """
-
-
-class ModeWithNonce(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def nonce(self) -> bytes:
- """
- The value of the nonce for this mode as bytes.
- """
-
-
-class ModeWithAuthenticationTag(Mode, metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def tag(self) -> bytes | None:
- """
- The value of the tag supplied to the constructor of this mode.
- """
-
-
-def _check_aes_key_length(self: Mode, algorithm: CipherAlgorithm) -> None:
- if algorithm.key_size > 256 and algorithm.name == "AES":
- raise ValueError(
- "Only 128, 192, and 256 bit keys are allowed for this AES mode"
- )
-
-
-def _check_iv_length(
- self: ModeWithInitializationVector, algorithm: BlockCipherAlgorithm
-) -> None:
- iv_len = len(self.initialization_vector)
- if iv_len * 8 != algorithm.block_size:
- raise ValueError(f"Invalid IV size ({iv_len}) for {self.name}.")
-
-
-def _check_nonce_length(
- nonce: bytes, name: str, algorithm: CipherAlgorithm
-) -> None:
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- f"{name} requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- if len(nonce) * 8 != algorithm.block_size:
- raise ValueError(f"Invalid nonce size ({len(nonce)}) for {name}.")
-
-
-def _check_iv_and_key_length(
- self: ModeWithInitializationVector, algorithm: CipherAlgorithm
-) -> None:
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- f"{self} requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- _check_aes_key_length(self, algorithm)
- _check_iv_length(self, algorithm)
-
-
-class CBC(ModeWithInitializationVector):
- name = "CBC"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class XTS(ModeWithTweak):
- name = "XTS"
-
- def __init__(self, tweak: bytes):
- utils._check_byteslike("tweak", tweak)
-
- if len(tweak) != 16:
- raise ValueError("tweak must be 128-bits (16 bytes)")
-
- self._tweak = tweak
-
- @property
- def tweak(self) -> bytes:
- return self._tweak
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- if isinstance(algorithm, (algorithms.AES128, algorithms.AES256)):
- raise TypeError(
- "The AES128 and AES256 classes do not support XTS, please use "
- "the standard AES class instead."
- )
-
- if algorithm.key_size not in (256, 512):
- raise ValueError(
- "The XTS specification requires a 256-bit key for AES-128-XTS"
- " and 512-bit key for AES-256-XTS"
- )
-
-
-class ECB(Mode):
- name = "ECB"
-
- validate_for_algorithm = _check_aes_key_length
-
-
-class OFB(ModeWithInitializationVector):
- name = "OFB"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CFB(ModeWithInitializationVector):
- name = "CFB"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CFB8(ModeWithInitializationVector):
- name = "CFB8"
-
- def __init__(self, initialization_vector: bytes):
- utils._check_byteslike("initialization_vector", initialization_vector)
- self._initialization_vector = initialization_vector
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- validate_for_algorithm = _check_iv_and_key_length
-
-
-class CTR(ModeWithNonce):
- name = "CTR"
-
- def __init__(self, nonce: bytes):
- utils._check_byteslike("nonce", nonce)
- self._nonce = nonce
-
- @property
- def nonce(self) -> bytes:
- return self._nonce
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- _check_aes_key_length(self, algorithm)
- _check_nonce_length(self.nonce, self.name, algorithm)
-
-
-class GCM(ModeWithInitializationVector, ModeWithAuthenticationTag):
- name = "GCM"
- _MAX_ENCRYPTED_BYTES = (2**39 - 256) // 8
- _MAX_AAD_BYTES = (2**64) // 8
-
- def __init__(
- self,
- initialization_vector: bytes,
- tag: bytes | None = None,
- min_tag_length: int = 16,
- ):
- # OpenSSL 3.0.0 constrains GCM IVs to [64, 1024] bits inclusive
- # This is a sane limit anyway so we'll enforce it here.
- utils._check_byteslike("initialization_vector", initialization_vector)
- if len(initialization_vector) < 8 or len(initialization_vector) > 128:
- raise ValueError(
- "initialization_vector must be between 8 and 128 bytes (64 "
- "and 1024 bits)."
- )
- self._initialization_vector = initialization_vector
- if tag is not None:
- utils._check_bytes("tag", tag)
- if min_tag_length < 4:
- raise ValueError("min_tag_length must be >= 4")
- if len(tag) < min_tag_length:
- raise ValueError(
- f"Authentication tag must be {min_tag_length} bytes or "
- "longer."
- )
- self._tag = tag
- self._min_tag_length = min_tag_length
-
- @property
- def tag(self) -> bytes | None:
- return self._tag
-
- @property
- def initialization_vector(self) -> bytes:
- return self._initialization_vector
-
- def validate_for_algorithm(self, algorithm: CipherAlgorithm) -> None:
- _check_aes_key_length(self, algorithm)
- if not isinstance(algorithm, BlockCipherAlgorithm):
- raise UnsupportedAlgorithm(
- "GCM requires a block cipher algorithm",
- _Reasons.UNSUPPORTED_CIPHER,
- )
- block_size_bytes = algorithm.block_size // 8
- if self._tag is not None and len(self._tag) > block_size_bytes:
- raise ValueError(
- f"Authentication tag cannot be more than {block_size_bytes} "
- "bytes."
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/cmac.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/cmac.py
deleted file mode 100644
index 2c67ce220..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/cmac.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = ["CMAC"]
-CMAC = rust_openssl.cmac.CMAC
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/constant_time.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/constant_time.py
deleted file mode 100644
index 3975c7147..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/constant_time.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import hmac
-
-
-def bytes_eq(a: bytes, b: bytes) -> bool:
- if not isinstance(a, bytes) or not isinstance(b, bytes):
- raise TypeError("a and b must be bytes.")
-
- return hmac.compare_digest(a, b)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hashes.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hashes.py
deleted file mode 100644
index b819e3992..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hashes.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = [
- "MD5",
- "SHA1",
- "SHA3_224",
- "SHA3_256",
- "SHA3_384",
- "SHA3_512",
- "SHA224",
- "SHA256",
- "SHA384",
- "SHA512",
- "SHA512_224",
- "SHA512_256",
- "SHAKE128",
- "SHAKE256",
- "SM3",
- "BLAKE2b",
- "BLAKE2s",
- "ExtendableOutputFunction",
- "Hash",
- "HashAlgorithm",
- "HashContext",
-]
-
-
-class HashAlgorithm(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def name(self) -> str:
- """
- A string naming this algorithm (e.g. "sha256", "md5").
- """
-
- @property
- @abc.abstractmethod
- def digest_size(self) -> int:
- """
- The size of the resulting digest in bytes.
- """
-
- @property
- @abc.abstractmethod
- def block_size(self) -> int | None:
- """
- The internal block size of the hash function, or None if the hash
- function does not use blocks internally (e.g. SHA3).
- """
-
-
-class HashContext(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def algorithm(self) -> HashAlgorithm:
- """
- A HashAlgorithm that will be used by this context.
- """
-
- @abc.abstractmethod
- def update(self, data: bytes) -> None:
- """
- Processes the provided bytes through the hash.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Finalizes the hash context and returns the hash digest as bytes.
- """
-
- @abc.abstractmethod
- def copy(self) -> HashContext:
- """
- Return a HashContext that is a copy of the current context.
- """
-
-
-Hash = rust_openssl.hashes.Hash
-HashContext.register(Hash)
-
-
-class ExtendableOutputFunction(metaclass=abc.ABCMeta):
- """
- An interface for extendable output functions.
- """
-
-
-class SHA1(HashAlgorithm):
- name = "sha1"
- digest_size = 20
- block_size = 64
-
-
-class SHA512_224(HashAlgorithm): # noqa: N801
- name = "sha512-224"
- digest_size = 28
- block_size = 128
-
-
-class SHA512_256(HashAlgorithm): # noqa: N801
- name = "sha512-256"
- digest_size = 32
- block_size = 128
-
-
-class SHA224(HashAlgorithm):
- name = "sha224"
- digest_size = 28
- block_size = 64
-
-
-class SHA256(HashAlgorithm):
- name = "sha256"
- digest_size = 32
- block_size = 64
-
-
-class SHA384(HashAlgorithm):
- name = "sha384"
- digest_size = 48
- block_size = 128
-
-
-class SHA512(HashAlgorithm):
- name = "sha512"
- digest_size = 64
- block_size = 128
-
-
-class SHA3_224(HashAlgorithm): # noqa: N801
- name = "sha3-224"
- digest_size = 28
- block_size = None
-
-
-class SHA3_256(HashAlgorithm): # noqa: N801
- name = "sha3-256"
- digest_size = 32
- block_size = None
-
-
-class SHA3_384(HashAlgorithm): # noqa: N801
- name = "sha3-384"
- digest_size = 48
- block_size = None
-
-
-class SHA3_512(HashAlgorithm): # noqa: N801
- name = "sha3-512"
- digest_size = 64
- block_size = None
-
-
-class SHAKE128(HashAlgorithm, ExtendableOutputFunction):
- name = "shake128"
- block_size = None
-
- def __init__(self, digest_size: int):
- if not isinstance(digest_size, int):
- raise TypeError("digest_size must be an integer")
-
- if digest_size < 1:
- raise ValueError("digest_size must be a positive integer")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class SHAKE256(HashAlgorithm, ExtendableOutputFunction):
- name = "shake256"
- block_size = None
-
- def __init__(self, digest_size: int):
- if not isinstance(digest_size, int):
- raise TypeError("digest_size must be an integer")
-
- if digest_size < 1:
- raise ValueError("digest_size must be a positive integer")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class MD5(HashAlgorithm):
- name = "md5"
- digest_size = 16
- block_size = 64
-
-
-class BLAKE2b(HashAlgorithm):
- name = "blake2b"
- _max_digest_size = 64
- _min_digest_size = 1
- block_size = 128
-
- def __init__(self, digest_size: int):
- if digest_size != 64:
- raise ValueError("Digest size must be 64")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class BLAKE2s(HashAlgorithm):
- name = "blake2s"
- block_size = 64
- _max_digest_size = 32
- _min_digest_size = 1
-
- def __init__(self, digest_size: int):
- if digest_size != 32:
- raise ValueError("Digest size must be 32")
-
- self._digest_size = digest_size
-
- @property
- def digest_size(self) -> int:
- return self._digest_size
-
-
-class SM3(HashAlgorithm):
- name = "sm3"
- digest_size = 32
- block_size = 64
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hmac.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hmac.py
deleted file mode 100644
index a9442d59a..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/hmac.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import hashes
-
-__all__ = ["HMAC"]
-
-HMAC = rust_openssl.hmac.HMAC
-hashes.HashContext.register(HMAC)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/__init__.py
deleted file mode 100644
index 79bb459f0..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-
-
-class KeyDerivationFunction(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def derive(self, key_material: bytes) -> bytes:
- """
- Deterministically generates and returns a new key based on the existing
- key material.
- """
-
- @abc.abstractmethod
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- """
- Checks whether the key generated by the key material matches the
- expected derived key. Raises an exception if they do not match.
- """
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/argon2.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/argon2.py
deleted file mode 100644
index 405fc8dff..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/argon2.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-Argon2id = rust_openssl.kdf.Argon2id
-KeyDerivationFunction.register(Argon2id)
-
-__all__ = ["Argon2id"]
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/concatkdf.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/concatkdf.py
deleted file mode 100644
index 96d9d4c0d..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/concatkdf.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes, hmac
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-def _int_to_u32be(n: int) -> bytes:
- return n.to_bytes(length=4, byteorder="big")
-
-
-def _common_args_checks(
- algorithm: hashes.HashAlgorithm,
- length: int,
- otherinfo: bytes | None,
-) -> None:
- max_length = algorithm.digest_size * (2**32 - 1)
- if length > max_length:
- raise ValueError(f"Cannot derive keys larger than {max_length} bits.")
- if otherinfo is not None:
- utils._check_bytes("otherinfo", otherinfo)
-
-
-def _concatkdf_derive(
- key_material: bytes,
- length: int,
- auxfn: typing.Callable[[], hashes.HashContext],
- otherinfo: bytes,
-) -> bytes:
- utils._check_byteslike("key_material", key_material)
- output = [b""]
- outlen = 0
- counter = 1
-
- while length > outlen:
- h = auxfn()
- h.update(_int_to_u32be(counter))
- h.update(key_material)
- h.update(otherinfo)
- output.append(h.finalize())
- outlen += len(output[-1])
- counter += 1
-
- return b"".join(output)[:length]
-
-
-class ConcatKDFHash(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- otherinfo: bytes | None,
- backend: typing.Any = None,
- ):
- _common_args_checks(algorithm, length, otherinfo)
- self._algorithm = algorithm
- self._length = length
- self._otherinfo: bytes = otherinfo if otherinfo is not None else b""
-
- self._used = False
-
- def _hash(self) -> hashes.Hash:
- return hashes.Hash(self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- return _concatkdf_derive(
- key_material, self._length, self._hash, self._otherinfo
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class ConcatKDFHMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes | None,
- otherinfo: bytes | None,
- backend: typing.Any = None,
- ):
- _common_args_checks(algorithm, length, otherinfo)
- self._algorithm = algorithm
- self._length = length
- self._otherinfo: bytes = otherinfo if otherinfo is not None else b""
-
- if algorithm.block_size is None:
- raise TypeError(f"{algorithm.name} is unsupported for ConcatKDF")
-
- if salt is None:
- salt = b"\x00" * algorithm.block_size
- else:
- utils._check_bytes("salt", salt)
-
- self._salt = salt
-
- self._used = False
-
- def _hmac(self) -> hmac.HMAC:
- return hmac.HMAC(self._salt, self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- return _concatkdf_derive(
- key_material, self._length, self._hmac, self._otherinfo
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/hkdf.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/hkdf.py
deleted file mode 100644
index ee562d2f4..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/hkdf.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes, hmac
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class HKDF(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes | None,
- info: bytes | None,
- backend: typing.Any = None,
- ):
- self._algorithm = algorithm
-
- if salt is None:
- salt = b"\x00" * self._algorithm.digest_size
- else:
- utils._check_bytes("salt", salt)
-
- self._salt = salt
-
- self._hkdf_expand = HKDFExpand(self._algorithm, length, info)
-
- def _extract(self, key_material: bytes) -> bytes:
- h = hmac.HMAC(self._salt, self._algorithm)
- h.update(key_material)
- return h.finalize()
-
- def derive(self, key_material: bytes) -> bytes:
- utils._check_byteslike("key_material", key_material)
- return self._hkdf_expand.derive(self._extract(key_material))
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class HKDFExpand(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- info: bytes | None,
- backend: typing.Any = None,
- ):
- self._algorithm = algorithm
-
- max_length = 255 * algorithm.digest_size
-
- if length > max_length:
- raise ValueError(
- f"Cannot derive keys larger than {max_length} octets."
- )
-
- self._length = length
-
- if info is None:
- info = b""
- else:
- utils._check_bytes("info", info)
-
- self._info = info
-
- self._used = False
-
- def _expand(self, key_material: bytes) -> bytes:
- output = [b""]
- counter = 1
-
- while self._algorithm.digest_size * (len(output) - 1) < self._length:
- h = hmac.HMAC(key_material, self._algorithm)
- h.update(output[-1])
- h.update(self._info)
- h.update(bytes([counter]))
- output.append(h.finalize())
- counter += 1
-
- return b"".join(output)[: self._length]
-
- def derive(self, key_material: bytes) -> bytes:
- utils._check_byteslike("key_material", key_material)
- if self._used:
- raise AlreadyFinalized
-
- self._used = True
- return self._expand(key_material)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/kbkdf.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/kbkdf.py
deleted file mode 100644
index 802b484c7..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/kbkdf.py
+++ /dev/null
@@ -1,302 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import (
- AlreadyFinalized,
- InvalidKey,
- UnsupportedAlgorithm,
- _Reasons,
-)
-from cryptography.hazmat.primitives import (
- ciphers,
- cmac,
- constant_time,
- hashes,
- hmac,
-)
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class Mode(utils.Enum):
- CounterMode = "ctr"
-
-
-class CounterLocation(utils.Enum):
- BeforeFixed = "before_fixed"
- AfterFixed = "after_fixed"
- MiddleFixed = "middle_fixed"
-
-
-class _KBKDFDeriver:
- def __init__(
- self,
- prf: typing.Callable,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- break_location: int | None,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- ):
- assert callable(prf)
-
- if not isinstance(mode, Mode):
- raise TypeError("mode must be of type Mode")
-
- if not isinstance(location, CounterLocation):
- raise TypeError("location must be of type CounterLocation")
-
- if break_location is None and location is CounterLocation.MiddleFixed:
- raise ValueError("Please specify a break_location")
-
- if (
- break_location is not None
- and location != CounterLocation.MiddleFixed
- ):
- raise ValueError(
- "break_location is ignored when location is not"
- " CounterLocation.MiddleFixed"
- )
-
- if break_location is not None and not isinstance(break_location, int):
- raise TypeError("break_location must be an integer")
-
- if break_location is not None and break_location < 0:
- raise ValueError("break_location must be a positive integer")
-
- if (label or context) and fixed:
- raise ValueError(
- "When supplying fixed data, label and context are ignored."
- )
-
- if rlen is None or not self._valid_byte_length(rlen):
- raise ValueError("rlen must be between 1 and 4")
-
- if llen is None and fixed is None:
- raise ValueError("Please specify an llen")
-
- if llen is not None and not isinstance(llen, int):
- raise TypeError("llen must be an integer")
-
- if llen == 0:
- raise ValueError("llen must be non-zero")
-
- if label is None:
- label = b""
-
- if context is None:
- context = b""
-
- utils._check_bytes("label", label)
- utils._check_bytes("context", context)
- self._prf = prf
- self._mode = mode
- self._length = length
- self._rlen = rlen
- self._llen = llen
- self._location = location
- self._break_location = break_location
- self._label = label
- self._context = context
- self._used = False
- self._fixed_data = fixed
-
- @staticmethod
- def _valid_byte_length(value: int) -> bool:
- if not isinstance(value, int):
- raise TypeError("value must be of type int")
-
- value_bin = utils.int_to_bytes(1, value)
- if not 1 <= len(value_bin) <= 4:
- return False
- return True
-
- def derive(self, key_material: bytes, prf_output_size: int) -> bytes:
- if self._used:
- raise AlreadyFinalized
-
- utils._check_byteslike("key_material", key_material)
- self._used = True
-
- # inverse floor division (equivalent to ceiling)
- rounds = -(-self._length // prf_output_size)
-
- output = [b""]
-
- # For counter mode, the number of iterations shall not be
- # larger than 2^r-1, where r <= 32 is the binary length of the counter
- # This ensures that the counter values used as an input to the
- # PRF will not repeat during a particular call to the KDF function.
- r_bin = utils.int_to_bytes(1, self._rlen)
- if rounds > pow(2, len(r_bin) * 8) - 1:
- raise ValueError("There are too many iterations.")
-
- fixed = self._generate_fixed_input()
-
- if self._location == CounterLocation.BeforeFixed:
- data_before_ctr = b""
- data_after_ctr = fixed
- elif self._location == CounterLocation.AfterFixed:
- data_before_ctr = fixed
- data_after_ctr = b""
- else:
- if isinstance(
- self._break_location, int
- ) and self._break_location > len(fixed):
- raise ValueError("break_location offset > len(fixed)")
- data_before_ctr = fixed[: self._break_location]
- data_after_ctr = fixed[self._break_location :]
-
- for i in range(1, rounds + 1):
- h = self._prf(key_material)
-
- counter = utils.int_to_bytes(i, self._rlen)
- input_data = data_before_ctr + counter + data_after_ctr
-
- h.update(input_data)
-
- output.append(h.finalize())
-
- return b"".join(output)[: self._length]
-
- def _generate_fixed_input(self) -> bytes:
- if self._fixed_data and isinstance(self._fixed_data, bytes):
- return self._fixed_data
-
- l_val = utils.int_to_bytes(self._length * 8, self._llen)
-
- return b"".join([self._label, b"\x00", self._context, l_val])
-
-
-class KBKDFHMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- backend: typing.Any = None,
- *,
- break_location: int | None = None,
- ):
- if not isinstance(algorithm, hashes.HashAlgorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported hash algorithm.",
- _Reasons.UNSUPPORTED_HASH,
- )
-
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.hmac_supported(algorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported hmac algorithm.",
- _Reasons.UNSUPPORTED_HASH,
- )
-
- self._algorithm = algorithm
-
- self._deriver = _KBKDFDeriver(
- self._prf,
- mode,
- length,
- rlen,
- llen,
- location,
- break_location,
- label,
- context,
- fixed,
- )
-
- def _prf(self, key_material: bytes) -> hmac.HMAC:
- return hmac.HMAC(key_material, self._algorithm)
-
- def derive(self, key_material: bytes) -> bytes:
- return self._deriver.derive(key_material, self._algorithm.digest_size)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
-
-
-class KBKDFCMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm,
- mode: Mode,
- length: int,
- rlen: int,
- llen: int | None,
- location: CounterLocation,
- label: bytes | None,
- context: bytes | None,
- fixed: bytes | None,
- backend: typing.Any = None,
- *,
- break_location: int | None = None,
- ):
- if not issubclass(
- algorithm, ciphers.BlockCipherAlgorithm
- ) or not issubclass(algorithm, ciphers.CipherAlgorithm):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported cipher algorithm.",
- _Reasons.UNSUPPORTED_CIPHER,
- )
-
- self._algorithm = algorithm
- self._cipher: ciphers.BlockCipherAlgorithm | None = None
-
- self._deriver = _KBKDFDeriver(
- self._prf,
- mode,
- length,
- rlen,
- llen,
- location,
- break_location,
- label,
- context,
- fixed,
- )
-
- def _prf(self, _: bytes) -> cmac.CMAC:
- assert self._cipher is not None
-
- return cmac.CMAC(self._cipher)
-
- def derive(self, key_material: bytes) -> bytes:
- self._cipher = self._algorithm(key_material)
-
- assert self._cipher is not None
-
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.cmac_algorithm_supported(self._cipher):
- raise UnsupportedAlgorithm(
- "Algorithm supplied is not a supported cipher algorithm.",
- _Reasons.UNSUPPORTED_CIPHER,
- )
-
- return self._deriver.derive(key_material, self._cipher.block_size // 8)
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/pbkdf2.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/pbkdf2.py
deleted file mode 100644
index 82689ebca..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/pbkdf2.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import (
- AlreadyFinalized,
- InvalidKey,
- UnsupportedAlgorithm,
- _Reasons,
-)
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives import constant_time, hashes
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-class PBKDF2HMAC(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- salt: bytes,
- iterations: int,
- backend: typing.Any = None,
- ):
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.pbkdf2_hmac_supported(algorithm):
- raise UnsupportedAlgorithm(
- f"{algorithm.name} is not supported for PBKDF2.",
- _Reasons.UNSUPPORTED_HASH,
- )
- self._used = False
- self._algorithm = algorithm
- self._length = length
- utils._check_bytes("salt", salt)
- self._salt = salt
- self._iterations = iterations
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized("PBKDF2 instances can only be used once.")
- self._used = True
-
- return rust_openssl.kdf.derive_pbkdf2_hmac(
- key_material,
- self._algorithm,
- self._salt,
- self._iterations,
- self._length,
- )
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- derived_key = self.derive(key_material)
- if not constant_time.bytes_eq(derived_key, expected_key):
- raise InvalidKey("Keys do not match.")
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/scrypt.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/scrypt.py
deleted file mode 100644
index f791ceea3..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/scrypt.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import sys
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-# This is used by the scrypt tests to skip tests that require more memory
-# than the MEM_LIMIT
-_MEM_LIMIT = sys.maxsize // 2
-
-Scrypt = rust_openssl.kdf.Scrypt
-KeyDerivationFunction.register(Scrypt)
-
-__all__ = ["Scrypt"]
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/x963kdf.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/x963kdf.py
deleted file mode 100644
index 6e38366a9..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/kdf/x963kdf.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized, InvalidKey
-from cryptography.hazmat.primitives import constant_time, hashes
-from cryptography.hazmat.primitives.kdf import KeyDerivationFunction
-
-
-def _int_to_u32be(n: int) -> bytes:
- return n.to_bytes(length=4, byteorder="big")
-
-
-class X963KDF(KeyDerivationFunction):
- def __init__(
- self,
- algorithm: hashes.HashAlgorithm,
- length: int,
- sharedinfo: bytes | None,
- backend: typing.Any = None,
- ):
- max_len = algorithm.digest_size * (2**32 - 1)
- if length > max_len:
- raise ValueError(f"Cannot derive keys larger than {max_len} bits.")
- if sharedinfo is not None:
- utils._check_bytes("sharedinfo", sharedinfo)
-
- self._algorithm = algorithm
- self._length = length
- self._sharedinfo = sharedinfo
- self._used = False
-
- def derive(self, key_material: bytes) -> bytes:
- if self._used:
- raise AlreadyFinalized
- self._used = True
- utils._check_byteslike("key_material", key_material)
- output = [b""]
- outlen = 0
- counter = 1
-
- while self._length > outlen:
- h = hashes.Hash(self._algorithm)
- h.update(key_material)
- h.update(_int_to_u32be(counter))
- if self._sharedinfo is not None:
- h.update(self._sharedinfo)
- output.append(h.finalize())
- outlen += len(output[-1])
- counter += 1
-
- return b"".join(output)[: self._length]
-
- def verify(self, key_material: bytes, expected_key: bytes) -> None:
- if not constant_time.bytes_eq(self.derive(key_material), expected_key):
- raise InvalidKey
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/keywrap.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/keywrap.py
deleted file mode 100644
index b93d87d31..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/keywrap.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.primitives.ciphers import Cipher
-from cryptography.hazmat.primitives.ciphers.algorithms import AES
-from cryptography.hazmat.primitives.ciphers.modes import ECB
-from cryptography.hazmat.primitives.constant_time import bytes_eq
-
-
-def _wrap_core(
- wrapping_key: bytes,
- a: bytes,
- r: list[bytes],
-) -> bytes:
- # RFC 3394 Key Wrap - 2.2.1 (index method)
- encryptor = Cipher(AES(wrapping_key), ECB()).encryptor()
- n = len(r)
- for j in range(6):
- for i in range(n):
- # every encryption operation is a discrete 16 byte chunk (because
- # AES has a 128-bit block size) and since we're using ECB it is
- # safe to reuse the encryptor for the entire operation
- b = encryptor.update(a + r[i])
- a = (
- int.from_bytes(b[:8], byteorder="big") ^ ((n * j) + i + 1)
- ).to_bytes(length=8, byteorder="big")
- r[i] = b[-8:]
-
- assert encryptor.finalize() == b""
-
- return a + b"".join(r)
-
-
-def aes_key_wrap(
- wrapping_key: bytes,
- key_to_wrap: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- if len(key_to_wrap) < 16:
- raise ValueError("The key to wrap must be at least 16 bytes")
-
- if len(key_to_wrap) % 8 != 0:
- raise ValueError("The key to wrap must be a multiple of 8 bytes")
-
- a = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6"
- r = [key_to_wrap[i : i + 8] for i in range(0, len(key_to_wrap), 8)]
- return _wrap_core(wrapping_key, a, r)
-
-
-def _unwrap_core(
- wrapping_key: bytes,
- a: bytes,
- r: list[bytes],
-) -> tuple[bytes, list[bytes]]:
- # Implement RFC 3394 Key Unwrap - 2.2.2 (index method)
- decryptor = Cipher(AES(wrapping_key), ECB()).decryptor()
- n = len(r)
- for j in reversed(range(6)):
- for i in reversed(range(n)):
- atr = (
- int.from_bytes(a, byteorder="big") ^ ((n * j) + i + 1)
- ).to_bytes(length=8, byteorder="big") + r[i]
- # every decryption operation is a discrete 16 byte chunk so
- # it is safe to reuse the decryptor for the entire operation
- b = decryptor.update(atr)
- a = b[:8]
- r[i] = b[-8:]
-
- assert decryptor.finalize() == b""
- return a, r
-
-
-def aes_key_wrap_with_padding(
- wrapping_key: bytes,
- key_to_wrap: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- aiv = b"\xa6\x59\x59\xa6" + len(key_to_wrap).to_bytes(
- length=4, byteorder="big"
- )
- # pad the key to wrap if necessary
- pad = (8 - (len(key_to_wrap) % 8)) % 8
- key_to_wrap = key_to_wrap + b"\x00" * pad
- if len(key_to_wrap) == 8:
- # RFC 5649 - 4.1 - exactly 8 octets after padding
- encryptor = Cipher(AES(wrapping_key), ECB()).encryptor()
- b = encryptor.update(aiv + key_to_wrap)
- assert encryptor.finalize() == b""
- return b
- else:
- r = [key_to_wrap[i : i + 8] for i in range(0, len(key_to_wrap), 8)]
- return _wrap_core(wrapping_key, aiv, r)
-
-
-def aes_key_unwrap_with_padding(
- wrapping_key: bytes,
- wrapped_key: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapped_key) < 16:
- raise InvalidUnwrap("Must be at least 16 bytes")
-
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- if len(wrapped_key) == 16:
- # RFC 5649 - 4.2 - exactly two 64-bit blocks
- decryptor = Cipher(AES(wrapping_key), ECB()).decryptor()
- out = decryptor.update(wrapped_key)
- assert decryptor.finalize() == b""
- a = out[:8]
- data = out[8:]
- n = 1
- else:
- r = [wrapped_key[i : i + 8] for i in range(0, len(wrapped_key), 8)]
- encrypted_aiv = r.pop(0)
- n = len(r)
- a, r = _unwrap_core(wrapping_key, encrypted_aiv, r)
- data = b"".join(r)
-
- # 1) Check that MSB(32,A) = A65959A6.
- # 2) Check that 8*(n-1) < LSB(32,A) <= 8*n. If so, let
- # MLI = LSB(32,A).
- # 3) Let b = (8*n)-MLI, and then check that the rightmost b octets of
- # the output data are zero.
- mli = int.from_bytes(a[4:], byteorder="big")
- b = (8 * n) - mli
- if (
- not bytes_eq(a[:4], b"\xa6\x59\x59\xa6")
- or not 8 * (n - 1) < mli <= 8 * n
- or (b != 0 and not bytes_eq(data[-b:], b"\x00" * b))
- ):
- raise InvalidUnwrap()
-
- if b == 0:
- return data
- else:
- return data[:-b]
-
-
-def aes_key_unwrap(
- wrapping_key: bytes,
- wrapped_key: bytes,
- backend: typing.Any = None,
-) -> bytes:
- if len(wrapped_key) < 24:
- raise InvalidUnwrap("Must be at least 24 bytes")
-
- if len(wrapped_key) % 8 != 0:
- raise InvalidUnwrap("The wrapped key must be a multiple of 8 bytes")
-
- if len(wrapping_key) not in [16, 24, 32]:
- raise ValueError("The wrapping key must be a valid AES key length")
-
- aiv = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6"
- r = [wrapped_key[i : i + 8] for i in range(0, len(wrapped_key), 8)]
- a = r.pop(0)
- a, r = _unwrap_core(wrapping_key, a, r)
- if not bytes_eq(a, aiv):
- raise InvalidUnwrap()
-
- return b"".join(r)
-
-
-class InvalidUnwrap(Exception):
- pass
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/padding.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/padding.py
deleted file mode 100644
index b2a3f1cff..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/padding.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import typing
-
-from cryptography import utils
-from cryptography.exceptions import AlreadyFinalized
-from cryptography.hazmat.bindings._rust import (
- PKCS7PaddingContext,
- PKCS7UnpaddingContext,
- check_ansix923_padding,
-)
-
-
-class PaddingContext(metaclass=abc.ABCMeta):
- @abc.abstractmethod
- def update(self, data: bytes) -> bytes:
- """
- Pads the provided bytes and returns any available data as bytes.
- """
-
- @abc.abstractmethod
- def finalize(self) -> bytes:
- """
- Finalize the padding, returns bytes.
- """
-
-
-def _byte_padding_check(block_size: int) -> None:
- if not (0 <= block_size <= 2040):
- raise ValueError("block_size must be in range(0, 2041).")
-
- if block_size % 8 != 0:
- raise ValueError("block_size must be a multiple of 8.")
-
-
-def _byte_padding_update(
- buffer_: bytes | None, data: bytes, block_size: int
-) -> tuple[bytes, bytes]:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- utils._check_byteslike("data", data)
-
- buffer_ += bytes(data)
-
- finished_blocks = len(buffer_) // (block_size // 8)
-
- result = buffer_[: finished_blocks * (block_size // 8)]
- buffer_ = buffer_[finished_blocks * (block_size // 8) :]
-
- return buffer_, result
-
-
-def _byte_padding_pad(
- buffer_: bytes | None,
- block_size: int,
- paddingfn: typing.Callable[[int], bytes],
-) -> bytes:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- pad_size = block_size // 8 - len(buffer_)
- return buffer_ + paddingfn(pad_size)
-
-
-def _byte_unpadding_update(
- buffer_: bytes | None, data: bytes, block_size: int
-) -> tuple[bytes, bytes]:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- utils._check_byteslike("data", data)
-
- buffer_ += bytes(data)
-
- finished_blocks = max(len(buffer_) // (block_size // 8) - 1, 0)
-
- result = buffer_[: finished_blocks * (block_size // 8)]
- buffer_ = buffer_[finished_blocks * (block_size // 8) :]
-
- return buffer_, result
-
-
-def _byte_unpadding_check(
- buffer_: bytes | None,
- block_size: int,
- checkfn: typing.Callable[[bytes], int],
-) -> bytes:
- if buffer_ is None:
- raise AlreadyFinalized("Context was already finalized.")
-
- if len(buffer_) != block_size // 8:
- raise ValueError("Invalid padding bytes.")
-
- valid = checkfn(buffer_)
-
- if not valid:
- raise ValueError("Invalid padding bytes.")
-
- pad_size = buffer_[-1]
- return buffer_[:-pad_size]
-
-
-class PKCS7:
- def __init__(self, block_size: int):
- _byte_padding_check(block_size)
- self.block_size = block_size
-
- def padder(self) -> PaddingContext:
- return PKCS7PaddingContext(self.block_size)
-
- def unpadder(self) -> PaddingContext:
- return PKCS7UnpaddingContext(self.block_size)
-
-
-PaddingContext.register(PKCS7PaddingContext)
-PaddingContext.register(PKCS7UnpaddingContext)
-
-
-class ANSIX923:
- def __init__(self, block_size: int):
- _byte_padding_check(block_size)
- self.block_size = block_size
-
- def padder(self) -> PaddingContext:
- return _ANSIX923PaddingContext(self.block_size)
-
- def unpadder(self) -> PaddingContext:
- return _ANSIX923UnpaddingContext(self.block_size)
-
-
-class _ANSIX923PaddingContext(PaddingContext):
- _buffer: bytes | None
-
- def __init__(self, block_size: int):
- self.block_size = block_size
- # TODO: more copies than necessary, we should use zero-buffer (#193)
- self._buffer = b""
-
- def update(self, data: bytes) -> bytes:
- self._buffer, result = _byte_padding_update(
- self._buffer, data, self.block_size
- )
- return result
-
- def _padding(self, size: int) -> bytes:
- return bytes([0]) * (size - 1) + bytes([size])
-
- def finalize(self) -> bytes:
- result = _byte_padding_pad(
- self._buffer, self.block_size, self._padding
- )
- self._buffer = None
- return result
-
-
-class _ANSIX923UnpaddingContext(PaddingContext):
- _buffer: bytes | None
-
- def __init__(self, block_size: int):
- self.block_size = block_size
- # TODO: more copies than necessary, we should use zero-buffer (#193)
- self._buffer = b""
-
- def update(self, data: bytes) -> bytes:
- self._buffer, result = _byte_unpadding_update(
- self._buffer, data, self.block_size
- )
- return result
-
- def finalize(self) -> bytes:
- result = _byte_unpadding_check(
- self._buffer,
- self.block_size,
- check_ansix923_padding,
- )
- self._buffer = None
- return result
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/poly1305.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/poly1305.py
deleted file mode 100644
index 7f5a77a57..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/poly1305.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-__all__ = ["Poly1305"]
-
-Poly1305 = rust_openssl.poly1305.Poly1305
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/__init__.py
deleted file mode 100644
index 07b2264b9..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/__init__.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.hazmat.primitives._serialization import (
- BestAvailableEncryption,
- Encoding,
- KeySerializationEncryption,
- NoEncryption,
- ParameterFormat,
- PrivateFormat,
- PublicFormat,
- _KeySerializationEncryption,
-)
-from cryptography.hazmat.primitives.serialization.base import (
- load_der_parameters,
- load_der_private_key,
- load_der_public_key,
- load_pem_parameters,
- load_pem_private_key,
- load_pem_public_key,
-)
-from cryptography.hazmat.primitives.serialization.ssh import (
- SSHCertificate,
- SSHCertificateBuilder,
- SSHCertificateType,
- SSHCertPrivateKeyTypes,
- SSHCertPublicKeyTypes,
- SSHPrivateKeyTypes,
- SSHPublicKeyTypes,
- load_ssh_private_key,
- load_ssh_public_identity,
- load_ssh_public_key,
-)
-
-__all__ = [
- "BestAvailableEncryption",
- "Encoding",
- "KeySerializationEncryption",
- "NoEncryption",
- "ParameterFormat",
- "PrivateFormat",
- "PublicFormat",
- "SSHCertPrivateKeyTypes",
- "SSHCertPublicKeyTypes",
- "SSHCertificate",
- "SSHCertificateBuilder",
- "SSHCertificateType",
- "SSHPrivateKeyTypes",
- "SSHPublicKeyTypes",
- "_KeySerializationEncryption",
- "load_der_parameters",
- "load_der_private_key",
- "load_der_public_key",
- "load_pem_parameters",
- "load_pem_private_key",
- "load_pem_public_key",
- "load_ssh_private_key",
- "load_ssh_public_identity",
- "load_ssh_public_key",
-]
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/base.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/base.py
deleted file mode 100644
index e7c998b7f..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/base.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from cryptography.hazmat.bindings._rust import openssl as rust_openssl
-
-load_pem_private_key = rust_openssl.keys.load_pem_private_key
-load_der_private_key = rust_openssl.keys.load_der_private_key
-
-load_pem_public_key = rust_openssl.keys.load_pem_public_key
-load_der_public_key = rust_openssl.keys.load_der_public_key
-
-load_pem_parameters = rust_openssl.dh.from_pem_parameters
-load_der_parameters = rust_openssl.dh.from_der_parameters
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs12.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs12.py
deleted file mode 100644
index 549e1f992..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs12.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography import x509
-from cryptography.hazmat.bindings._rust import pkcs12 as rust_pkcs12
-from cryptography.hazmat.primitives import serialization
-from cryptography.hazmat.primitives._serialization import PBES as PBES
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed448,
- ed25519,
- rsa,
-)
-from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
-
-__all__ = [
- "PBES",
- "PKCS12Certificate",
- "PKCS12KeyAndCertificates",
- "PKCS12PrivateKeyTypes",
- "load_key_and_certificates",
- "load_pkcs12",
- "serialize_key_and_certificates",
-]
-
-PKCS12PrivateKeyTypes = typing.Union[
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
-]
-
-
-PKCS12Certificate = rust_pkcs12.PKCS12Certificate
-
-
-class PKCS12KeyAndCertificates:
- def __init__(
- self,
- key: PrivateKeyTypes | None,
- cert: PKCS12Certificate | None,
- additional_certs: list[PKCS12Certificate],
- ):
- if key is not None and not isinstance(
- key,
- (
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- ),
- ):
- raise TypeError(
- "Key must be RSA, DSA, EllipticCurve, ED25519, or ED448"
- " private key, or None."
- )
- if cert is not None and not isinstance(cert, PKCS12Certificate):
- raise TypeError("cert must be a PKCS12Certificate object or None")
- if not all(
- isinstance(add_cert, PKCS12Certificate)
- for add_cert in additional_certs
- ):
- raise TypeError(
- "all values in additional_certs must be PKCS12Certificate"
- " objects"
- )
- self._key = key
- self._cert = cert
- self._additional_certs = additional_certs
-
- @property
- def key(self) -> PrivateKeyTypes | None:
- return self._key
-
- @property
- def cert(self) -> PKCS12Certificate | None:
- return self._cert
-
- @property
- def additional_certs(self) -> list[PKCS12Certificate]:
- return self._additional_certs
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PKCS12KeyAndCertificates):
- return NotImplemented
-
- return (
- self.key == other.key
- and self.cert == other.cert
- and self.additional_certs == other.additional_certs
- )
-
- def __hash__(self) -> int:
- return hash((self.key, self.cert, tuple(self.additional_certs)))
-
- def __repr__(self) -> str:
- fmt = (
- ""
- )
- return fmt.format(self.key, self.cert, self.additional_certs)
-
-
-load_key_and_certificates = rust_pkcs12.load_key_and_certificates
-load_pkcs12 = rust_pkcs12.load_pkcs12
-
-
-_PKCS12CATypes = typing.Union[
- x509.Certificate,
- PKCS12Certificate,
-]
-
-
-def serialize_key_and_certificates(
- name: bytes | None,
- key: PKCS12PrivateKeyTypes | None,
- cert: x509.Certificate | None,
- cas: typing.Iterable[_PKCS12CATypes] | None,
- encryption_algorithm: serialization.KeySerializationEncryption,
-) -> bytes:
- if key is not None and not isinstance(
- key,
- (
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ec.EllipticCurvePrivateKey,
- ed25519.Ed25519PrivateKey,
- ed448.Ed448PrivateKey,
- ),
- ):
- raise TypeError(
- "Key must be RSA, DSA, EllipticCurve, ED25519, or ED448"
- " private key, or None."
- )
-
- if not isinstance(
- encryption_algorithm, serialization.KeySerializationEncryption
- ):
- raise TypeError(
- "Key encryption algorithm must be a "
- "KeySerializationEncryption instance"
- )
-
- if key is None and cert is None and not cas:
- raise ValueError("You must supply at least one of key, cert, or cas")
-
- return rust_pkcs12.serialize_key_and_certificates(
- name, key, cert, cas, encryption_algorithm
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs7.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs7.py
deleted file mode 100644
index 882e345f2..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/pkcs7.py
+++ /dev/null
@@ -1,369 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import email.base64mime
-import email.generator
-import email.message
-import email.policy
-import io
-import typing
-
-from cryptography import utils, x509
-from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
-from cryptography.hazmat.bindings._rust import pkcs7 as rust_pkcs7
-from cryptography.hazmat.primitives import hashes, serialization
-from cryptography.hazmat.primitives.asymmetric import ec, padding, rsa
-from cryptography.utils import _check_byteslike
-
-load_pem_pkcs7_certificates = rust_pkcs7.load_pem_pkcs7_certificates
-
-load_der_pkcs7_certificates = rust_pkcs7.load_der_pkcs7_certificates
-
-serialize_certificates = rust_pkcs7.serialize_certificates
-
-PKCS7HashTypes = typing.Union[
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
-]
-
-PKCS7PrivateKeyTypes = typing.Union[
- rsa.RSAPrivateKey, ec.EllipticCurvePrivateKey
-]
-
-
-class PKCS7Options(utils.Enum):
- Text = "Add text/plain MIME type"
- Binary = "Don't translate input data into canonical MIME format"
- DetachedSignature = "Don't embed data in the PKCS7 structure"
- NoCapabilities = "Don't embed SMIME capabilities"
- NoAttributes = "Don't embed authenticatedAttributes"
- NoCerts = "Don't embed signer certificate"
-
-
-class PKCS7SignatureBuilder:
- def __init__(
- self,
- data: bytes | None = None,
- signers: list[
- tuple[
- x509.Certificate,
- PKCS7PrivateKeyTypes,
- PKCS7HashTypes,
- padding.PSS | padding.PKCS1v15 | None,
- ]
- ] = [],
- additional_certs: list[x509.Certificate] = [],
- ):
- self._data = data
- self._signers = signers
- self._additional_certs = additional_certs
-
- def set_data(self, data: bytes) -> PKCS7SignatureBuilder:
- _check_byteslike("data", data)
- if self._data is not None:
- raise ValueError("data may only be set once")
-
- return PKCS7SignatureBuilder(data, self._signers)
-
- def add_signer(
- self,
- certificate: x509.Certificate,
- private_key: PKCS7PrivateKeyTypes,
- hash_algorithm: PKCS7HashTypes,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> PKCS7SignatureBuilder:
- if not isinstance(
- hash_algorithm,
- (
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- ),
- ):
- raise TypeError(
- "hash_algorithm must be one of hashes.SHA224, "
- "SHA256, SHA384, or SHA512"
- )
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- if not isinstance(
- private_key, (rsa.RSAPrivateKey, ec.EllipticCurvePrivateKey)
- ):
- raise TypeError("Only RSA & EC keys are supported at this time.")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return PKCS7SignatureBuilder(
- self._data,
- [
- *self._signers,
- (certificate, private_key, hash_algorithm, rsa_padding),
- ],
- )
-
- def add_certificate(
- self, certificate: x509.Certificate
- ) -> PKCS7SignatureBuilder:
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- return PKCS7SignatureBuilder(
- self._data, self._signers, [*self._additional_certs, certificate]
- )
-
- def sign(
- self,
- encoding: serialization.Encoding,
- options: typing.Iterable[PKCS7Options],
- backend: typing.Any = None,
- ) -> bytes:
- if len(self._signers) == 0:
- raise ValueError("Must have at least one signer")
- if self._data is None:
- raise ValueError("You must add data to sign")
- options = list(options)
- if not all(isinstance(x, PKCS7Options) for x in options):
- raise ValueError("options must be from the PKCS7Options enum")
- if encoding not in (
- serialization.Encoding.PEM,
- serialization.Encoding.DER,
- serialization.Encoding.SMIME,
- ):
- raise ValueError(
- "Must be PEM, DER, or SMIME from the Encoding enum"
- )
-
- # Text is a meaningless option unless it is accompanied by
- # DetachedSignature
- if (
- PKCS7Options.Text in options
- and PKCS7Options.DetachedSignature not in options
- ):
- raise ValueError(
- "When passing the Text option you must also pass "
- "DetachedSignature"
- )
-
- if PKCS7Options.Text in options and encoding in (
- serialization.Encoding.DER,
- serialization.Encoding.PEM,
- ):
- raise ValueError(
- "The Text option is only available for SMIME serialization"
- )
-
- # No attributes implies no capabilities so we'll error if you try to
- # pass both.
- if (
- PKCS7Options.NoAttributes in options
- and PKCS7Options.NoCapabilities in options
- ):
- raise ValueError(
- "NoAttributes is a superset of NoCapabilities. Do not pass "
- "both values."
- )
-
- return rust_pkcs7.sign_and_serialize(self, encoding, options)
-
-
-class PKCS7EnvelopeBuilder:
- def __init__(
- self,
- *,
- _data: bytes | None = None,
- _recipients: list[x509.Certificate] | None = None,
- ):
- from cryptography.hazmat.backends.openssl.backend import (
- backend as ossl,
- )
-
- if not ossl.rsa_encryption_supported(padding=padding.PKCS1v15()):
- raise UnsupportedAlgorithm(
- "RSA with PKCS1 v1.5 padding is not supported by this version"
- " of OpenSSL.",
- _Reasons.UNSUPPORTED_PADDING,
- )
- self._data = _data
- self._recipients = _recipients if _recipients is not None else []
-
- def set_data(self, data: bytes) -> PKCS7EnvelopeBuilder:
- _check_byteslike("data", data)
- if self._data is not None:
- raise ValueError("data may only be set once")
-
- return PKCS7EnvelopeBuilder(_data=data, _recipients=self._recipients)
-
- def add_recipient(
- self,
- certificate: x509.Certificate,
- ) -> PKCS7EnvelopeBuilder:
- if not isinstance(certificate, x509.Certificate):
- raise TypeError("certificate must be a x509.Certificate")
-
- if not isinstance(certificate.public_key(), rsa.RSAPublicKey):
- raise TypeError("Only RSA keys are supported at this time.")
-
- return PKCS7EnvelopeBuilder(
- _data=self._data,
- _recipients=[
- *self._recipients,
- certificate,
- ],
- )
-
- def encrypt(
- self,
- encoding: serialization.Encoding,
- options: typing.Iterable[PKCS7Options],
- ) -> bytes:
- if len(self._recipients) == 0:
- raise ValueError("Must have at least one recipient")
- if self._data is None:
- raise ValueError("You must add data to encrypt")
- options = list(options)
- if not all(isinstance(x, PKCS7Options) for x in options):
- raise ValueError("options must be from the PKCS7Options enum")
- if encoding not in (
- serialization.Encoding.PEM,
- serialization.Encoding.DER,
- serialization.Encoding.SMIME,
- ):
- raise ValueError(
- "Must be PEM, DER, or SMIME from the Encoding enum"
- )
-
- # Only allow options that make sense for encryption
- if any(
- opt not in [PKCS7Options.Text, PKCS7Options.Binary]
- for opt in options
- ):
- raise ValueError(
- "Only the following options are supported for encryption: "
- "Text, Binary"
- )
- elif PKCS7Options.Text in options and PKCS7Options.Binary in options:
- # OpenSSL accepts both options at the same time, but ignores Text.
- # We fail defensively to avoid unexpected outputs.
- raise ValueError(
- "Cannot use Binary and Text options at the same time"
- )
-
- return rust_pkcs7.encrypt_and_serialize(self, encoding, options)
-
-
-pkcs7_decrypt_der = rust_pkcs7.decrypt_der
-pkcs7_decrypt_pem = rust_pkcs7.decrypt_pem
-pkcs7_decrypt_smime = rust_pkcs7.decrypt_smime
-
-
-def _smime_signed_encode(
- data: bytes, signature: bytes, micalg: str, text_mode: bool
-) -> bytes:
- # This function works pretty hard to replicate what OpenSSL does
- # precisely. For good and for ill.
-
- m = email.message.Message()
- m.add_header("MIME-Version", "1.0")
- m.add_header(
- "Content-Type",
- "multipart/signed",
- protocol="application/x-pkcs7-signature",
- micalg=micalg,
- )
-
- m.preamble = "This is an S/MIME signed message\n"
-
- msg_part = OpenSSLMimePart()
- msg_part.set_payload(data)
- if text_mode:
- msg_part.add_header("Content-Type", "text/plain")
- m.attach(msg_part)
-
- sig_part = email.message.MIMEPart()
- sig_part.add_header(
- "Content-Type", "application/x-pkcs7-signature", name="smime.p7s"
- )
- sig_part.add_header("Content-Transfer-Encoding", "base64")
- sig_part.add_header(
- "Content-Disposition", "attachment", filename="smime.p7s"
- )
- sig_part.set_payload(
- email.base64mime.body_encode(signature, maxlinelen=65)
- )
- del sig_part["MIME-Version"]
- m.attach(sig_part)
-
- fp = io.BytesIO()
- g = email.generator.BytesGenerator(
- fp,
- maxheaderlen=0,
- mangle_from_=False,
- policy=m.policy.clone(linesep="\r\n"),
- )
- g.flatten(m)
- return fp.getvalue()
-
-
-def _smime_enveloped_encode(data: bytes) -> bytes:
- m = email.message.Message()
- m.add_header("MIME-Version", "1.0")
- m.add_header("Content-Disposition", "attachment", filename="smime.p7m")
- m.add_header(
- "Content-Type",
- "application/pkcs7-mime",
- smime_type="enveloped-data",
- name="smime.p7m",
- )
- m.add_header("Content-Transfer-Encoding", "base64")
-
- m.set_payload(email.base64mime.body_encode(data, maxlinelen=65))
-
- return m.as_bytes(policy=m.policy.clone(linesep="\n", max_line_length=0))
-
-
-def _smime_enveloped_decode(data: bytes) -> bytes:
- m = email.message_from_bytes(data)
- if m.get_content_type() not in {
- "application/x-pkcs7-mime",
- "application/pkcs7-mime",
- }:
- raise ValueError("Not an S/MIME enveloped message")
- return bytes(m.get_payload(decode=True))
-
-
-def _smime_remove_text_headers(data: bytes) -> bytes:
- m = email.message_from_bytes(data)
- # Using get() instead of get_content_type() since it has None as default,
- # where the latter has "text/plain". Both methods are case-insensitive.
- content_type = m.get("content-type")
- if content_type is None:
- raise ValueError(
- "Decrypted MIME data has no 'Content-Type' header. "
- "Please remove the 'Text' option to parse it manually."
- )
- if "text/plain" not in content_type:
- raise ValueError(
- f"Decrypted MIME data content type is '{content_type}', not "
- "'text/plain'. Remove the 'Text' option to parse it manually."
- )
- return bytes(m.get_payload(decode=True))
-
-
-class OpenSSLMimePart(email.message.MIMEPart):
- # A MIMEPart subclass that replicates OpenSSL's behavior of not including
- # a newline if there are no headers.
- def _write_headers(self, generator) -> None:
- if list(self.raw_items()):
- generator._write_headers(self)
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/ssh.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/ssh.py
deleted file mode 100644
index c01afb0cc..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/serialization/ssh.py
+++ /dev/null
@@ -1,1569 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import binascii
-import enum
-import os
-import re
-import typing
-import warnings
-from base64 import encodebytes as _base64_encode
-from dataclasses import dataclass
-
-from cryptography import utils
-from cryptography.exceptions import UnsupportedAlgorithm
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed25519,
- padding,
- rsa,
-)
-from cryptography.hazmat.primitives.asymmetric import utils as asym_utils
-from cryptography.hazmat.primitives.ciphers import (
- AEADDecryptionContext,
- Cipher,
- algorithms,
- modes,
-)
-from cryptography.hazmat.primitives.serialization import (
- Encoding,
- KeySerializationEncryption,
- NoEncryption,
- PrivateFormat,
- PublicFormat,
- _KeySerializationEncryption,
-)
-
-try:
- from bcrypt import kdf as _bcrypt_kdf
-
- _bcrypt_supported = True
-except ImportError:
- _bcrypt_supported = False
-
- def _bcrypt_kdf(
- password: bytes,
- salt: bytes,
- desired_key_bytes: int,
- rounds: int,
- ignore_few_rounds: bool = False,
- ) -> bytes:
- raise UnsupportedAlgorithm("Need bcrypt module")
-
-
-_SSH_ED25519 = b"ssh-ed25519"
-_SSH_RSA = b"ssh-rsa"
-_SSH_DSA = b"ssh-dss"
-_ECDSA_NISTP256 = b"ecdsa-sha2-nistp256"
-_ECDSA_NISTP384 = b"ecdsa-sha2-nistp384"
-_ECDSA_NISTP521 = b"ecdsa-sha2-nistp521"
-_CERT_SUFFIX = b"-cert-v01@openssh.com"
-
-# U2F application string suffixed pubkey
-_SK_SSH_ED25519 = b"sk-ssh-ed25519@openssh.com"
-_SK_SSH_ECDSA_NISTP256 = b"sk-ecdsa-sha2-nistp256@openssh.com"
-
-# These are not key types, only algorithms, so they cannot appear
-# as a public key type
-_SSH_RSA_SHA256 = b"rsa-sha2-256"
-_SSH_RSA_SHA512 = b"rsa-sha2-512"
-
-_SSH_PUBKEY_RC = re.compile(rb"\A(\S+)[ \t]+(\S+)")
-_SK_MAGIC = b"openssh-key-v1\0"
-_SK_START = b"-----BEGIN OPENSSH PRIVATE KEY-----"
-_SK_END = b"-----END OPENSSH PRIVATE KEY-----"
-_BCRYPT = b"bcrypt"
-_NONE = b"none"
-_DEFAULT_CIPHER = b"aes256-ctr"
-_DEFAULT_ROUNDS = 16
-
-# re is only way to work on bytes-like data
-_PEM_RC = re.compile(_SK_START + b"(.*?)" + _SK_END, re.DOTALL)
-
-# padding for max blocksize
-_PADDING = memoryview(bytearray(range(1, 1 + 16)))
-
-
-@dataclass
-class _SSHCipher:
- alg: type[algorithms.AES]
- key_len: int
- mode: type[modes.CTR] | type[modes.CBC] | type[modes.GCM]
- block_len: int
- iv_len: int
- tag_len: int | None
- is_aead: bool
-
-
-# ciphers that are actually used in key wrapping
-_SSH_CIPHERS: dict[bytes, _SSHCipher] = {
- b"aes256-ctr": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.CTR,
- block_len=16,
- iv_len=16,
- tag_len=None,
- is_aead=False,
- ),
- b"aes256-cbc": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.CBC,
- block_len=16,
- iv_len=16,
- tag_len=None,
- is_aead=False,
- ),
- b"aes256-gcm@openssh.com": _SSHCipher(
- alg=algorithms.AES,
- key_len=32,
- mode=modes.GCM,
- block_len=16,
- iv_len=12,
- tag_len=16,
- is_aead=True,
- ),
-}
-
-# map local curve name to key type
-_ECDSA_KEY_TYPE = {
- "secp256r1": _ECDSA_NISTP256,
- "secp384r1": _ECDSA_NISTP384,
- "secp521r1": _ECDSA_NISTP521,
-}
-
-
-def _get_ssh_key_type(key: SSHPrivateKeyTypes | SSHPublicKeyTypes) -> bytes:
- if isinstance(key, ec.EllipticCurvePrivateKey):
- key_type = _ecdsa_key_type(key.public_key())
- elif isinstance(key, ec.EllipticCurvePublicKey):
- key_type = _ecdsa_key_type(key)
- elif isinstance(key, (rsa.RSAPrivateKey, rsa.RSAPublicKey)):
- key_type = _SSH_RSA
- elif isinstance(key, (dsa.DSAPrivateKey, dsa.DSAPublicKey)):
- key_type = _SSH_DSA
- elif isinstance(
- key, (ed25519.Ed25519PrivateKey, ed25519.Ed25519PublicKey)
- ):
- key_type = _SSH_ED25519
- else:
- raise ValueError("Unsupported key type")
-
- return key_type
-
-
-def _ecdsa_key_type(public_key: ec.EllipticCurvePublicKey) -> bytes:
- """Return SSH key_type and curve_name for private key."""
- curve = public_key.curve
- if curve.name not in _ECDSA_KEY_TYPE:
- raise ValueError(
- f"Unsupported curve for ssh private key: {curve.name!r}"
- )
- return _ECDSA_KEY_TYPE[curve.name]
-
-
-def _ssh_pem_encode(
- data: bytes,
- prefix: bytes = _SK_START + b"\n",
- suffix: bytes = _SK_END + b"\n",
-) -> bytes:
- return b"".join([prefix, _base64_encode(data), suffix])
-
-
-def _check_block_size(data: bytes, block_len: int) -> None:
- """Require data to be full blocks"""
- if not data or len(data) % block_len != 0:
- raise ValueError("Corrupt data: missing padding")
-
-
-def _check_empty(data: bytes) -> None:
- """All data should have been parsed."""
- if data:
- raise ValueError("Corrupt data: unparsed data")
-
-
-def _init_cipher(
- ciphername: bytes,
- password: bytes | None,
- salt: bytes,
- rounds: int,
-) -> Cipher[modes.CBC | modes.CTR | modes.GCM]:
- """Generate key + iv and return cipher."""
- if not password:
- raise ValueError("Key is password-protected.")
-
- ciph = _SSH_CIPHERS[ciphername]
- seed = _bcrypt_kdf(
- password, salt, ciph.key_len + ciph.iv_len, rounds, True
- )
- return Cipher(
- ciph.alg(seed[: ciph.key_len]),
- ciph.mode(seed[ciph.key_len :]),
- )
-
-
-def _get_u32(data: memoryview) -> tuple[int, memoryview]:
- """Uint32"""
- if len(data) < 4:
- raise ValueError("Invalid data")
- return int.from_bytes(data[:4], byteorder="big"), data[4:]
-
-
-def _get_u64(data: memoryview) -> tuple[int, memoryview]:
- """Uint64"""
- if len(data) < 8:
- raise ValueError("Invalid data")
- return int.from_bytes(data[:8], byteorder="big"), data[8:]
-
-
-def _get_sshstr(data: memoryview) -> tuple[memoryview, memoryview]:
- """Bytes with u32 length prefix"""
- n, data = _get_u32(data)
- if n > len(data):
- raise ValueError("Invalid data")
- return data[:n], data[n:]
-
-
-def _get_mpint(data: memoryview) -> tuple[int, memoryview]:
- """Big integer."""
- val, data = _get_sshstr(data)
- if val and val[0] > 0x7F:
- raise ValueError("Invalid data")
- return int.from_bytes(val, "big"), data
-
-
-def _to_mpint(val: int) -> bytes:
- """Storage format for signed bigint."""
- if val < 0:
- raise ValueError("negative mpint not allowed")
- if not val:
- return b""
- nbytes = (val.bit_length() + 8) // 8
- return utils.int_to_bytes(val, nbytes)
-
-
-class _FragList:
- """Build recursive structure without data copy."""
-
- flist: list[bytes]
-
- def __init__(self, init: list[bytes] | None = None) -> None:
- self.flist = []
- if init:
- self.flist.extend(init)
-
- def put_raw(self, val: bytes) -> None:
- """Add plain bytes"""
- self.flist.append(val)
-
- def put_u32(self, val: int) -> None:
- """Big-endian uint32"""
- self.flist.append(val.to_bytes(length=4, byteorder="big"))
-
- def put_u64(self, val: int) -> None:
- """Big-endian uint64"""
- self.flist.append(val.to_bytes(length=8, byteorder="big"))
-
- def put_sshstr(self, val: bytes | _FragList) -> None:
- """Bytes prefixed with u32 length"""
- if isinstance(val, (bytes, memoryview, bytearray)):
- self.put_u32(len(val))
- self.flist.append(val)
- else:
- self.put_u32(val.size())
- self.flist.extend(val.flist)
-
- def put_mpint(self, val: int) -> None:
- """Big-endian bigint prefixed with u32 length"""
- self.put_sshstr(_to_mpint(val))
-
- def size(self) -> int:
- """Current number of bytes"""
- return sum(map(len, self.flist))
-
- def render(self, dstbuf: memoryview, pos: int = 0) -> int:
- """Write into bytearray"""
- for frag in self.flist:
- flen = len(frag)
- start, pos = pos, pos + flen
- dstbuf[start:pos] = frag
- return pos
-
- def tobytes(self) -> bytes:
- """Return as bytes"""
- buf = memoryview(bytearray(self.size()))
- self.render(buf)
- return buf.tobytes()
-
-
-class _SSHFormatRSA:
- """Format for RSA keys.
-
- Public:
- mpint e, n
- Private:
- mpint n, e, d, iqmp, p, q
- """
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[int, int], memoryview]:
- """RSA public fields"""
- e, data = _get_mpint(data)
- n, data = _get_mpint(data)
- return (e, n), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[rsa.RSAPublicKey, memoryview]:
- """Make RSA public key from data."""
- (e, n), data = self.get_public(data)
- public_numbers = rsa.RSAPublicNumbers(e, n)
- public_key = public_numbers.public_key()
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[rsa.RSAPrivateKey, memoryview]:
- """Make RSA private key from data."""
- n, data = _get_mpint(data)
- e, data = _get_mpint(data)
- d, data = _get_mpint(data)
- iqmp, data = _get_mpint(data)
- p, data = _get_mpint(data)
- q, data = _get_mpint(data)
-
- if (e, n) != pubfields:
- raise ValueError("Corrupt data: rsa field mismatch")
- dmp1 = rsa.rsa_crt_dmp1(d, p)
- dmq1 = rsa.rsa_crt_dmq1(d, q)
- public_numbers = rsa.RSAPublicNumbers(e, n)
- private_numbers = rsa.RSAPrivateNumbers(
- p, q, d, dmp1, dmq1, iqmp, public_numbers
- )
- private_key = private_numbers.private_key()
- return private_key, data
-
- def encode_public(
- self, public_key: rsa.RSAPublicKey, f_pub: _FragList
- ) -> None:
- """Write RSA public key"""
- pubn = public_key.public_numbers()
- f_pub.put_mpint(pubn.e)
- f_pub.put_mpint(pubn.n)
-
- def encode_private(
- self, private_key: rsa.RSAPrivateKey, f_priv: _FragList
- ) -> None:
- """Write RSA private key"""
- private_numbers = private_key.private_numbers()
- public_numbers = private_numbers.public_numbers
-
- f_priv.put_mpint(public_numbers.n)
- f_priv.put_mpint(public_numbers.e)
-
- f_priv.put_mpint(private_numbers.d)
- f_priv.put_mpint(private_numbers.iqmp)
- f_priv.put_mpint(private_numbers.p)
- f_priv.put_mpint(private_numbers.q)
-
-
-class _SSHFormatDSA:
- """Format for DSA keys.
-
- Public:
- mpint p, q, g, y
- Private:
- mpint p, q, g, y, x
- """
-
- def get_public(self, data: memoryview) -> tuple[tuple, memoryview]:
- """DSA public fields"""
- p, data = _get_mpint(data)
- q, data = _get_mpint(data)
- g, data = _get_mpint(data)
- y, data = _get_mpint(data)
- return (p, q, g, y), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[dsa.DSAPublicKey, memoryview]:
- """Make DSA public key from data."""
- (p, q, g, y), data = self.get_public(data)
- parameter_numbers = dsa.DSAParameterNumbers(p, q, g)
- public_numbers = dsa.DSAPublicNumbers(y, parameter_numbers)
- self._validate(public_numbers)
- public_key = public_numbers.public_key()
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[dsa.DSAPrivateKey, memoryview]:
- """Make DSA private key from data."""
- (p, q, g, y), data = self.get_public(data)
- x, data = _get_mpint(data)
-
- if (p, q, g, y) != pubfields:
- raise ValueError("Corrupt data: dsa field mismatch")
- parameter_numbers = dsa.DSAParameterNumbers(p, q, g)
- public_numbers = dsa.DSAPublicNumbers(y, parameter_numbers)
- self._validate(public_numbers)
- private_numbers = dsa.DSAPrivateNumbers(x, public_numbers)
- private_key = private_numbers.private_key()
- return private_key, data
-
- def encode_public(
- self, public_key: dsa.DSAPublicKey, f_pub: _FragList
- ) -> None:
- """Write DSA public key"""
- public_numbers = public_key.public_numbers()
- parameter_numbers = public_numbers.parameter_numbers
- self._validate(public_numbers)
-
- f_pub.put_mpint(parameter_numbers.p)
- f_pub.put_mpint(parameter_numbers.q)
- f_pub.put_mpint(parameter_numbers.g)
- f_pub.put_mpint(public_numbers.y)
-
- def encode_private(
- self, private_key: dsa.DSAPrivateKey, f_priv: _FragList
- ) -> None:
- """Write DSA private key"""
- self.encode_public(private_key.public_key(), f_priv)
- f_priv.put_mpint(private_key.private_numbers().x)
-
- def _validate(self, public_numbers: dsa.DSAPublicNumbers) -> None:
- parameter_numbers = public_numbers.parameter_numbers
- if parameter_numbers.p.bit_length() != 1024:
- raise ValueError("SSH supports only 1024 bit DSA keys")
-
-
-class _SSHFormatECDSA:
- """Format for ECDSA keys.
-
- Public:
- str curve
- bytes point
- Private:
- str curve
- bytes point
- mpint secret
- """
-
- def __init__(self, ssh_curve_name: bytes, curve: ec.EllipticCurve):
- self.ssh_curve_name = ssh_curve_name
- self.curve = curve
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[memoryview, memoryview], memoryview]:
- """ECDSA public fields"""
- curve, data = _get_sshstr(data)
- point, data = _get_sshstr(data)
- if curve != self.ssh_curve_name:
- raise ValueError("Curve name mismatch")
- if point[0] != 4:
- raise NotImplementedError("Need uncompressed point")
- return (curve, point), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ec.EllipticCurvePublicKey, memoryview]:
- """Make ECDSA public key from data."""
- (_, point), data = self.get_public(data)
- public_key = ec.EllipticCurvePublicKey.from_encoded_point(
- self.curve, point.tobytes()
- )
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[ec.EllipticCurvePrivateKey, memoryview]:
- """Make ECDSA private key from data."""
- (curve_name, point), data = self.get_public(data)
- secret, data = _get_mpint(data)
-
- if (curve_name, point) != pubfields:
- raise ValueError("Corrupt data: ecdsa field mismatch")
- private_key = ec.derive_private_key(secret, self.curve)
- return private_key, data
-
- def encode_public(
- self, public_key: ec.EllipticCurvePublicKey, f_pub: _FragList
- ) -> None:
- """Write ECDSA public key"""
- point = public_key.public_bytes(
- Encoding.X962, PublicFormat.UncompressedPoint
- )
- f_pub.put_sshstr(self.ssh_curve_name)
- f_pub.put_sshstr(point)
-
- def encode_private(
- self, private_key: ec.EllipticCurvePrivateKey, f_priv: _FragList
- ) -> None:
- """Write ECDSA private key"""
- public_key = private_key.public_key()
- private_numbers = private_key.private_numbers()
-
- self.encode_public(public_key, f_priv)
- f_priv.put_mpint(private_numbers.private_value)
-
-
-class _SSHFormatEd25519:
- """Format for Ed25519 keys.
-
- Public:
- bytes point
- Private:
- bytes point
- bytes secret_and_point
- """
-
- def get_public(
- self, data: memoryview
- ) -> tuple[tuple[memoryview], memoryview]:
- """Ed25519 public fields"""
- point, data = _get_sshstr(data)
- return (point,), data
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ed25519.Ed25519PublicKey, memoryview]:
- """Make Ed25519 public key from data."""
- (point,), data = self.get_public(data)
- public_key = ed25519.Ed25519PublicKey.from_public_bytes(
- point.tobytes()
- )
- return public_key, data
-
- def load_private(
- self, data: memoryview, pubfields
- ) -> tuple[ed25519.Ed25519PrivateKey, memoryview]:
- """Make Ed25519 private key from data."""
- (point,), data = self.get_public(data)
- keypair, data = _get_sshstr(data)
-
- secret = keypair[:32]
- point2 = keypair[32:]
- if point != point2 or (point,) != pubfields:
- raise ValueError("Corrupt data: ed25519 field mismatch")
- private_key = ed25519.Ed25519PrivateKey.from_private_bytes(secret)
- return private_key, data
-
- def encode_public(
- self, public_key: ed25519.Ed25519PublicKey, f_pub: _FragList
- ) -> None:
- """Write Ed25519 public key"""
- raw_public_key = public_key.public_bytes(
- Encoding.Raw, PublicFormat.Raw
- )
- f_pub.put_sshstr(raw_public_key)
-
- def encode_private(
- self, private_key: ed25519.Ed25519PrivateKey, f_priv: _FragList
- ) -> None:
- """Write Ed25519 private key"""
- public_key = private_key.public_key()
- raw_private_key = private_key.private_bytes(
- Encoding.Raw, PrivateFormat.Raw, NoEncryption()
- )
- raw_public_key = public_key.public_bytes(
- Encoding.Raw, PublicFormat.Raw
- )
- f_keypair = _FragList([raw_private_key, raw_public_key])
-
- self.encode_public(public_key, f_priv)
- f_priv.put_sshstr(f_keypair)
-
-
-def load_application(data) -> tuple[memoryview, memoryview]:
- """
- U2F application strings
- """
- application, data = _get_sshstr(data)
- if not application.tobytes().startswith(b"ssh:"):
- raise ValueError(
- "U2F application string does not start with b'ssh:' "
- f"({application})"
- )
- return application, data
-
-
-class _SSHFormatSKEd25519:
- """
- The format of a sk-ssh-ed25519@openssh.com public key is:
-
- string "sk-ssh-ed25519@openssh.com"
- string public key
- string application (user-specified, but typically "ssh:")
- """
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ed25519.Ed25519PublicKey, memoryview]:
- """Make Ed25519 public key from data."""
- public_key, data = _lookup_kformat(_SSH_ED25519).load_public(data)
- _, data = load_application(data)
- return public_key, data
-
-
-class _SSHFormatSKECDSA:
- """
- The format of a sk-ecdsa-sha2-nistp256@openssh.com public key is:
-
- string "sk-ecdsa-sha2-nistp256@openssh.com"
- string curve name
- ec_point Q
- string application (user-specified, but typically "ssh:")
- """
-
- def load_public(
- self, data: memoryview
- ) -> tuple[ec.EllipticCurvePublicKey, memoryview]:
- """Make ECDSA public key from data."""
- public_key, data = _lookup_kformat(_ECDSA_NISTP256).load_public(data)
- _, data = load_application(data)
- return public_key, data
-
-
-_KEY_FORMATS = {
- _SSH_RSA: _SSHFormatRSA(),
- _SSH_DSA: _SSHFormatDSA(),
- _SSH_ED25519: _SSHFormatEd25519(),
- _ECDSA_NISTP256: _SSHFormatECDSA(b"nistp256", ec.SECP256R1()),
- _ECDSA_NISTP384: _SSHFormatECDSA(b"nistp384", ec.SECP384R1()),
- _ECDSA_NISTP521: _SSHFormatECDSA(b"nistp521", ec.SECP521R1()),
- _SK_SSH_ED25519: _SSHFormatSKEd25519(),
- _SK_SSH_ECDSA_NISTP256: _SSHFormatSKECDSA(),
-}
-
-
-def _lookup_kformat(key_type: bytes):
- """Return valid format or throw error"""
- if not isinstance(key_type, bytes):
- key_type = memoryview(key_type).tobytes()
- if key_type in _KEY_FORMATS:
- return _KEY_FORMATS[key_type]
- raise UnsupportedAlgorithm(f"Unsupported key type: {key_type!r}")
-
-
-SSHPrivateKeyTypes = typing.Union[
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- dsa.DSAPrivateKey,
- ed25519.Ed25519PrivateKey,
-]
-
-
-def load_ssh_private_key(
- data: bytes,
- password: bytes | None,
- backend: typing.Any = None,
-) -> SSHPrivateKeyTypes:
- """Load private key from OpenSSH custom encoding."""
- utils._check_byteslike("data", data)
- if password is not None:
- utils._check_bytes("password", password)
-
- m = _PEM_RC.search(data)
- if not m:
- raise ValueError("Not OpenSSH private key format")
- p1 = m.start(1)
- p2 = m.end(1)
- data = binascii.a2b_base64(memoryview(data)[p1:p2])
- if not data.startswith(_SK_MAGIC):
- raise ValueError("Not OpenSSH private key format")
- data = memoryview(data)[len(_SK_MAGIC) :]
-
- # parse header
- ciphername, data = _get_sshstr(data)
- kdfname, data = _get_sshstr(data)
- kdfoptions, data = _get_sshstr(data)
- nkeys, data = _get_u32(data)
- if nkeys != 1:
- raise ValueError("Only one key supported")
-
- # load public key data
- pubdata, data = _get_sshstr(data)
- pub_key_type, pubdata = _get_sshstr(pubdata)
- kformat = _lookup_kformat(pub_key_type)
- pubfields, pubdata = kformat.get_public(pubdata)
- _check_empty(pubdata)
-
- if (ciphername, kdfname) != (_NONE, _NONE):
- ciphername_bytes = ciphername.tobytes()
- if ciphername_bytes not in _SSH_CIPHERS:
- raise UnsupportedAlgorithm(
- f"Unsupported cipher: {ciphername_bytes!r}"
- )
- if kdfname != _BCRYPT:
- raise UnsupportedAlgorithm(f"Unsupported KDF: {kdfname!r}")
- blklen = _SSH_CIPHERS[ciphername_bytes].block_len
- tag_len = _SSH_CIPHERS[ciphername_bytes].tag_len
- # load secret data
- edata, data = _get_sshstr(data)
- # see https://bugzilla.mindrot.org/show_bug.cgi?id=3553 for
- # information about how OpenSSH handles AEAD tags
- if _SSH_CIPHERS[ciphername_bytes].is_aead:
- tag = bytes(data)
- if len(tag) != tag_len:
- raise ValueError("Corrupt data: invalid tag length for cipher")
- else:
- _check_empty(data)
- _check_block_size(edata, blklen)
- salt, kbuf = _get_sshstr(kdfoptions)
- rounds, kbuf = _get_u32(kbuf)
- _check_empty(kbuf)
- ciph = _init_cipher(ciphername_bytes, password, salt.tobytes(), rounds)
- dec = ciph.decryptor()
- edata = memoryview(dec.update(edata))
- if _SSH_CIPHERS[ciphername_bytes].is_aead:
- assert isinstance(dec, AEADDecryptionContext)
- _check_empty(dec.finalize_with_tag(tag))
- else:
- # _check_block_size requires data to be a full block so there
- # should be no output from finalize
- _check_empty(dec.finalize())
- else:
- # load secret data
- edata, data = _get_sshstr(data)
- _check_empty(data)
- blklen = 8
- _check_block_size(edata, blklen)
- ck1, edata = _get_u32(edata)
- ck2, edata = _get_u32(edata)
- if ck1 != ck2:
- raise ValueError("Corrupt data: broken checksum")
-
- # load per-key struct
- key_type, edata = _get_sshstr(edata)
- if key_type != pub_key_type:
- raise ValueError("Corrupt data: key type mismatch")
- private_key, edata = kformat.load_private(edata, pubfields)
- # We don't use the comment
- _, edata = _get_sshstr(edata)
-
- # yes, SSH does padding check *after* all other parsing is done.
- # need to follow as it writes zero-byte padding too.
- if edata != _PADDING[: len(edata)]:
- raise ValueError("Corrupt data: invalid padding")
-
- if isinstance(private_key, dsa.DSAPrivateKey):
- warnings.warn(
- "SSH DSA keys are deprecated and will be removed in a future "
- "release.",
- utils.DeprecatedIn40,
- stacklevel=2,
- )
-
- return private_key
-
-
-def _serialize_ssh_private_key(
- private_key: SSHPrivateKeyTypes,
- password: bytes,
- encryption_algorithm: KeySerializationEncryption,
-) -> bytes:
- """Serialize private key with OpenSSH custom encoding."""
- utils._check_bytes("password", password)
- if isinstance(private_key, dsa.DSAPrivateKey):
- warnings.warn(
- "SSH DSA key support is deprecated and will be "
- "removed in a future release",
- utils.DeprecatedIn40,
- stacklevel=4,
- )
-
- key_type = _get_ssh_key_type(private_key)
- kformat = _lookup_kformat(key_type)
-
- # setup parameters
- f_kdfoptions = _FragList()
- if password:
- ciphername = _DEFAULT_CIPHER
- blklen = _SSH_CIPHERS[ciphername].block_len
- kdfname = _BCRYPT
- rounds = _DEFAULT_ROUNDS
- if (
- isinstance(encryption_algorithm, _KeySerializationEncryption)
- and encryption_algorithm._kdf_rounds is not None
- ):
- rounds = encryption_algorithm._kdf_rounds
- salt = os.urandom(16)
- f_kdfoptions.put_sshstr(salt)
- f_kdfoptions.put_u32(rounds)
- ciph = _init_cipher(ciphername, password, salt, rounds)
- else:
- ciphername = kdfname = _NONE
- blklen = 8
- ciph = None
- nkeys = 1
- checkval = os.urandom(4)
- comment = b""
-
- # encode public and private parts together
- f_public_key = _FragList()
- f_public_key.put_sshstr(key_type)
- kformat.encode_public(private_key.public_key(), f_public_key)
-
- f_secrets = _FragList([checkval, checkval])
- f_secrets.put_sshstr(key_type)
- kformat.encode_private(private_key, f_secrets)
- f_secrets.put_sshstr(comment)
- f_secrets.put_raw(_PADDING[: blklen - (f_secrets.size() % blklen)])
-
- # top-level structure
- f_main = _FragList()
- f_main.put_raw(_SK_MAGIC)
- f_main.put_sshstr(ciphername)
- f_main.put_sshstr(kdfname)
- f_main.put_sshstr(f_kdfoptions)
- f_main.put_u32(nkeys)
- f_main.put_sshstr(f_public_key)
- f_main.put_sshstr(f_secrets)
-
- # copy result info bytearray
- slen = f_secrets.size()
- mlen = f_main.size()
- buf = memoryview(bytearray(mlen + blklen))
- f_main.render(buf)
- ofs = mlen - slen
-
- # encrypt in-place
- if ciph is not None:
- ciph.encryptor().update_into(buf[ofs:mlen], buf[ofs:])
-
- return _ssh_pem_encode(buf[:mlen])
-
-
-SSHPublicKeyTypes = typing.Union[
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- dsa.DSAPublicKey,
- ed25519.Ed25519PublicKey,
-]
-
-SSHCertPublicKeyTypes = typing.Union[
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- ed25519.Ed25519PublicKey,
-]
-
-
-class SSHCertificateType(enum.Enum):
- USER = 1
- HOST = 2
-
-
-class SSHCertificate:
- def __init__(
- self,
- _nonce: memoryview,
- _public_key: SSHPublicKeyTypes,
- _serial: int,
- _cctype: int,
- _key_id: memoryview,
- _valid_principals: list[bytes],
- _valid_after: int,
- _valid_before: int,
- _critical_options: dict[bytes, bytes],
- _extensions: dict[bytes, bytes],
- _sig_type: memoryview,
- _sig_key: memoryview,
- _inner_sig_type: memoryview,
- _signature: memoryview,
- _tbs_cert_body: memoryview,
- _cert_key_type: bytes,
- _cert_body: memoryview,
- ):
- self._nonce = _nonce
- self._public_key = _public_key
- self._serial = _serial
- try:
- self._type = SSHCertificateType(_cctype)
- except ValueError:
- raise ValueError("Invalid certificate type")
- self._key_id = _key_id
- self._valid_principals = _valid_principals
- self._valid_after = _valid_after
- self._valid_before = _valid_before
- self._critical_options = _critical_options
- self._extensions = _extensions
- self._sig_type = _sig_type
- self._sig_key = _sig_key
- self._inner_sig_type = _inner_sig_type
- self._signature = _signature
- self._cert_key_type = _cert_key_type
- self._cert_body = _cert_body
- self._tbs_cert_body = _tbs_cert_body
-
- @property
- def nonce(self) -> bytes:
- return bytes(self._nonce)
-
- def public_key(self) -> SSHCertPublicKeyTypes:
- # make mypy happy until we remove DSA support entirely and
- # the underlying union won't have a disallowed type
- return typing.cast(SSHCertPublicKeyTypes, self._public_key)
-
- @property
- def serial(self) -> int:
- return self._serial
-
- @property
- def type(self) -> SSHCertificateType:
- return self._type
-
- @property
- def key_id(self) -> bytes:
- return bytes(self._key_id)
-
- @property
- def valid_principals(self) -> list[bytes]:
- return self._valid_principals
-
- @property
- def valid_before(self) -> int:
- return self._valid_before
-
- @property
- def valid_after(self) -> int:
- return self._valid_after
-
- @property
- def critical_options(self) -> dict[bytes, bytes]:
- return self._critical_options
-
- @property
- def extensions(self) -> dict[bytes, bytes]:
- return self._extensions
-
- def signature_key(self) -> SSHCertPublicKeyTypes:
- sigformat = _lookup_kformat(self._sig_type)
- signature_key, sigkey_rest = sigformat.load_public(self._sig_key)
- _check_empty(sigkey_rest)
- return signature_key
-
- def public_bytes(self) -> bytes:
- return (
- bytes(self._cert_key_type)
- + b" "
- + binascii.b2a_base64(bytes(self._cert_body), newline=False)
- )
-
- def verify_cert_signature(self) -> None:
- signature_key = self.signature_key()
- if isinstance(signature_key, ed25519.Ed25519PublicKey):
- signature_key.verify(
- bytes(self._signature), bytes(self._tbs_cert_body)
- )
- elif isinstance(signature_key, ec.EllipticCurvePublicKey):
- # The signature is encoded as a pair of big-endian integers
- r, data = _get_mpint(self._signature)
- s, data = _get_mpint(data)
- _check_empty(data)
- computed_sig = asym_utils.encode_dss_signature(r, s)
- hash_alg = _get_ec_hash_alg(signature_key.curve)
- signature_key.verify(
- computed_sig, bytes(self._tbs_cert_body), ec.ECDSA(hash_alg)
- )
- else:
- assert isinstance(signature_key, rsa.RSAPublicKey)
- if self._inner_sig_type == _SSH_RSA:
- hash_alg = hashes.SHA1()
- elif self._inner_sig_type == _SSH_RSA_SHA256:
- hash_alg = hashes.SHA256()
- else:
- assert self._inner_sig_type == _SSH_RSA_SHA512
- hash_alg = hashes.SHA512()
- signature_key.verify(
- bytes(self._signature),
- bytes(self._tbs_cert_body),
- padding.PKCS1v15(),
- hash_alg,
- )
-
-
-def _get_ec_hash_alg(curve: ec.EllipticCurve) -> hashes.HashAlgorithm:
- if isinstance(curve, ec.SECP256R1):
- return hashes.SHA256()
- elif isinstance(curve, ec.SECP384R1):
- return hashes.SHA384()
- else:
- assert isinstance(curve, ec.SECP521R1)
- return hashes.SHA512()
-
-
-def _load_ssh_public_identity(
- data: bytes,
- _legacy_dsa_allowed=False,
-) -> SSHCertificate | SSHPublicKeyTypes:
- utils._check_byteslike("data", data)
-
- m = _SSH_PUBKEY_RC.match(data)
- if not m:
- raise ValueError("Invalid line format")
- key_type = orig_key_type = m.group(1)
- key_body = m.group(2)
- with_cert = False
- if key_type.endswith(_CERT_SUFFIX):
- with_cert = True
- key_type = key_type[: -len(_CERT_SUFFIX)]
- if key_type == _SSH_DSA and not _legacy_dsa_allowed:
- raise UnsupportedAlgorithm(
- "DSA keys aren't supported in SSH certificates"
- )
- kformat = _lookup_kformat(key_type)
-
- try:
- rest = memoryview(binascii.a2b_base64(key_body))
- except (TypeError, binascii.Error):
- raise ValueError("Invalid format")
-
- if with_cert:
- cert_body = rest
- inner_key_type, rest = _get_sshstr(rest)
- if inner_key_type != orig_key_type:
- raise ValueError("Invalid key format")
- if with_cert:
- nonce, rest = _get_sshstr(rest)
- public_key, rest = kformat.load_public(rest)
- if with_cert:
- serial, rest = _get_u64(rest)
- cctype, rest = _get_u32(rest)
- key_id, rest = _get_sshstr(rest)
- principals, rest = _get_sshstr(rest)
- valid_principals = []
- while principals:
- principal, principals = _get_sshstr(principals)
- valid_principals.append(bytes(principal))
- valid_after, rest = _get_u64(rest)
- valid_before, rest = _get_u64(rest)
- crit_options, rest = _get_sshstr(rest)
- critical_options = _parse_exts_opts(crit_options)
- exts, rest = _get_sshstr(rest)
- extensions = _parse_exts_opts(exts)
- # Get the reserved field, which is unused.
- _, rest = _get_sshstr(rest)
- sig_key_raw, rest = _get_sshstr(rest)
- sig_type, sig_key = _get_sshstr(sig_key_raw)
- if sig_type == _SSH_DSA and not _legacy_dsa_allowed:
- raise UnsupportedAlgorithm(
- "DSA signatures aren't supported in SSH certificates"
- )
- # Get the entire cert body and subtract the signature
- tbs_cert_body = cert_body[: -len(rest)]
- signature_raw, rest = _get_sshstr(rest)
- _check_empty(rest)
- inner_sig_type, sig_rest = _get_sshstr(signature_raw)
- # RSA certs can have multiple algorithm types
- if (
- sig_type == _SSH_RSA
- and inner_sig_type
- not in [_SSH_RSA_SHA256, _SSH_RSA_SHA512, _SSH_RSA]
- ) or (sig_type != _SSH_RSA and inner_sig_type != sig_type):
- raise ValueError("Signature key type does not match")
- signature, sig_rest = _get_sshstr(sig_rest)
- _check_empty(sig_rest)
- return SSHCertificate(
- nonce,
- public_key,
- serial,
- cctype,
- key_id,
- valid_principals,
- valid_after,
- valid_before,
- critical_options,
- extensions,
- sig_type,
- sig_key,
- inner_sig_type,
- signature,
- tbs_cert_body,
- orig_key_type,
- cert_body,
- )
- else:
- _check_empty(rest)
- return public_key
-
-
-def load_ssh_public_identity(
- data: bytes,
-) -> SSHCertificate | SSHPublicKeyTypes:
- return _load_ssh_public_identity(data)
-
-
-def _parse_exts_opts(exts_opts: memoryview) -> dict[bytes, bytes]:
- result: dict[bytes, bytes] = {}
- last_name = None
- while exts_opts:
- name, exts_opts = _get_sshstr(exts_opts)
- bname: bytes = bytes(name)
- if bname in result:
- raise ValueError("Duplicate name")
- if last_name is not None and bname < last_name:
- raise ValueError("Fields not lexically sorted")
- value, exts_opts = _get_sshstr(exts_opts)
- if len(value) > 0:
- value, extra = _get_sshstr(value)
- if len(extra) > 0:
- raise ValueError("Unexpected extra data after value")
- result[bname] = bytes(value)
- last_name = bname
- return result
-
-
-def load_ssh_public_key(
- data: bytes, backend: typing.Any = None
-) -> SSHPublicKeyTypes:
- cert_or_key = _load_ssh_public_identity(data, _legacy_dsa_allowed=True)
- public_key: SSHPublicKeyTypes
- if isinstance(cert_or_key, SSHCertificate):
- public_key = cert_or_key.public_key()
- else:
- public_key = cert_or_key
-
- if isinstance(public_key, dsa.DSAPublicKey):
- warnings.warn(
- "SSH DSA keys are deprecated and will be removed in a future "
- "release.",
- utils.DeprecatedIn40,
- stacklevel=2,
- )
- return public_key
-
-
-def serialize_ssh_public_key(public_key: SSHPublicKeyTypes) -> bytes:
- """One-line public key format for OpenSSH"""
- if isinstance(public_key, dsa.DSAPublicKey):
- warnings.warn(
- "SSH DSA key support is deprecated and will be "
- "removed in a future release",
- utils.DeprecatedIn40,
- stacklevel=4,
- )
- key_type = _get_ssh_key_type(public_key)
- kformat = _lookup_kformat(key_type)
-
- f_pub = _FragList()
- f_pub.put_sshstr(key_type)
- kformat.encode_public(public_key, f_pub)
-
- pub = binascii.b2a_base64(f_pub.tobytes()).strip()
- return b"".join([key_type, b" ", pub])
-
-
-SSHCertPrivateKeyTypes = typing.Union[
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- ed25519.Ed25519PrivateKey,
-]
-
-
-# This is an undocumented limit enforced in the openssh codebase for sshd and
-# ssh-keygen, but it is undefined in the ssh certificates spec.
-_SSHKEY_CERT_MAX_PRINCIPALS = 256
-
-
-class SSHCertificateBuilder:
- def __init__(
- self,
- _public_key: SSHCertPublicKeyTypes | None = None,
- _serial: int | None = None,
- _type: SSHCertificateType | None = None,
- _key_id: bytes | None = None,
- _valid_principals: list[bytes] = [],
- _valid_for_all_principals: bool = False,
- _valid_before: int | None = None,
- _valid_after: int | None = None,
- _critical_options: list[tuple[bytes, bytes]] = [],
- _extensions: list[tuple[bytes, bytes]] = [],
- ):
- self._public_key = _public_key
- self._serial = _serial
- self._type = _type
- self._key_id = _key_id
- self._valid_principals = _valid_principals
- self._valid_for_all_principals = _valid_for_all_principals
- self._valid_before = _valid_before
- self._valid_after = _valid_after
- self._critical_options = _critical_options
- self._extensions = _extensions
-
- def public_key(
- self, public_key: SSHCertPublicKeyTypes
- ) -> SSHCertificateBuilder:
- if not isinstance(
- public_key,
- (
- ec.EllipticCurvePublicKey,
- rsa.RSAPublicKey,
- ed25519.Ed25519PublicKey,
- ),
- ):
- raise TypeError("Unsupported key type")
- if self._public_key is not None:
- raise ValueError("public_key already set")
-
- return SSHCertificateBuilder(
- _public_key=public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def serial(self, serial: int) -> SSHCertificateBuilder:
- if not isinstance(serial, int):
- raise TypeError("serial must be an integer")
- if not 0 <= serial < 2**64:
- raise ValueError("serial must be between 0 and 2**64")
- if self._serial is not None:
- raise ValueError("serial already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def type(self, type: SSHCertificateType) -> SSHCertificateBuilder:
- if not isinstance(type, SSHCertificateType):
- raise TypeError("type must be an SSHCertificateType")
- if self._type is not None:
- raise ValueError("type already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def key_id(self, key_id: bytes) -> SSHCertificateBuilder:
- if not isinstance(key_id, bytes):
- raise TypeError("key_id must be bytes")
- if self._key_id is not None:
- raise ValueError("key_id already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_principals(
- self, valid_principals: list[bytes]
- ) -> SSHCertificateBuilder:
- if self._valid_for_all_principals:
- raise ValueError(
- "Principals can't be set because the cert is valid "
- "for all principals"
- )
- if (
- not all(isinstance(x, bytes) for x in valid_principals)
- or not valid_principals
- ):
- raise TypeError(
- "principals must be a list of bytes and can't be empty"
- )
- if self._valid_principals:
- raise ValueError("valid_principals already set")
-
- if len(valid_principals) > _SSHKEY_CERT_MAX_PRINCIPALS:
- raise ValueError(
- "Reached or exceeded the maximum number of valid_principals"
- )
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_for_all_principals(self):
- if self._valid_principals:
- raise ValueError(
- "valid_principals already set, can't set "
- "valid_for_all_principals"
- )
- if self._valid_for_all_principals:
- raise ValueError("valid_for_all_principals already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=True,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_before(self, valid_before: int | float) -> SSHCertificateBuilder:
- if not isinstance(valid_before, (int, float)):
- raise TypeError("valid_before must be an int or float")
- valid_before = int(valid_before)
- if valid_before < 0 or valid_before >= 2**64:
- raise ValueError("valid_before must [0, 2**64)")
- if self._valid_before is not None:
- raise ValueError("valid_before already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def valid_after(self, valid_after: int | float) -> SSHCertificateBuilder:
- if not isinstance(valid_after, (int, float)):
- raise TypeError("valid_after must be an int or float")
- valid_after = int(valid_after)
- if valid_after < 0 or valid_after >= 2**64:
- raise ValueError("valid_after must [0, 2**64)")
- if self._valid_after is not None:
- raise ValueError("valid_after already set")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=valid_after,
- _critical_options=self._critical_options,
- _extensions=self._extensions,
- )
-
- def add_critical_option(
- self, name: bytes, value: bytes
- ) -> SSHCertificateBuilder:
- if not isinstance(name, bytes) or not isinstance(value, bytes):
- raise TypeError("name and value must be bytes")
- # This is O(n**2)
- if name in [name for name, _ in self._critical_options]:
- raise ValueError("Duplicate critical option name")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=[*self._critical_options, (name, value)],
- _extensions=self._extensions,
- )
-
- def add_extension(
- self, name: bytes, value: bytes
- ) -> SSHCertificateBuilder:
- if not isinstance(name, bytes) or not isinstance(value, bytes):
- raise TypeError("name and value must be bytes")
- # This is O(n**2)
- if name in [name for name, _ in self._extensions]:
- raise ValueError("Duplicate extension name")
-
- return SSHCertificateBuilder(
- _public_key=self._public_key,
- _serial=self._serial,
- _type=self._type,
- _key_id=self._key_id,
- _valid_principals=self._valid_principals,
- _valid_for_all_principals=self._valid_for_all_principals,
- _valid_before=self._valid_before,
- _valid_after=self._valid_after,
- _critical_options=self._critical_options,
- _extensions=[*self._extensions, (name, value)],
- )
-
- def sign(self, private_key: SSHCertPrivateKeyTypes) -> SSHCertificate:
- if not isinstance(
- private_key,
- (
- ec.EllipticCurvePrivateKey,
- rsa.RSAPrivateKey,
- ed25519.Ed25519PrivateKey,
- ),
- ):
- raise TypeError("Unsupported private key type")
-
- if self._public_key is None:
- raise ValueError("public_key must be set")
-
- # Not required
- serial = 0 if self._serial is None else self._serial
-
- if self._type is None:
- raise ValueError("type must be set")
-
- # Not required
- key_id = b"" if self._key_id is None else self._key_id
-
- # A zero length list is valid, but means the certificate
- # is valid for any principal of the specified type. We require
- # the user to explicitly set valid_for_all_principals to get
- # that behavior.
- if not self._valid_principals and not self._valid_for_all_principals:
- raise ValueError(
- "valid_principals must be set if valid_for_all_principals "
- "is False"
- )
-
- if self._valid_before is None:
- raise ValueError("valid_before must be set")
-
- if self._valid_after is None:
- raise ValueError("valid_after must be set")
-
- if self._valid_after > self._valid_before:
- raise ValueError("valid_after must be earlier than valid_before")
-
- # lexically sort our byte strings
- self._critical_options.sort(key=lambda x: x[0])
- self._extensions.sort(key=lambda x: x[0])
-
- key_type = _get_ssh_key_type(self._public_key)
- cert_prefix = key_type + _CERT_SUFFIX
-
- # Marshal the bytes to be signed
- nonce = os.urandom(32)
- kformat = _lookup_kformat(key_type)
- f = _FragList()
- f.put_sshstr(cert_prefix)
- f.put_sshstr(nonce)
- kformat.encode_public(self._public_key, f)
- f.put_u64(serial)
- f.put_u32(self._type.value)
- f.put_sshstr(key_id)
- fprincipals = _FragList()
- for p in self._valid_principals:
- fprincipals.put_sshstr(p)
- f.put_sshstr(fprincipals.tobytes())
- f.put_u64(self._valid_after)
- f.put_u64(self._valid_before)
- fcrit = _FragList()
- for name, value in self._critical_options:
- fcrit.put_sshstr(name)
- if len(value) > 0:
- foptval = _FragList()
- foptval.put_sshstr(value)
- fcrit.put_sshstr(foptval.tobytes())
- else:
- fcrit.put_sshstr(value)
- f.put_sshstr(fcrit.tobytes())
- fext = _FragList()
- for name, value in self._extensions:
- fext.put_sshstr(name)
- if len(value) > 0:
- fextval = _FragList()
- fextval.put_sshstr(value)
- fext.put_sshstr(fextval.tobytes())
- else:
- fext.put_sshstr(value)
- f.put_sshstr(fext.tobytes())
- f.put_sshstr(b"") # RESERVED FIELD
- # encode CA public key
- ca_type = _get_ssh_key_type(private_key)
- caformat = _lookup_kformat(ca_type)
- caf = _FragList()
- caf.put_sshstr(ca_type)
- caformat.encode_public(private_key.public_key(), caf)
- f.put_sshstr(caf.tobytes())
- # Sigs according to the rules defined for the CA's public key
- # (RFC4253 section 6.6 for ssh-rsa, RFC5656 for ECDSA,
- # and RFC8032 for Ed25519).
- if isinstance(private_key, ed25519.Ed25519PrivateKey):
- signature = private_key.sign(f.tobytes())
- fsig = _FragList()
- fsig.put_sshstr(ca_type)
- fsig.put_sshstr(signature)
- f.put_sshstr(fsig.tobytes())
- elif isinstance(private_key, ec.EllipticCurvePrivateKey):
- hash_alg = _get_ec_hash_alg(private_key.curve)
- signature = private_key.sign(f.tobytes(), ec.ECDSA(hash_alg))
- r, s = asym_utils.decode_dss_signature(signature)
- fsig = _FragList()
- fsig.put_sshstr(ca_type)
- fsigblob = _FragList()
- fsigblob.put_mpint(r)
- fsigblob.put_mpint(s)
- fsig.put_sshstr(fsigblob.tobytes())
- f.put_sshstr(fsig.tobytes())
-
- else:
- assert isinstance(private_key, rsa.RSAPrivateKey)
- # Just like Golang, we're going to use SHA512 for RSA
- # https://cs.opensource.google/go/x/crypto/+/refs/tags/
- # v0.4.0:ssh/certs.go;l=445
- # RFC 8332 defines SHA256 and 512 as options
- fsig = _FragList()
- fsig.put_sshstr(_SSH_RSA_SHA512)
- signature = private_key.sign(
- f.tobytes(), padding.PKCS1v15(), hashes.SHA512()
- )
- fsig.put_sshstr(signature)
- f.put_sshstr(fsig.tobytes())
-
- cert_data = binascii.b2a_base64(f.tobytes()).strip()
- # load_ssh_public_identity returns a union, but this is
- # guaranteed to be an SSHCertificate, so we cast to make
- # mypy happy.
- return typing.cast(
- SSHCertificate,
- load_ssh_public_identity(b"".join([cert_prefix, b" ", cert_data])),
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/__init__.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/__init__.py
deleted file mode 100644
index c1af42300..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-
-class InvalidToken(Exception):
- pass
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/hotp.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/hotp.py
deleted file mode 100644
index 855a5d212..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/hotp.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import base64
-import typing
-from urllib.parse import quote, urlencode
-
-from cryptography.hazmat.primitives import constant_time, hmac
-from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512
-from cryptography.hazmat.primitives.twofactor import InvalidToken
-
-HOTPHashTypes = typing.Union[SHA1, SHA256, SHA512]
-
-
-def _generate_uri(
- hotp: HOTP,
- type_name: str,
- account_name: str,
- issuer: str | None,
- extra_parameters: list[tuple[str, int]],
-) -> str:
- parameters = [
- ("digits", hotp._length),
- ("secret", base64.b32encode(hotp._key)),
- ("algorithm", hotp._algorithm.name.upper()),
- ]
-
- if issuer is not None:
- parameters.append(("issuer", issuer))
-
- parameters.extend(extra_parameters)
-
- label = (
- f"{quote(issuer)}:{quote(account_name)}"
- if issuer
- else quote(account_name)
- )
- return f"otpauth://{type_name}/{label}?{urlencode(parameters)}"
-
-
-class HOTP:
- def __init__(
- self,
- key: bytes,
- length: int,
- algorithm: HOTPHashTypes,
- backend: typing.Any = None,
- enforce_key_length: bool = True,
- ) -> None:
- if len(key) < 16 and enforce_key_length is True:
- raise ValueError("Key length has to be at least 128 bits.")
-
- if not isinstance(length, int):
- raise TypeError("Length parameter must be an integer type.")
-
- if length < 6 or length > 8:
- raise ValueError("Length of HOTP has to be between 6 and 8.")
-
- if not isinstance(algorithm, (SHA1, SHA256, SHA512)):
- raise TypeError("Algorithm must be SHA1, SHA256 or SHA512.")
-
- self._key = key
- self._length = length
- self._algorithm = algorithm
-
- def generate(self, counter: int) -> bytes:
- if not isinstance(counter, int):
- raise TypeError("Counter parameter must be an integer type.")
-
- truncated_value = self._dynamic_truncate(counter)
- hotp = truncated_value % (10**self._length)
- return "{0:0{1}}".format(hotp, self._length).encode()
-
- def verify(self, hotp: bytes, counter: int) -> None:
- if not constant_time.bytes_eq(self.generate(counter), hotp):
- raise InvalidToken("Supplied HOTP value does not match.")
-
- def _dynamic_truncate(self, counter: int) -> int:
- ctx = hmac.HMAC(self._key, self._algorithm)
-
- try:
- ctx.update(counter.to_bytes(length=8, byteorder="big"))
- except OverflowError:
- raise ValueError(f"Counter must be between 0 and {2 ** 64 - 1}.")
-
- hmac_value = ctx.finalize()
-
- offset = hmac_value[len(hmac_value) - 1] & 0b1111
- p = hmac_value[offset : offset + 4]
- return int.from_bytes(p, byteorder="big") & 0x7FFFFFFF
-
- def get_provisioning_uri(
- self, account_name: str, counter: int, issuer: str | None
- ) -> str:
- return _generate_uri(
- self, "hotp", account_name, issuer, [("counter", int(counter))]
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/totp.py b/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/totp.py
deleted file mode 100644
index b9ed7349a..000000000
--- a/resources/python/bin/3.7/mac/cryptography/hazmat/primitives/twofactor/totp.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import typing
-
-from cryptography.hazmat.primitives import constant_time
-from cryptography.hazmat.primitives.twofactor import InvalidToken
-from cryptography.hazmat.primitives.twofactor.hotp import (
- HOTP,
- HOTPHashTypes,
- _generate_uri,
-)
-
-
-class TOTP:
- def __init__(
- self,
- key: bytes,
- length: int,
- algorithm: HOTPHashTypes,
- time_step: int,
- backend: typing.Any = None,
- enforce_key_length: bool = True,
- ):
- self._time_step = time_step
- self._hotp = HOTP(
- key, length, algorithm, enforce_key_length=enforce_key_length
- )
-
- def generate(self, time: int | float) -> bytes:
- if not isinstance(time, (int, float)):
- raise TypeError(
- "Time parameter must be an integer type or float type."
- )
-
- counter = int(time / self._time_step)
- return self._hotp.generate(counter)
-
- def verify(self, totp: bytes, time: int) -> None:
- if not constant_time.bytes_eq(self.generate(time), totp):
- raise InvalidToken("Supplied TOTP value does not match.")
-
- def get_provisioning_uri(
- self, account_name: str, issuer: str | None
- ) -> str:
- return _generate_uri(
- self._hotp,
- "totp",
- account_name,
- issuer,
- [("period", int(self._time_step))],
- )
diff --git a/resources/python/bin/3.7/mac/cryptography/py.typed b/resources/python/bin/3.7/mac/cryptography/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/python/bin/3.7/mac/cryptography/utils.py b/resources/python/bin/3.7/mac/cryptography/utils.py
deleted file mode 100644
index 706d0ae4c..000000000
--- a/resources/python/bin/3.7/mac/cryptography/utils.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import enum
-import sys
-import types
-import typing
-import warnings
-
-
-# We use a UserWarning subclass, instead of DeprecationWarning, because CPython
-# decided deprecation warnings should be invisible by default.
-class CryptographyDeprecationWarning(UserWarning):
- pass
-
-
-# Several APIs were deprecated with no specific end-of-life date because of the
-# ubiquity of their use. They should not be removed until we agree on when that
-# cycle ends.
-DeprecatedIn36 = CryptographyDeprecationWarning
-DeprecatedIn37 = CryptographyDeprecationWarning
-DeprecatedIn40 = CryptographyDeprecationWarning
-DeprecatedIn41 = CryptographyDeprecationWarning
-DeprecatedIn42 = CryptographyDeprecationWarning
-DeprecatedIn43 = CryptographyDeprecationWarning
-
-
-def _check_bytes(name: str, value: bytes) -> None:
- if not isinstance(value, bytes):
- raise TypeError(f"{name} must be bytes")
-
-
-def _check_byteslike(name: str, value: bytes) -> None:
- try:
- memoryview(value)
- except TypeError:
- raise TypeError(f"{name} must be bytes-like")
-
-
-def int_to_bytes(integer: int, length: int | None = None) -> bytes:
- if length == 0:
- raise ValueError("length argument can't be 0")
- return integer.to_bytes(
- length or (integer.bit_length() + 7) // 8 or 1, "big"
- )
-
-
-class InterfaceNotImplemented(Exception):
- pass
-
-
-class _DeprecatedValue:
- def __init__(self, value: object, message: str, warning_class):
- self.value = value
- self.message = message
- self.warning_class = warning_class
-
-
-class _ModuleWithDeprecations(types.ModuleType):
- def __init__(self, module: types.ModuleType):
- super().__init__(module.__name__)
- self.__dict__["_module"] = module
-
- def __getattr__(self, attr: str) -> object:
- obj = getattr(self._module, attr)
- if isinstance(obj, _DeprecatedValue):
- warnings.warn(obj.message, obj.warning_class, stacklevel=2)
- obj = obj.value
- return obj
-
- def __setattr__(self, attr: str, value: object) -> None:
- setattr(self._module, attr, value)
-
- def __delattr__(self, attr: str) -> None:
- obj = getattr(self._module, attr)
- if isinstance(obj, _DeprecatedValue):
- warnings.warn(obj.message, obj.warning_class, stacklevel=2)
-
- delattr(self._module, attr)
-
- def __dir__(self) -> typing.Sequence[str]:
- return ["_module", *dir(self._module)]
-
-
-def deprecated(
- value: object,
- module_name: str,
- message: str,
- warning_class: type[Warning],
- name: str | None = None,
-) -> _DeprecatedValue:
- module = sys.modules[module_name]
- if not isinstance(module, _ModuleWithDeprecations):
- sys.modules[module_name] = module = _ModuleWithDeprecations(module)
- dv = _DeprecatedValue(value, message, warning_class)
- # Maintain backwards compatibility with `name is None` for pyOpenSSL.
- if name is not None:
- setattr(module, name, dv)
- return dv
-
-
-def cached_property(func: typing.Callable) -> property:
- cached_name = f"_cached_{func}"
- sentinel = object()
-
- def inner(instance: object):
- cache = getattr(instance, cached_name, sentinel)
- if cache is not sentinel:
- return cache
- result = func(instance)
- setattr(instance, cached_name, result)
- return result
-
- return property(inner)
-
-
-# Python 3.10 changed representation of enums. We use well-defined object
-# representation and string representation from Python 3.9.
-class Enum(enum.Enum):
- def __repr__(self) -> str:
- return f"<{self.__class__.__name__}.{self._name_}: {self._value_!r}>"
-
- def __str__(self) -> str:
- return f"{self.__class__.__name__}.{self._name_}"
diff --git a/resources/python/bin/3.7/mac/cryptography/x509/__init__.py b/resources/python/bin/3.7/mac/cryptography/x509/__init__.py
deleted file mode 100644
index 8a89d67f1..000000000
--- a/resources/python/bin/3.7/mac/cryptography/x509/__init__.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography.x509 import certificate_transparency, verification
-from cryptography.x509.base import (
- Attribute,
- AttributeNotFound,
- Attributes,
- Certificate,
- CertificateBuilder,
- CertificateRevocationList,
- CertificateRevocationListBuilder,
- CertificateSigningRequest,
- CertificateSigningRequestBuilder,
- InvalidVersion,
- RevokedCertificate,
- RevokedCertificateBuilder,
- Version,
- load_der_x509_certificate,
- load_der_x509_crl,
- load_der_x509_csr,
- load_pem_x509_certificate,
- load_pem_x509_certificates,
- load_pem_x509_crl,
- load_pem_x509_csr,
- random_serial_number,
-)
-from cryptography.x509.extensions import (
- AccessDescription,
- Admission,
- Admissions,
- AuthorityInformationAccess,
- AuthorityKeyIdentifier,
- BasicConstraints,
- CertificateIssuer,
- CertificatePolicies,
- CRLDistributionPoints,
- CRLNumber,
- CRLReason,
- DeltaCRLIndicator,
- DistributionPoint,
- DuplicateExtension,
- ExtendedKeyUsage,
- Extension,
- ExtensionNotFound,
- Extensions,
- ExtensionType,
- FreshestCRL,
- GeneralNames,
- InhibitAnyPolicy,
- InvalidityDate,
- IssuerAlternativeName,
- IssuingDistributionPoint,
- KeyUsage,
- MSCertificateTemplate,
- NameConstraints,
- NamingAuthority,
- NoticeReference,
- OCSPAcceptableResponses,
- OCSPNoCheck,
- OCSPNonce,
- PolicyConstraints,
- PolicyInformation,
- PrecertificateSignedCertificateTimestamps,
- PrecertPoison,
- ProfessionInfo,
- ReasonFlags,
- SignedCertificateTimestamps,
- SubjectAlternativeName,
- SubjectInformationAccess,
- SubjectKeyIdentifier,
- TLSFeature,
- TLSFeatureType,
- UnrecognizedExtension,
- UserNotice,
-)
-from cryptography.x509.general_name import (
- DirectoryName,
- DNSName,
- GeneralName,
- IPAddress,
- OtherName,
- RegisteredID,
- RFC822Name,
- UniformResourceIdentifier,
- UnsupportedGeneralNameType,
-)
-from cryptography.x509.name import (
- Name,
- NameAttribute,
- RelativeDistinguishedName,
-)
-from cryptography.x509.oid import (
- AuthorityInformationAccessOID,
- CertificatePoliciesOID,
- CRLEntryExtensionOID,
- ExtendedKeyUsageOID,
- ExtensionOID,
- NameOID,
- ObjectIdentifier,
- PublicKeyAlgorithmOID,
- SignatureAlgorithmOID,
-)
-
-OID_AUTHORITY_INFORMATION_ACCESS = ExtensionOID.AUTHORITY_INFORMATION_ACCESS
-OID_AUTHORITY_KEY_IDENTIFIER = ExtensionOID.AUTHORITY_KEY_IDENTIFIER
-OID_BASIC_CONSTRAINTS = ExtensionOID.BASIC_CONSTRAINTS
-OID_CERTIFICATE_POLICIES = ExtensionOID.CERTIFICATE_POLICIES
-OID_CRL_DISTRIBUTION_POINTS = ExtensionOID.CRL_DISTRIBUTION_POINTS
-OID_EXTENDED_KEY_USAGE = ExtensionOID.EXTENDED_KEY_USAGE
-OID_FRESHEST_CRL = ExtensionOID.FRESHEST_CRL
-OID_INHIBIT_ANY_POLICY = ExtensionOID.INHIBIT_ANY_POLICY
-OID_ISSUER_ALTERNATIVE_NAME = ExtensionOID.ISSUER_ALTERNATIVE_NAME
-OID_KEY_USAGE = ExtensionOID.KEY_USAGE
-OID_NAME_CONSTRAINTS = ExtensionOID.NAME_CONSTRAINTS
-OID_OCSP_NO_CHECK = ExtensionOID.OCSP_NO_CHECK
-OID_POLICY_CONSTRAINTS = ExtensionOID.POLICY_CONSTRAINTS
-OID_POLICY_MAPPINGS = ExtensionOID.POLICY_MAPPINGS
-OID_SUBJECT_ALTERNATIVE_NAME = ExtensionOID.SUBJECT_ALTERNATIVE_NAME
-OID_SUBJECT_DIRECTORY_ATTRIBUTES = ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES
-OID_SUBJECT_INFORMATION_ACCESS = ExtensionOID.SUBJECT_INFORMATION_ACCESS
-OID_SUBJECT_KEY_IDENTIFIER = ExtensionOID.SUBJECT_KEY_IDENTIFIER
-
-OID_DSA_WITH_SHA1 = SignatureAlgorithmOID.DSA_WITH_SHA1
-OID_DSA_WITH_SHA224 = SignatureAlgorithmOID.DSA_WITH_SHA224
-OID_DSA_WITH_SHA256 = SignatureAlgorithmOID.DSA_WITH_SHA256
-OID_ECDSA_WITH_SHA1 = SignatureAlgorithmOID.ECDSA_WITH_SHA1
-OID_ECDSA_WITH_SHA224 = SignatureAlgorithmOID.ECDSA_WITH_SHA224
-OID_ECDSA_WITH_SHA256 = SignatureAlgorithmOID.ECDSA_WITH_SHA256
-OID_ECDSA_WITH_SHA384 = SignatureAlgorithmOID.ECDSA_WITH_SHA384
-OID_ECDSA_WITH_SHA512 = SignatureAlgorithmOID.ECDSA_WITH_SHA512
-OID_RSA_WITH_MD5 = SignatureAlgorithmOID.RSA_WITH_MD5
-OID_RSA_WITH_SHA1 = SignatureAlgorithmOID.RSA_WITH_SHA1
-OID_RSA_WITH_SHA224 = SignatureAlgorithmOID.RSA_WITH_SHA224
-OID_RSA_WITH_SHA256 = SignatureAlgorithmOID.RSA_WITH_SHA256
-OID_RSA_WITH_SHA384 = SignatureAlgorithmOID.RSA_WITH_SHA384
-OID_RSA_WITH_SHA512 = SignatureAlgorithmOID.RSA_WITH_SHA512
-OID_RSASSA_PSS = SignatureAlgorithmOID.RSASSA_PSS
-
-OID_COMMON_NAME = NameOID.COMMON_NAME
-OID_COUNTRY_NAME = NameOID.COUNTRY_NAME
-OID_DOMAIN_COMPONENT = NameOID.DOMAIN_COMPONENT
-OID_DN_QUALIFIER = NameOID.DN_QUALIFIER
-OID_EMAIL_ADDRESS = NameOID.EMAIL_ADDRESS
-OID_GENERATION_QUALIFIER = NameOID.GENERATION_QUALIFIER
-OID_GIVEN_NAME = NameOID.GIVEN_NAME
-OID_LOCALITY_NAME = NameOID.LOCALITY_NAME
-OID_ORGANIZATIONAL_UNIT_NAME = NameOID.ORGANIZATIONAL_UNIT_NAME
-OID_ORGANIZATION_NAME = NameOID.ORGANIZATION_NAME
-OID_PSEUDONYM = NameOID.PSEUDONYM
-OID_SERIAL_NUMBER = NameOID.SERIAL_NUMBER
-OID_STATE_OR_PROVINCE_NAME = NameOID.STATE_OR_PROVINCE_NAME
-OID_SURNAME = NameOID.SURNAME
-OID_TITLE = NameOID.TITLE
-
-OID_CLIENT_AUTH = ExtendedKeyUsageOID.CLIENT_AUTH
-OID_CODE_SIGNING = ExtendedKeyUsageOID.CODE_SIGNING
-OID_EMAIL_PROTECTION = ExtendedKeyUsageOID.EMAIL_PROTECTION
-OID_OCSP_SIGNING = ExtendedKeyUsageOID.OCSP_SIGNING
-OID_SERVER_AUTH = ExtendedKeyUsageOID.SERVER_AUTH
-OID_TIME_STAMPING = ExtendedKeyUsageOID.TIME_STAMPING
-
-OID_ANY_POLICY = CertificatePoliciesOID.ANY_POLICY
-OID_CPS_QUALIFIER = CertificatePoliciesOID.CPS_QUALIFIER
-OID_CPS_USER_NOTICE = CertificatePoliciesOID.CPS_USER_NOTICE
-
-OID_CERTIFICATE_ISSUER = CRLEntryExtensionOID.CERTIFICATE_ISSUER
-OID_CRL_REASON = CRLEntryExtensionOID.CRL_REASON
-OID_INVALIDITY_DATE = CRLEntryExtensionOID.INVALIDITY_DATE
-
-OID_CA_ISSUERS = AuthorityInformationAccessOID.CA_ISSUERS
-OID_OCSP = AuthorityInformationAccessOID.OCSP
-
-__all__ = [
- "OID_CA_ISSUERS",
- "OID_OCSP",
- "AccessDescription",
- "Admission",
- "Admissions",
- "Attribute",
- "AttributeNotFound",
- "Attributes",
- "AuthorityInformationAccess",
- "AuthorityKeyIdentifier",
- "BasicConstraints",
- "CRLDistributionPoints",
- "CRLNumber",
- "CRLReason",
- "Certificate",
- "CertificateBuilder",
- "CertificateIssuer",
- "CertificatePolicies",
- "CertificateRevocationList",
- "CertificateRevocationListBuilder",
- "CertificateSigningRequest",
- "CertificateSigningRequestBuilder",
- "DNSName",
- "DeltaCRLIndicator",
- "DirectoryName",
- "DistributionPoint",
- "DuplicateExtension",
- "ExtendedKeyUsage",
- "Extension",
- "ExtensionNotFound",
- "ExtensionType",
- "Extensions",
- "FreshestCRL",
- "GeneralName",
- "GeneralNames",
- "IPAddress",
- "InhibitAnyPolicy",
- "InvalidVersion",
- "InvalidityDate",
- "IssuerAlternativeName",
- "IssuingDistributionPoint",
- "KeyUsage",
- "MSCertificateTemplate",
- "Name",
- "NameAttribute",
- "NameConstraints",
- "NameOID",
- "NamingAuthority",
- "NoticeReference",
- "OCSPAcceptableResponses",
- "OCSPNoCheck",
- "OCSPNonce",
- "ObjectIdentifier",
- "OtherName",
- "PolicyConstraints",
- "PolicyInformation",
- "PrecertPoison",
- "PrecertificateSignedCertificateTimestamps",
- "ProfessionInfo",
- "PublicKeyAlgorithmOID",
- "RFC822Name",
- "ReasonFlags",
- "RegisteredID",
- "RelativeDistinguishedName",
- "RevokedCertificate",
- "RevokedCertificateBuilder",
- "SignatureAlgorithmOID",
- "SignedCertificateTimestamps",
- "SubjectAlternativeName",
- "SubjectInformationAccess",
- "SubjectKeyIdentifier",
- "TLSFeature",
- "TLSFeatureType",
- "UniformResourceIdentifier",
- "UnrecognizedExtension",
- "UnsupportedGeneralNameType",
- "UserNotice",
- "Version",
- "certificate_transparency",
- "load_der_x509_certificate",
- "load_der_x509_crl",
- "load_der_x509_csr",
- "load_pem_x509_certificate",
- "load_pem_x509_certificates",
- "load_pem_x509_crl",
- "load_pem_x509_csr",
- "random_serial_number",
- "verification",
- "verification",
-]
diff --git a/resources/python/bin/3.7/mac/cryptography/x509/base.py b/resources/python/bin/3.7/mac/cryptography/x509/base.py
deleted file mode 100644
index 25b317af6..000000000
--- a/resources/python/bin/3.7/mac/cryptography/x509/base.py
+++ /dev/null
@@ -1,815 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import datetime
-import os
-import typing
-import warnings
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.hazmat.primitives import hashes
-from cryptography.hazmat.primitives.asymmetric import (
- dsa,
- ec,
- ed448,
- ed25519,
- padding,
- rsa,
- x448,
- x25519,
-)
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPrivateKeyTypes,
- CertificatePublicKeyTypes,
-)
-from cryptography.x509.extensions import (
- Extension,
- Extensions,
- ExtensionType,
- _make_sequence_methods,
-)
-from cryptography.x509.name import Name, _ASN1Type
-from cryptography.x509.oid import ObjectIdentifier
-
-_EARLIEST_UTC_TIME = datetime.datetime(1950, 1, 1)
-
-# This must be kept in sync with sign.rs's list of allowable types in
-# identify_hash_type
-_AllowedHashTypes = typing.Union[
- hashes.SHA224,
- hashes.SHA256,
- hashes.SHA384,
- hashes.SHA512,
- hashes.SHA3_224,
- hashes.SHA3_256,
- hashes.SHA3_384,
- hashes.SHA3_512,
-]
-
-
-class AttributeNotFound(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-def _reject_duplicate_extension(
- extension: Extension[ExtensionType],
- extensions: list[Extension[ExtensionType]],
-) -> None:
- # This is quadratic in the number of extensions
- for e in extensions:
- if e.oid == extension.oid:
- raise ValueError("This extension has already been set.")
-
-
-def _reject_duplicate_attribute(
- oid: ObjectIdentifier,
- attributes: list[tuple[ObjectIdentifier, bytes, int | None]],
-) -> None:
- # This is quadratic in the number of attributes
- for attr_oid, _, _ in attributes:
- if attr_oid == oid:
- raise ValueError("This attribute has already been set.")
-
-
-def _convert_to_naive_utc_time(time: datetime.datetime) -> datetime.datetime:
- """Normalizes a datetime to a naive datetime in UTC.
-
- time -- datetime to normalize. Assumed to be in UTC if not timezone
- aware.
- """
- if time.tzinfo is not None:
- offset = time.utcoffset()
- offset = offset if offset else datetime.timedelta()
- return time.replace(tzinfo=None) - offset
- else:
- return time
-
-
-class Attribute:
- def __init__(
- self,
- oid: ObjectIdentifier,
- value: bytes,
- _type: int = _ASN1Type.UTF8String.value,
- ) -> None:
- self._oid = oid
- self._value = value
- self._type = _type
-
- @property
- def oid(self) -> ObjectIdentifier:
- return self._oid
-
- @property
- def value(self) -> bytes:
- return self._value
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, Attribute):
- return NotImplemented
-
- return (
- self.oid == other.oid
- and self.value == other.value
- and self._type == other._type
- )
-
- def __hash__(self) -> int:
- return hash((self.oid, self.value, self._type))
-
-
-class Attributes:
- def __init__(
- self,
- attributes: typing.Iterable[Attribute],
- ) -> None:
- self._attributes = list(attributes)
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_attributes")
-
- def __repr__(self) -> str:
- return f""
-
- def get_attribute_for_oid(self, oid: ObjectIdentifier) -> Attribute:
- for attr in self:
- if attr.oid == oid:
- return attr
-
- raise AttributeNotFound(f"No {oid} attribute was found", oid)
-
-
-class Version(utils.Enum):
- v1 = 0
- v3 = 2
-
-
-class InvalidVersion(Exception):
- def __init__(self, msg: str, parsed_version: int) -> None:
- super().__init__(msg)
- self.parsed_version = parsed_version
-
-
-Certificate = rust_x509.Certificate
-
-
-class RevokedCertificate(metaclass=abc.ABCMeta):
- @property
- @abc.abstractmethod
- def serial_number(self) -> int:
- """
- Returns the serial number of the revoked certificate.
- """
-
- @property
- @abc.abstractmethod
- def revocation_date(self) -> datetime.datetime:
- """
- Returns the date of when this certificate was revoked.
- """
-
- @property
- @abc.abstractmethod
- def revocation_date_utc(self) -> datetime.datetime:
- """
- Returns the date of when this certificate was revoked as a non-naive
- UTC datetime.
- """
-
- @property
- @abc.abstractmethod
- def extensions(self) -> Extensions:
- """
- Returns an Extensions object containing a list of Revoked extensions.
- """
-
-
-# Runtime isinstance checks need this since the rust class is not a subclass.
-RevokedCertificate.register(rust_x509.RevokedCertificate)
-
-
-class _RawRevokedCertificate(RevokedCertificate):
- def __init__(
- self,
- serial_number: int,
- revocation_date: datetime.datetime,
- extensions: Extensions,
- ):
- self._serial_number = serial_number
- self._revocation_date = revocation_date
- self._extensions = extensions
-
- @property
- def serial_number(self) -> int:
- return self._serial_number
-
- @property
- def revocation_date(self) -> datetime.datetime:
- warnings.warn(
- "Properties that return a naïve datetime object have been "
- "deprecated. Please switch to revocation_date_utc.",
- utils.DeprecatedIn42,
- stacklevel=2,
- )
- return self._revocation_date
-
- @property
- def revocation_date_utc(self) -> datetime.datetime:
- return self._revocation_date.replace(tzinfo=datetime.timezone.utc)
-
- @property
- def extensions(self) -> Extensions:
- return self._extensions
-
-
-CertificateRevocationList = rust_x509.CertificateRevocationList
-CertificateSigningRequest = rust_x509.CertificateSigningRequest
-
-
-load_pem_x509_certificate = rust_x509.load_pem_x509_certificate
-load_der_x509_certificate = rust_x509.load_der_x509_certificate
-
-load_pem_x509_certificates = rust_x509.load_pem_x509_certificates
-
-load_pem_x509_csr = rust_x509.load_pem_x509_csr
-load_der_x509_csr = rust_x509.load_der_x509_csr
-
-load_pem_x509_crl = rust_x509.load_pem_x509_crl
-load_der_x509_crl = rust_x509.load_der_x509_crl
-
-
-class CertificateSigningRequestBuilder:
- def __init__(
- self,
- subject_name: Name | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- attributes: list[tuple[ObjectIdentifier, bytes, int | None]] = [],
- ):
- """
- Creates an empty X.509 certificate request (v1).
- """
- self._subject_name = subject_name
- self._extensions = extensions
- self._attributes = attributes
-
- def subject_name(self, name: Name) -> CertificateSigningRequestBuilder:
- """
- Sets the certificate requestor's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._subject_name is not None:
- raise ValueError("The subject name may only be set once.")
- return CertificateSigningRequestBuilder(
- name, self._extensions, self._attributes
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateSigningRequestBuilder:
- """
- Adds an X.509 extension to the certificate request.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return CertificateSigningRequestBuilder(
- self._subject_name,
- [*self._extensions, extension],
- self._attributes,
- )
-
- def add_attribute(
- self,
- oid: ObjectIdentifier,
- value: bytes,
- *,
- _tag: _ASN1Type | None = None,
- ) -> CertificateSigningRequestBuilder:
- """
- Adds an X.509 attribute with an OID and associated value.
- """
- if not isinstance(oid, ObjectIdentifier):
- raise TypeError("oid must be an ObjectIdentifier")
-
- if not isinstance(value, bytes):
- raise TypeError("value must be bytes")
-
- if _tag is not None and not isinstance(_tag, _ASN1Type):
- raise TypeError("tag must be _ASN1Type")
-
- _reject_duplicate_attribute(oid, self._attributes)
-
- if _tag is not None:
- tag = _tag.value
- else:
- tag = None
-
- return CertificateSigningRequestBuilder(
- self._subject_name,
- self._extensions,
- [*self._attributes, (oid, value, tag)],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> CertificateSigningRequest:
- """
- Signs the request using the requestor's private key.
- """
- if self._subject_name is None:
- raise ValueError("A CertificateSigningRequest must have a subject")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_csr(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class CertificateBuilder:
- _extensions: list[Extension[ExtensionType]]
-
- def __init__(
- self,
- issuer_name: Name | None = None,
- subject_name: Name | None = None,
- public_key: CertificatePublicKeyTypes | None = None,
- serial_number: int | None = None,
- not_valid_before: datetime.datetime | None = None,
- not_valid_after: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- ) -> None:
- self._version = Version.v3
- self._issuer_name = issuer_name
- self._subject_name = subject_name
- self._public_key = public_key
- self._serial_number = serial_number
- self._not_valid_before = not_valid_before
- self._not_valid_after = not_valid_after
- self._extensions = extensions
-
- def issuer_name(self, name: Name) -> CertificateBuilder:
- """
- Sets the CA's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._issuer_name is not None:
- raise ValueError("The issuer name may only be set once.")
- return CertificateBuilder(
- name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def subject_name(self, name: Name) -> CertificateBuilder:
- """
- Sets the requestor's distinguished name.
- """
- if not isinstance(name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._subject_name is not None:
- raise ValueError("The subject name may only be set once.")
- return CertificateBuilder(
- self._issuer_name,
- name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def public_key(
- self,
- key: CertificatePublicKeyTypes,
- ) -> CertificateBuilder:
- """
- Sets the requestor's public key (as found in the signing request).
- """
- if not isinstance(
- key,
- (
- dsa.DSAPublicKey,
- rsa.RSAPublicKey,
- ec.EllipticCurvePublicKey,
- ed25519.Ed25519PublicKey,
- ed448.Ed448PublicKey,
- x25519.X25519PublicKey,
- x448.X448PublicKey,
- ),
- ):
- raise TypeError(
- "Expecting one of DSAPublicKey, RSAPublicKey,"
- " EllipticCurvePublicKey, Ed25519PublicKey,"
- " Ed448PublicKey, X25519PublicKey, or "
- "X448PublicKey."
- )
- if self._public_key is not None:
- raise ValueError("The public key may only be set once.")
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def serial_number(self, number: int) -> CertificateBuilder:
- """
- Sets the certificate serial number.
- """
- if not isinstance(number, int):
- raise TypeError("Serial number must be of integral type.")
- if self._serial_number is not None:
- raise ValueError("The serial number may only be set once.")
- if number <= 0:
- raise ValueError("The serial number should be positive.")
-
- # ASN.1 integers are always signed, so most significant bit must be
- # zero.
- if number.bit_length() >= 160: # As defined in RFC 5280
- raise ValueError(
- "The serial number should not be more than 159 bits."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- number,
- self._not_valid_before,
- self._not_valid_after,
- self._extensions,
- )
-
- def not_valid_before(self, time: datetime.datetime) -> CertificateBuilder:
- """
- Sets the certificate activation time.
- """
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._not_valid_before is not None:
- raise ValueError("The not valid before may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The not valid before date must be on or after"
- " 1950 January 1)."
- )
- if self._not_valid_after is not None and time > self._not_valid_after:
- raise ValueError(
- "The not valid before date must be before the not valid after "
- "date."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- time,
- self._not_valid_after,
- self._extensions,
- )
-
- def not_valid_after(self, time: datetime.datetime) -> CertificateBuilder:
- """
- Sets the certificate expiration time.
- """
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._not_valid_after is not None:
- raise ValueError("The not valid after may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The not valid after date must be on or after"
- " 1950 January 1."
- )
- if (
- self._not_valid_before is not None
- and time < self._not_valid_before
- ):
- raise ValueError(
- "The not valid after date must be after the not valid before "
- "date."
- )
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- time,
- self._extensions,
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateBuilder:
- """
- Adds an X.509 extension to the certificate.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
-
- return CertificateBuilder(
- self._issuer_name,
- self._subject_name,
- self._public_key,
- self._serial_number,
- self._not_valid_before,
- self._not_valid_after,
- [*self._extensions, extension],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> Certificate:
- """
- Signs the certificate using the CA's private key.
- """
- if self._subject_name is None:
- raise ValueError("A certificate must have a subject name")
-
- if self._issuer_name is None:
- raise ValueError("A certificate must have an issuer name")
-
- if self._serial_number is None:
- raise ValueError("A certificate must have a serial number")
-
- if self._not_valid_before is None:
- raise ValueError("A certificate must have a not valid before time")
-
- if self._not_valid_after is None:
- raise ValueError("A certificate must have a not valid after time")
-
- if self._public_key is None:
- raise ValueError("A certificate must have a public key")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_certificate(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class CertificateRevocationListBuilder:
- _extensions: list[Extension[ExtensionType]]
- _revoked_certificates: list[RevokedCertificate]
-
- def __init__(
- self,
- issuer_name: Name | None = None,
- last_update: datetime.datetime | None = None,
- next_update: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- revoked_certificates: list[RevokedCertificate] = [],
- ):
- self._issuer_name = issuer_name
- self._last_update = last_update
- self._next_update = next_update
- self._extensions = extensions
- self._revoked_certificates = revoked_certificates
-
- def issuer_name(
- self, issuer_name: Name
- ) -> CertificateRevocationListBuilder:
- if not isinstance(issuer_name, Name):
- raise TypeError("Expecting x509.Name object.")
- if self._issuer_name is not None:
- raise ValueError("The issuer name may only be set once.")
- return CertificateRevocationListBuilder(
- issuer_name,
- self._last_update,
- self._next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def last_update(
- self, last_update: datetime.datetime
- ) -> CertificateRevocationListBuilder:
- if not isinstance(last_update, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._last_update is not None:
- raise ValueError("Last update may only be set once.")
- last_update = _convert_to_naive_utc_time(last_update)
- if last_update < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The last update date must be on or after 1950 January 1."
- )
- if self._next_update is not None and last_update > self._next_update:
- raise ValueError(
- "The last update date must be before the next update date."
- )
- return CertificateRevocationListBuilder(
- self._issuer_name,
- last_update,
- self._next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def next_update(
- self, next_update: datetime.datetime
- ) -> CertificateRevocationListBuilder:
- if not isinstance(next_update, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._next_update is not None:
- raise ValueError("Last update may only be set once.")
- next_update = _convert_to_naive_utc_time(next_update)
- if next_update < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The last update date must be on or after 1950 January 1."
- )
- if self._last_update is not None and next_update < self._last_update:
- raise ValueError(
- "The next update date must be after the last update date."
- )
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- next_update,
- self._extensions,
- self._revoked_certificates,
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> CertificateRevocationListBuilder:
- """
- Adds an X.509 extension to the certificate revocation list.
- """
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- self._next_update,
- [*self._extensions, extension],
- self._revoked_certificates,
- )
-
- def add_revoked_certificate(
- self, revoked_certificate: RevokedCertificate
- ) -> CertificateRevocationListBuilder:
- """
- Adds a revoked certificate to the CRL.
- """
- if not isinstance(revoked_certificate, RevokedCertificate):
- raise TypeError("Must be an instance of RevokedCertificate")
-
- return CertificateRevocationListBuilder(
- self._issuer_name,
- self._last_update,
- self._next_update,
- self._extensions,
- [*self._revoked_certificates, revoked_certificate],
- )
-
- def sign(
- self,
- private_key: CertificateIssuerPrivateKeyTypes,
- algorithm: _AllowedHashTypes | None,
- backend: typing.Any = None,
- *,
- rsa_padding: padding.PSS | padding.PKCS1v15 | None = None,
- ) -> CertificateRevocationList:
- if self._issuer_name is None:
- raise ValueError("A CRL must have an issuer name")
-
- if self._last_update is None:
- raise ValueError("A CRL must have a last update time")
-
- if self._next_update is None:
- raise ValueError("A CRL must have a next update time")
-
- if rsa_padding is not None:
- if not isinstance(rsa_padding, (padding.PSS, padding.PKCS1v15)):
- raise TypeError("Padding must be PSS or PKCS1v15")
- if not isinstance(private_key, rsa.RSAPrivateKey):
- raise TypeError("Padding is only supported for RSA keys")
-
- return rust_x509.create_x509_crl(
- self, private_key, algorithm, rsa_padding
- )
-
-
-class RevokedCertificateBuilder:
- def __init__(
- self,
- serial_number: int | None = None,
- revocation_date: datetime.datetime | None = None,
- extensions: list[Extension[ExtensionType]] = [],
- ):
- self._serial_number = serial_number
- self._revocation_date = revocation_date
- self._extensions = extensions
-
- def serial_number(self, number: int) -> RevokedCertificateBuilder:
- if not isinstance(number, int):
- raise TypeError("Serial number must be of integral type.")
- if self._serial_number is not None:
- raise ValueError("The serial number may only be set once.")
- if number <= 0:
- raise ValueError("The serial number should be positive")
-
- # ASN.1 integers are always signed, so most significant bit must be
- # zero.
- if number.bit_length() >= 160: # As defined in RFC 5280
- raise ValueError(
- "The serial number should not be more than 159 bits."
- )
- return RevokedCertificateBuilder(
- number, self._revocation_date, self._extensions
- )
-
- def revocation_date(
- self, time: datetime.datetime
- ) -> RevokedCertificateBuilder:
- if not isinstance(time, datetime.datetime):
- raise TypeError("Expecting datetime object.")
- if self._revocation_date is not None:
- raise ValueError("The revocation date may only be set once.")
- time = _convert_to_naive_utc_time(time)
- if time < _EARLIEST_UTC_TIME:
- raise ValueError(
- "The revocation date must be on or after 1950 January 1."
- )
- return RevokedCertificateBuilder(
- self._serial_number, time, self._extensions
- )
-
- def add_extension(
- self, extval: ExtensionType, critical: bool
- ) -> RevokedCertificateBuilder:
- if not isinstance(extval, ExtensionType):
- raise TypeError("extension must be an ExtensionType")
-
- extension = Extension(extval.oid, critical, extval)
- _reject_duplicate_extension(extension, self._extensions)
- return RevokedCertificateBuilder(
- self._serial_number,
- self._revocation_date,
- [*self._extensions, extension],
- )
-
- def build(self, backend: typing.Any = None) -> RevokedCertificate:
- if self._serial_number is None:
- raise ValueError("A revoked certificate must have a serial number")
- if self._revocation_date is None:
- raise ValueError(
- "A revoked certificate must have a revocation date"
- )
- return _RawRevokedCertificate(
- self._serial_number,
- self._revocation_date,
- Extensions(self._extensions),
- )
-
-
-def random_serial_number() -> int:
- return int.from_bytes(os.urandom(20), "big") >> 1
diff --git a/resources/python/bin/3.7/mac/cryptography/x509/certificate_transparency.py b/resources/python/bin/3.7/mac/cryptography/x509/certificate_transparency.py
deleted file mode 100644
index fb66cc604..000000000
--- a/resources/python/bin/3.7/mac/cryptography/x509/certificate_transparency.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-
-
-class LogEntryType(utils.Enum):
- X509_CERTIFICATE = 0
- PRE_CERTIFICATE = 1
-
-
-class Version(utils.Enum):
- v1 = 0
-
-
-class SignatureAlgorithm(utils.Enum):
- """
- Signature algorithms that are valid for SCTs.
-
- These are exactly the same as SignatureAlgorithm in RFC 5246 (TLS 1.2).
-
- See:
- """
-
- ANONYMOUS = 0
- RSA = 1
- DSA = 2
- ECDSA = 3
-
-
-SignedCertificateTimestamp = rust_x509.Sct
diff --git a/resources/python/bin/3.7/mac/cryptography/x509/extensions.py b/resources/python/bin/3.7/mac/cryptography/x509/extensions.py
deleted file mode 100644
index fc3e7730e..000000000
--- a/resources/python/bin/3.7/mac/cryptography/x509/extensions.py
+++ /dev/null
@@ -1,2477 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import annotations
-
-import abc
-import datetime
-import hashlib
-import ipaddress
-import typing
-
-from cryptography import utils
-from cryptography.hazmat.bindings._rust import asn1
-from cryptography.hazmat.bindings._rust import x509 as rust_x509
-from cryptography.hazmat.primitives import constant_time, serialization
-from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey
-from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey
-from cryptography.hazmat.primitives.asymmetric.types import (
- CertificateIssuerPublicKeyTypes,
- CertificatePublicKeyTypes,
-)
-from cryptography.x509.certificate_transparency import (
- SignedCertificateTimestamp,
-)
-from cryptography.x509.general_name import (
- DirectoryName,
- DNSName,
- GeneralName,
- IPAddress,
- OtherName,
- RegisteredID,
- RFC822Name,
- UniformResourceIdentifier,
- _IPAddressTypes,
-)
-from cryptography.x509.name import Name, RelativeDistinguishedName
-from cryptography.x509.oid import (
- CRLEntryExtensionOID,
- ExtensionOID,
- ObjectIdentifier,
- OCSPExtensionOID,
-)
-
-ExtensionTypeVar = typing.TypeVar(
- "ExtensionTypeVar", bound="ExtensionType", covariant=True
-)
-
-
-def _key_identifier_from_public_key(
- public_key: CertificatePublicKeyTypes,
-) -> bytes:
- if isinstance(public_key, RSAPublicKey):
- data = public_key.public_bytes(
- serialization.Encoding.DER,
- serialization.PublicFormat.PKCS1,
- )
- elif isinstance(public_key, EllipticCurvePublicKey):
- data = public_key.public_bytes(
- serialization.Encoding.X962,
- serialization.PublicFormat.UncompressedPoint,
- )
- else:
- # This is a very slow way to do this.
- serialized = public_key.public_bytes(
- serialization.Encoding.DER,
- serialization.PublicFormat.SubjectPublicKeyInfo,
- )
- data = asn1.parse_spki_for_data(serialized)
-
- return hashlib.sha1(data).digest()
-
-
-def _make_sequence_methods(field_name: str):
- def len_method(self) -> int:
- return len(getattr(self, field_name))
-
- def iter_method(self):
- return iter(getattr(self, field_name))
-
- def getitem_method(self, idx):
- return getattr(self, field_name)[idx]
-
- return len_method, iter_method, getitem_method
-
-
-class DuplicateExtension(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-class ExtensionNotFound(Exception):
- def __init__(self, msg: str, oid: ObjectIdentifier) -> None:
- super().__init__(msg)
- self.oid = oid
-
-
-class ExtensionType(metaclass=abc.ABCMeta):
- oid: typing.ClassVar[ObjectIdentifier]
-
- def public_bytes(self) -> bytes:
- """
- Serializes the extension type to DER.
- """
- raise NotImplementedError(
- f"public_bytes is not implemented for extension type {self!r}"
- )
-
-
-class Extensions:
- def __init__(
- self, extensions: typing.Iterable[Extension[ExtensionType]]
- ) -> None:
- self._extensions = list(extensions)
-
- def get_extension_for_oid(
- self, oid: ObjectIdentifier
- ) -> Extension[ExtensionType]:
- for ext in self:
- if ext.oid == oid:
- return ext
-
- raise ExtensionNotFound(f"No {oid} extension was found", oid)
-
- def get_extension_for_class(
- self, extclass: type[ExtensionTypeVar]
- ) -> Extension[ExtensionTypeVar]:
- if extclass is UnrecognizedExtension:
- raise TypeError(
- "UnrecognizedExtension can't be used with "
- "get_extension_for_class because more than one instance of the"
- " class may be present."
- )
-
- for ext in self:
- if isinstance(ext.value, extclass):
- return ext
-
- raise ExtensionNotFound(
- f"No {extclass} extension was found", extclass.oid
- )
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_extensions")
-
- def __repr__(self) -> str:
- return f""
-
-
-class CRLNumber(ExtensionType):
- oid = ExtensionOID.CRL_NUMBER
-
- def __init__(self, crl_number: int) -> None:
- if not isinstance(crl_number, int):
- raise TypeError("crl_number must be an integer")
-
- self._crl_number = crl_number
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CRLNumber):
- return NotImplemented
-
- return self.crl_number == other.crl_number
-
- def __hash__(self) -> int:
- return hash(self.crl_number)
-
- def __repr__(self) -> str:
- return f""
-
- @property
- def crl_number(self) -> int:
- return self._crl_number
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AuthorityKeyIdentifier(ExtensionType):
- oid = ExtensionOID.AUTHORITY_KEY_IDENTIFIER
-
- def __init__(
- self,
- key_identifier: bytes | None,
- authority_cert_issuer: typing.Iterable[GeneralName] | None,
- authority_cert_serial_number: int | None,
- ) -> None:
- if (authority_cert_issuer is None) != (
- authority_cert_serial_number is None
- ):
- raise ValueError(
- "authority_cert_issuer and authority_cert_serial_number "
- "must both be present or both None"
- )
-
- if authority_cert_issuer is not None:
- authority_cert_issuer = list(authority_cert_issuer)
- if not all(
- isinstance(x, GeneralName) for x in authority_cert_issuer
- ):
- raise TypeError(
- "authority_cert_issuer must be a list of GeneralName "
- "objects"
- )
-
- if authority_cert_serial_number is not None and not isinstance(
- authority_cert_serial_number, int
- ):
- raise TypeError("authority_cert_serial_number must be an integer")
-
- self._key_identifier = key_identifier
- self._authority_cert_issuer = authority_cert_issuer
- self._authority_cert_serial_number = authority_cert_serial_number
-
- # This takes a subset of CertificatePublicKeyTypes because an issuer
- # cannot have an X25519/X448 key. This introduces some unfortunate
- # asymmetry that requires typing users to explicitly
- # narrow their type, but we should make this accurate and not just
- # convenient.
- @classmethod
- def from_issuer_public_key(
- cls, public_key: CertificateIssuerPublicKeyTypes
- ) -> AuthorityKeyIdentifier:
- digest = _key_identifier_from_public_key(public_key)
- return cls(
- key_identifier=digest,
- authority_cert_issuer=None,
- authority_cert_serial_number=None,
- )
-
- @classmethod
- def from_issuer_subject_key_identifier(
- cls, ski: SubjectKeyIdentifier
- ) -> AuthorityKeyIdentifier:
- return cls(
- key_identifier=ski.digest,
- authority_cert_issuer=None,
- authority_cert_serial_number=None,
- )
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AuthorityKeyIdentifier):
- return NotImplemented
-
- return (
- self.key_identifier == other.key_identifier
- and self.authority_cert_issuer == other.authority_cert_issuer
- and self.authority_cert_serial_number
- == other.authority_cert_serial_number
- )
-
- def __hash__(self) -> int:
- if self.authority_cert_issuer is None:
- aci = None
- else:
- aci = tuple(self.authority_cert_issuer)
- return hash(
- (self.key_identifier, aci, self.authority_cert_serial_number)
- )
-
- @property
- def key_identifier(self) -> bytes | None:
- return self._key_identifier
-
- @property
- def authority_cert_issuer(
- self,
- ) -> list[GeneralName] | None:
- return self._authority_cert_issuer
-
- @property
- def authority_cert_serial_number(self) -> int | None:
- return self._authority_cert_serial_number
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class SubjectKeyIdentifier(ExtensionType):
- oid = ExtensionOID.SUBJECT_KEY_IDENTIFIER
-
- def __init__(self, digest: bytes) -> None:
- self._digest = digest
-
- @classmethod
- def from_public_key(
- cls, public_key: CertificatePublicKeyTypes
- ) -> SubjectKeyIdentifier:
- return cls(_key_identifier_from_public_key(public_key))
-
- @property
- def digest(self) -> bytes:
- return self._digest
-
- @property
- def key_identifier(self) -> bytes:
- return self._digest
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SubjectKeyIdentifier):
- return NotImplemented
-
- return constant_time.bytes_eq(self.digest, other.digest)
-
- def __hash__(self) -> int:
- return hash(self.digest)
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AuthorityInformationAccess(ExtensionType):
- oid = ExtensionOID.AUTHORITY_INFORMATION_ACCESS
-
- def __init__(
- self, descriptions: typing.Iterable[AccessDescription]
- ) -> None:
- descriptions = list(descriptions)
- if not all(isinstance(x, AccessDescription) for x in descriptions):
- raise TypeError(
- "Every item in the descriptions list must be an "
- "AccessDescription"
- )
-
- self._descriptions = descriptions
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_descriptions")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AuthorityInformationAccess):
- return NotImplemented
-
- return self._descriptions == other._descriptions
-
- def __hash__(self) -> int:
- return hash(tuple(self._descriptions))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class SubjectInformationAccess(ExtensionType):
- oid = ExtensionOID.SUBJECT_INFORMATION_ACCESS
-
- def __init__(
- self, descriptions: typing.Iterable[AccessDescription]
- ) -> None:
- descriptions = list(descriptions)
- if not all(isinstance(x, AccessDescription) for x in descriptions):
- raise TypeError(
- "Every item in the descriptions list must be an "
- "AccessDescription"
- )
-
- self._descriptions = descriptions
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_descriptions")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, SubjectInformationAccess):
- return NotImplemented
-
- return self._descriptions == other._descriptions
-
- def __hash__(self) -> int:
- return hash(tuple(self._descriptions))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class AccessDescription:
- def __init__(
- self, access_method: ObjectIdentifier, access_location: GeneralName
- ) -> None:
- if not isinstance(access_method, ObjectIdentifier):
- raise TypeError("access_method must be an ObjectIdentifier")
-
- if not isinstance(access_location, GeneralName):
- raise TypeError("access_location must be a GeneralName")
-
- self._access_method = access_method
- self._access_location = access_location
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, AccessDescription):
- return NotImplemented
-
- return (
- self.access_method == other.access_method
- and self.access_location == other.access_location
- )
-
- def __hash__(self) -> int:
- return hash((self.access_method, self.access_location))
-
- @property
- def access_method(self) -> ObjectIdentifier:
- return self._access_method
-
- @property
- def access_location(self) -> GeneralName:
- return self._access_location
-
-
-class BasicConstraints(ExtensionType):
- oid = ExtensionOID.BASIC_CONSTRAINTS
-
- def __init__(self, ca: bool, path_length: int | None) -> None:
- if not isinstance(ca, bool):
- raise TypeError("ca must be a boolean value")
-
- if path_length is not None and not ca:
- raise ValueError("path_length must be None when ca is False")
-
- if path_length is not None and (
- not isinstance(path_length, int) or path_length < 0
- ):
- raise TypeError(
- "path_length must be a non-negative integer or None"
- )
-
- self._ca = ca
- self._path_length = path_length
-
- @property
- def ca(self) -> bool:
- return self._ca
-
- @property
- def path_length(self) -> int | None:
- return self._path_length
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, BasicConstraints):
- return NotImplemented
-
- return self.ca == other.ca and self.path_length == other.path_length
-
- def __hash__(self) -> int:
- return hash((self.ca, self.path_length))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class DeltaCRLIndicator(ExtensionType):
- oid = ExtensionOID.DELTA_CRL_INDICATOR
-
- def __init__(self, crl_number: int) -> None:
- if not isinstance(crl_number, int):
- raise TypeError("crl_number must be an integer")
-
- self._crl_number = crl_number
-
- @property
- def crl_number(self) -> int:
- return self._crl_number
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DeltaCRLIndicator):
- return NotImplemented
-
- return self.crl_number == other.crl_number
-
- def __hash__(self) -> int:
- return hash(self.crl_number)
-
- def __repr__(self) -> str:
- return f""
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CRLDistributionPoints(ExtensionType):
- oid = ExtensionOID.CRL_DISTRIBUTION_POINTS
-
- def __init__(
- self, distribution_points: typing.Iterable[DistributionPoint]
- ) -> None:
- distribution_points = list(distribution_points)
- if not all(
- isinstance(x, DistributionPoint) for x in distribution_points
- ):
- raise TypeError(
- "distribution_points must be a list of DistributionPoint "
- "objects"
- )
-
- self._distribution_points = distribution_points
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_distribution_points"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CRLDistributionPoints):
- return NotImplemented
-
- return self._distribution_points == other._distribution_points
-
- def __hash__(self) -> int:
- return hash(tuple(self._distribution_points))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class FreshestCRL(ExtensionType):
- oid = ExtensionOID.FRESHEST_CRL
-
- def __init__(
- self, distribution_points: typing.Iterable[DistributionPoint]
- ) -> None:
- distribution_points = list(distribution_points)
- if not all(
- isinstance(x, DistributionPoint) for x in distribution_points
- ):
- raise TypeError(
- "distribution_points must be a list of DistributionPoint "
- "objects"
- )
-
- self._distribution_points = distribution_points
-
- __len__, __iter__, __getitem__ = _make_sequence_methods(
- "_distribution_points"
- )
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, FreshestCRL):
- return NotImplemented
-
- return self._distribution_points == other._distribution_points
-
- def __hash__(self) -> int:
- return hash(tuple(self._distribution_points))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class DistributionPoint:
- def __init__(
- self,
- full_name: typing.Iterable[GeneralName] | None,
- relative_name: RelativeDistinguishedName | None,
- reasons: frozenset[ReasonFlags] | None,
- crl_issuer: typing.Iterable[GeneralName] | None,
- ) -> None:
- if full_name and relative_name:
- raise ValueError(
- "You cannot provide both full_name and relative_name, at "
- "least one must be None."
- )
- if not full_name and not relative_name and not crl_issuer:
- raise ValueError(
- "Either full_name, relative_name or crl_issuer must be "
- "provided."
- )
-
- if full_name is not None:
- full_name = list(full_name)
- if not all(isinstance(x, GeneralName) for x in full_name):
- raise TypeError(
- "full_name must be a list of GeneralName objects"
- )
-
- if relative_name:
- if not isinstance(relative_name, RelativeDistinguishedName):
- raise TypeError(
- "relative_name must be a RelativeDistinguishedName"
- )
-
- if crl_issuer is not None:
- crl_issuer = list(crl_issuer)
- if not all(isinstance(x, GeneralName) for x in crl_issuer):
- raise TypeError(
- "crl_issuer must be None or a list of general names"
- )
-
- if reasons and (
- not isinstance(reasons, frozenset)
- or not all(isinstance(x, ReasonFlags) for x in reasons)
- ):
- raise TypeError("reasons must be None or frozenset of ReasonFlags")
-
- if reasons and (
- ReasonFlags.unspecified in reasons
- or ReasonFlags.remove_from_crl in reasons
- ):
- raise ValueError(
- "unspecified and remove_from_crl are not valid reasons in a "
- "DistributionPoint"
- )
-
- self._full_name = full_name
- self._relative_name = relative_name
- self._reasons = reasons
- self._crl_issuer = crl_issuer
-
- def __repr__(self) -> str:
- return (
- "".format(self)
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, DistributionPoint):
- return NotImplemented
-
- return (
- self.full_name == other.full_name
- and self.relative_name == other.relative_name
- and self.reasons == other.reasons
- and self.crl_issuer == other.crl_issuer
- )
-
- def __hash__(self) -> int:
- if self.full_name is not None:
- fn: tuple[GeneralName, ...] | None = tuple(self.full_name)
- else:
- fn = None
-
- if self.crl_issuer is not None:
- crl_issuer: tuple[GeneralName, ...] | None = tuple(self.crl_issuer)
- else:
- crl_issuer = None
-
- return hash((fn, self.relative_name, self.reasons, crl_issuer))
-
- @property
- def full_name(self) -> list[GeneralName] | None:
- return self._full_name
-
- @property
- def relative_name(self) -> RelativeDistinguishedName | None:
- return self._relative_name
-
- @property
- def reasons(self) -> frozenset[ReasonFlags] | None:
- return self._reasons
-
- @property
- def crl_issuer(self) -> list[GeneralName] | None:
- return self._crl_issuer
-
-
-class ReasonFlags(utils.Enum):
- unspecified = "unspecified"
- key_compromise = "keyCompromise"
- ca_compromise = "cACompromise"
- affiliation_changed = "affiliationChanged"
- superseded = "superseded"
- cessation_of_operation = "cessationOfOperation"
- certificate_hold = "certificateHold"
- privilege_withdrawn = "privilegeWithdrawn"
- aa_compromise = "aACompromise"
- remove_from_crl = "removeFromCRL"
-
-
-# These are distribution point bit string mappings. Not to be confused with
-# CRLReason reason flags bit string mappings.
-# ReasonFlags ::= BIT STRING {
-# unused (0),
-# keyCompromise (1),
-# cACompromise (2),
-# affiliationChanged (3),
-# superseded (4),
-# cessationOfOperation (5),
-# certificateHold (6),
-# privilegeWithdrawn (7),
-# aACompromise (8) }
-_REASON_BIT_MAPPING = {
- 1: ReasonFlags.key_compromise,
- 2: ReasonFlags.ca_compromise,
- 3: ReasonFlags.affiliation_changed,
- 4: ReasonFlags.superseded,
- 5: ReasonFlags.cessation_of_operation,
- 6: ReasonFlags.certificate_hold,
- 7: ReasonFlags.privilege_withdrawn,
- 8: ReasonFlags.aa_compromise,
-}
-
-_CRLREASONFLAGS = {
- ReasonFlags.key_compromise: 1,
- ReasonFlags.ca_compromise: 2,
- ReasonFlags.affiliation_changed: 3,
- ReasonFlags.superseded: 4,
- ReasonFlags.cessation_of_operation: 5,
- ReasonFlags.certificate_hold: 6,
- ReasonFlags.privilege_withdrawn: 7,
- ReasonFlags.aa_compromise: 8,
-}
-
-# CRLReason ::= ENUMERATED {
-# unspecified (0),
-# keyCompromise (1),
-# cACompromise (2),
-# affiliationChanged (3),
-# superseded (4),
-# cessationOfOperation (5),
-# certificateHold (6),
-# -- value 7 is not used
-# removeFromCRL (8),
-# privilegeWithdrawn (9),
-# aACompromise (10) }
-_CRL_ENTRY_REASON_ENUM_TO_CODE = {
- ReasonFlags.unspecified: 0,
- ReasonFlags.key_compromise: 1,
- ReasonFlags.ca_compromise: 2,
- ReasonFlags.affiliation_changed: 3,
- ReasonFlags.superseded: 4,
- ReasonFlags.cessation_of_operation: 5,
- ReasonFlags.certificate_hold: 6,
- ReasonFlags.remove_from_crl: 8,
- ReasonFlags.privilege_withdrawn: 9,
- ReasonFlags.aa_compromise: 10,
-}
-
-
-class PolicyConstraints(ExtensionType):
- oid = ExtensionOID.POLICY_CONSTRAINTS
-
- def __init__(
- self,
- require_explicit_policy: int | None,
- inhibit_policy_mapping: int | None,
- ) -> None:
- if require_explicit_policy is not None and not isinstance(
- require_explicit_policy, int
- ):
- raise TypeError(
- "require_explicit_policy must be a non-negative integer or "
- "None"
- )
-
- if inhibit_policy_mapping is not None and not isinstance(
- inhibit_policy_mapping, int
- ):
- raise TypeError(
- "inhibit_policy_mapping must be a non-negative integer or None"
- )
-
- if inhibit_policy_mapping is None and require_explicit_policy is None:
- raise ValueError(
- "At least one of require_explicit_policy and "
- "inhibit_policy_mapping must not be None"
- )
-
- self._require_explicit_policy = require_explicit_policy
- self._inhibit_policy_mapping = inhibit_policy_mapping
-
- def __repr__(self) -> str:
- return (
- "".format(self)
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PolicyConstraints):
- return NotImplemented
-
- return (
- self.require_explicit_policy == other.require_explicit_policy
- and self.inhibit_policy_mapping == other.inhibit_policy_mapping
- )
-
- def __hash__(self) -> int:
- return hash(
- (self.require_explicit_policy, self.inhibit_policy_mapping)
- )
-
- @property
- def require_explicit_policy(self) -> int | None:
- return self._require_explicit_policy
-
- @property
- def inhibit_policy_mapping(self) -> int | None:
- return self._inhibit_policy_mapping
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class CertificatePolicies(ExtensionType):
- oid = ExtensionOID.CERTIFICATE_POLICIES
-
- def __init__(self, policies: typing.Iterable[PolicyInformation]) -> None:
- policies = list(policies)
- if not all(isinstance(x, PolicyInformation) for x in policies):
- raise TypeError(
- "Every item in the policies list must be a "
- "PolicyInformation"
- )
-
- self._policies = policies
-
- __len__, __iter__, __getitem__ = _make_sequence_methods("_policies")
-
- def __repr__(self) -> str:
- return f""
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CertificatePolicies):
- return NotImplemented
-
- return self._policies == other._policies
-
- def __hash__(self) -> int:
- return hash(tuple(self._policies))
-
- def public_bytes(self) -> bytes:
- return rust_x509.encode_extension_value(self)
-
-
-class PolicyInformation:
- def __init__(
- self,
- policy_identifier: ObjectIdentifier,
- policy_qualifiers: typing.Iterable[str | UserNotice] | None,
- ) -> None:
- if not isinstance(policy_identifier, ObjectIdentifier):
- raise TypeError("policy_identifier must be an ObjectIdentifier")
-
- self._policy_identifier = policy_identifier
-
- if policy_qualifiers is not None:
- policy_qualifiers = list(policy_qualifiers)
- if not all(
- isinstance(x, (str, UserNotice)) for x in policy_qualifiers
- ):
- raise TypeError(
- "policy_qualifiers must be a list of strings and/or "
- "UserNotice objects or None"
- )
-
- self._policy_qualifiers = policy_qualifiers
-
- def __repr__(self) -> str:
- return (
- f""
- )
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, PolicyInformation):
- return NotImplemented
-
- return (
- self.policy_identifier == other.policy_identifier
- and self.policy_qualifiers == other.policy_qualifiers
- )
-
- def __hash__(self) -> int:
- if self.policy_qualifiers is not None:
- pq = tuple(self.policy_qualifiers)
- else:
- pq = None
-
- return hash((self.policy_identifier, pq))
-
- @property
- def policy_identifier(self) -> ObjectIdentifier:
- return self._policy_identifier
-
- @property
- def policy_qualifiers(
- self,
- ) -> list[str | UserNotice] | None:
- return self._policy_qualifiers
-
-
-class UserNotice:
- def __init__(
- self,
- notice_reference: NoticeReference | None,
- explicit_text: str | None,
- ) -> None:
- if notice_reference and not isinstance(
- notice_reference, NoticeReference
- ):
- raise TypeError(
- "notice_reference must be None or a NoticeReference"
- )
-
- self._notice_reference = notice_reference
- self._explicit_text = explicit_text
-
- def __repr__(self) -> str:
- return (
- f"