aboutsummaryrefslogtreecommitdiff
path: root/frozen_deps/Crypto
diff options
context:
space:
mode:
authorDeterminant <[email protected]>2020-11-17 20:04:09 -0500
committerDeterminant <[email protected]>2020-11-17 20:04:09 -0500
commitc4d90bf4ea0c5b7a016028ed994de19638d3113b (patch)
tree693279a91311155f565e90ecd2d93bf701d6d4e9 /frozen_deps/Crypto
parent3bef51eec2299403467e621ae660cef3f9256ac8 (diff)
support saving as a keystore file
Diffstat (limited to 'frozen_deps/Crypto')
-rw-r--r--frozen_deps/Crypto/Cipher/AES.py115
-rw-r--r--frozen_deps/Crypto/Cipher/ARC2.py130
-rw-r--r--frozen_deps/Crypto/Cipher/ARC4.py120
-rw-r--r--frozen_deps/Crypto/Cipher/Blowfish.py121
-rw-r--r--frozen_deps/Crypto/Cipher/CAST.py123
-rw-r--r--frozen_deps/Crypto/Cipher/DES.py118
-rw-r--r--frozen_deps/Crypto/Cipher/DES3.py133
-rw-r--r--frozen_deps/Crypto/Cipher/PKCS1_OAEP.py255
-rw-r--r--frozen_deps/Crypto/Cipher/PKCS1_v1_5.py226
-rw-r--r--frozen_deps/Crypto/Cipher/XOR.py86
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_AES.cpython-38-x86_64-linux-gnu.sobin43640 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_ARC2.cpython-38-x86_64-linux-gnu.sobin26904 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_ARC4.cpython-38-x86_64-linux-gnu.sobin18064 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_Blowfish.cpython-38-x86_64-linux-gnu.sobin35368 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_CAST.cpython-38-x86_64-linux-gnu.sobin35320 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_DES.cpython-38-x86_64-linux-gnu.sobin68560 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_DES3.cpython-38-x86_64-linux-gnu.sobin68560 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Cipher/_XOR.cpython-38-x86_64-linux-gnu.sobin18096 -> 0 bytes
-rw-r--r--frozen_deps/Crypto/Cipher/__init__.py83
-rw-r--r--frozen_deps/Crypto/Cipher/blockalgo.py296
-rw-r--r--frozen_deps/Crypto/Hash/HMAC.py212
-rw-r--r--frozen_deps/Crypto/Hash/MD2.py91
-rw-r--r--frozen_deps/Crypto/Hash/MD4.py91
-rw-r--r--frozen_deps/Crypto/Hash/MD5.py97
-rw-r--r--frozen_deps/Crypto/Hash/RIPEMD.py94
-rw-r--r--frozen_deps/Crypto/Hash/SHA.py98
-rw-r--r--frozen_deps/Crypto/Hash/SHA224.py95
-rw-r--r--frozen_deps/Crypto/Hash/SHA256.py95
-rw-r--r--frozen_deps/Crypto/Hash/SHA384.py96
-rw-r--r--frozen_deps/Crypto/Hash/SHA512.py95
-rwxr-xr-xfrozen_deps/Crypto/Hash/_MD2.cpython-38-x86_64-linux-gnu.sobin18464 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_MD4.cpython-38-x86_64-linux-gnu.sobin18552 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_RIPEMD160.cpython-38-x86_64-linux-gnu.sobin22888 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_SHA224.cpython-38-x86_64-linux-gnu.sobin18496 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_SHA256.cpython-38-x86_64-linux-gnu.sobin18496 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_SHA384.cpython-38-x86_64-linux-gnu.sobin22592 -> 0 bytes
-rwxr-xr-xfrozen_deps/Crypto/Hash/_SHA512.cpython-38-x86_64-linux-gnu.sobin22592 -> 0 bytes
-rw-r--r--frozen_deps/Crypto/Hash/__init__.py56
-rw-r--r--frozen_deps/Crypto/Hash/hashalgo.py116
-rw-r--r--frozen_deps/Crypto/Protocol/AllOrNothing.py320
-rw-r--r--frozen_deps/Crypto/Protocol/Chaffing.py245
-rw-r--r--frozen_deps/Crypto/Protocol/KDF.py123
-rw-r--r--frozen_deps/Crypto/Protocol/__init__.py41
-rw-r--r--frozen_deps/Crypto/PublicKey/DSA.py379
-rw-r--r--frozen_deps/Crypto/PublicKey/ElGamal.py373
-rw-r--r--frozen_deps/Crypto/PublicKey/RSA.py719
-rw-r--r--frozen_deps/Crypto/PublicKey/_DSA.py115
-rw-r--r--frozen_deps/Crypto/PublicKey/_RSA.py81
-rw-r--r--frozen_deps/Crypto/PublicKey/__init__.py41
-rwxr-xr-xfrozen_deps/Crypto/PublicKey/_fastmath.cpython-38-x86_64-linux-gnu.sobin78864 -> 0 bytes
-rw-r--r--frozen_deps/Crypto/PublicKey/_slowmath.py187
-rw-r--r--frozen_deps/Crypto/PublicKey/pubkey.py240
-rw-r--r--frozen_deps/Crypto/Random/Fortuna/FortunaAccumulator.py171
-rw-r--r--frozen_deps/Crypto/Random/Fortuna/FortunaGenerator.py132
-rw-r--r--frozen_deps/Crypto/Random/Fortuna/SHAd256.py98
-rw-r--r--frozen_deps/Crypto/Random/Fortuna/__init__.py0
-rw-r--r--frozen_deps/Crypto/Random/OSRNG/__init__.py40
-rw-r--r--frozen_deps/Crypto/Random/OSRNG/fallback.py46
-rw-r--r--frozen_deps/Crypto/Random/OSRNG/posix.py86
-rw-r--r--frozen_deps/Crypto/Random/OSRNG/rng_base.py88
-rw-r--r--frozen_deps/Crypto/Random/_UserFriendlyRNG.py230
-rw-r--r--frozen_deps/Crypto/Random/__init__.py43
-rw-r--r--frozen_deps/Crypto/Random/random.py142
-rw-r--r--frozen_deps/Crypto/Signature/PKCS1_PSS.py355
-rw-r--r--frozen_deps/Crypto/Signature/PKCS1_v1_5.py236
-rw-r--r--frozen_deps/Crypto/Signature/__init__.py31
-rw-r--r--frozen_deps/Crypto/Util/Counter.py127
-rw-r--r--frozen_deps/Crypto/Util/RFC1751.py365
-rw-r--r--frozen_deps/Crypto/Util/__init__.py37
-rwxr-xr-xfrozen_deps/Crypto/Util/_counter.cpython-38-x86_64-linux-gnu.sobin22856 -> 0 bytes
-rw-r--r--frozen_deps/Crypto/Util/_number_new.py119
-rw-r--r--frozen_deps/Crypto/Util/asn1.py286
-rw-r--r--frozen_deps/Crypto/Util/number.py1456
-rw-r--r--frozen_deps/Crypto/Util/py3compat.py107
-rw-r--r--frozen_deps/Crypto/Util/randpool.py82
-rwxr-xr-xfrozen_deps/Crypto/Util/strxor.cpython-38-x86_64-linux-gnu.sobin16784 -> 0 bytes
-rw-r--r--frozen_deps/Crypto/Util/winrandom.py28
-rw-r--r--frozen_deps/Crypto/__init__.py51
-rw-r--r--frozen_deps/Crypto/pct_warnings.py60
79 files changed, 0 insertions, 10322 deletions
diff --git a/frozen_deps/Crypto/Cipher/AES.py b/frozen_deps/Crypto/Cipher/AES.py
deleted file mode 100644
index 14f68d8..0000000
--- a/frozen_deps/Crypto/Cipher/AES.py
+++ /dev/null
@@ -1,115 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/AES.py : AES
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""AES symmetric cipher
-
-AES `(Advanced Encryption Standard)`__ is a symmetric block cipher standardized
-by NIST_ . It has a fixed data block size of 16 bytes.
-Its keys can be 128, 192, or 256 bits long.
-
-AES is very fast and secure, and it is the de facto standard for symmetric
-encryption.
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import AES
- >>> from Crypto import Random
- >>>
- >>> key = b'Sixteen byte key'
- >>> iv = Random.new().read(AES.block_size)
- >>> cipher = AES.new(key, AES.MODE_CFB, iv)
- >>> msg = iv + cipher.encrypt(b'Attack at dawn')
-
-.. __: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
-.. _NIST: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _AES
-
-class AESCipher (blockalgo.BlockAlgo):
- """AES cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize an AES cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new AES cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- It must be 16 (*AES-128*), 24 (*AES-192*), or 32 (*AES-256*) bytes long.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
-
- :Return: an `AESCipher` object
- """
- return AESCipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 16
-#: Size of a key (in bytes)
-key_size = ( 16, 24, 32 )
-
diff --git a/frozen_deps/Crypto/Cipher/ARC2.py b/frozen_deps/Crypto/Cipher/ARC2.py
deleted file mode 100644
index b5234e6..0000000
--- a/frozen_deps/Crypto/Cipher/ARC2.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/ARC2.py : ARC2.py
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""RC2 symmetric cipher
-
-RC2_ (Rivest's Cipher version 2) is a symmetric block cipher designed
-by Ron Rivest in 1987. The cipher started as a proprietary design,
-that was reverse engineered and anonymously posted on Usenet in 1996.
-For this reason, the algorithm was first called *Alleged* RC2 (ARC2),
-since the company that owned RC2 (RSA Data Inc.) did not confirm whether
-the details leaked into public domain were really correct.
-
-The company eventually published its full specification in RFC2268_.
-
-RC2 has a fixed data block size of 8 bytes. Length of its keys can vary from
-8 to 128 bits. One particular property of RC2 is that the actual
-cryptographic strength of the key (*effective key length*) can be reduced
-via a parameter.
-
-Even though RC2 is not cryptographically broken, it has not been analyzed as
-thoroughly as AES, which is also faster than RC2.
-
-New designs should not use RC2.
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import ARC2
- >>> from Crypto import Random
- >>>
- >>> key = b'Sixteen byte key'
- >>> iv = Random.new().read(ARC2.block_size)
- >>> cipher = ARC2.new(key, ARC2.MODE_CFB, iv)
- >>> msg = iv + cipher.encrypt(b'Attack at dawn')
-
-.. _RC2: http://en.wikipedia.org/wiki/RC2
-.. _RFC2268: http://tools.ietf.org/html/rfc2268
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _ARC2
-
-class RC2Cipher (blockalgo.BlockAlgo):
- """RC2 cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize an ARC2 cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _ARC2, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new RC2 cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- Its length can vary from 1 to 128 bytes.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
- effective_keylen : integer
- Maximum cryptographic strength of the key, in bits.
- It can vary from 0 to 1024. The default value is 1024.
-
- :Return: an `RC2Cipher` object
- """
- return RC2Cipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 8
-#: Size of a key (in bytes)
-key_size = range(1,16+1)
-
diff --git a/frozen_deps/Crypto/Cipher/ARC4.py b/frozen_deps/Crypto/Cipher/ARC4.py
deleted file mode 100644
index d83f75b..0000000
--- a/frozen_deps/Crypto/Cipher/ARC4.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/ARC4.py : ARC4
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""ARC4 symmetric cipher
-
-ARC4_ (Alleged RC4) is an implementation of RC4 (Rivest's Cipher version 4),
-a symmetric stream cipher designed by Ron Rivest in 1987.
-
-The cipher started as a proprietary design, that was reverse engineered and
-anonymously posted on Usenet in 1994. The company that owns RC4 (RSA Data
-Inc.) never confirmed the correctness of the leaked algorithm.
-
-Unlike RC2, the company has never published the full specification of RC4,
-of whom it still holds the trademark.
-
-ARC4 keys can vary in length from 40 to 2048 bits.
-
-One problem of ARC4 is that it does not take a nonce or an IV. If it is required
-to encrypt multiple messages with the same long-term key, a distinct
-independent nonce must be created for each message, and a short-term key must
-be derived from the combination of the long-term key and the nonce.
-Due to the weak key scheduling algorithm of RC2, the combination must be carried
-out with a complex function (e.g. a cryptographic hash) and not by simply
-concatenating key and nonce.
-
-New designs should not use ARC4. A good alternative is AES
-(`Crypto.Cipher.AES`) in any of the modes that turn it into a stream cipher (OFB, CFB, or CTR).
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import ARC4
- >>> from Crypto.Hash import SHA
- >>> from Crypto import Random
- >>>
- >>> key = b'Very long and confidential key'
- >>> nonce = Random.new().read(16)
- >>> tempkey = SHA.new(key+nonce).digest()
- >>> cipher = ARC4.new(tempkey)
- >>> msg = nonce + cipher.encrypt(b'Open the pod bay doors, HAL')
-
-.. _ARC4: http://en.wikipedia.org/wiki/RC4
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import _ARC4
-
-class ARC4Cipher:
- """ARC4 cipher object"""
-
-
- def __init__(self, key, *args, **kwargs):
- """Initialize an ARC4 cipher object
-
- See also `new()` at the module level."""
-
- self._cipher = _ARC4.new(key, *args, **kwargs)
- self.block_size = self._cipher.block_size
- self.key_size = self._cipher.key_size
-
- def encrypt(self, plaintext):
- """Encrypt a piece of data.
-
- :Parameters:
- plaintext : byte string
- The piece of data to encrypt. It can be of any size.
- :Return: the encrypted data (byte string, as long as the
- plaintext).
- """
- return self._cipher.encrypt(plaintext)
-
- def decrypt(self, ciphertext):
- """Decrypt a piece of data.
-
- :Parameters:
- ciphertext : byte string
- The piece of data to decrypt. It can be of any size.
- :Return: the decrypted data (byte string, as long as the
- ciphertext).
- """
- return self._cipher.decrypt(ciphertext)
-
-def new(key, *args, **kwargs):
- """Create a new ARC4 cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- It can have any length, with a minimum of 40 bytes.
- Its cryptograpic strength is always capped to 2048 bits (256 bytes).
-
- :Return: an `ARC4Cipher` object
- """
- return ARC4Cipher(key, *args, **kwargs)
-
-#: Size of a data block (in bytes)
-block_size = 1
-#: Size of a key (in bytes)
-key_size = range(1,256+1)
-
diff --git a/frozen_deps/Crypto/Cipher/Blowfish.py b/frozen_deps/Crypto/Cipher/Blowfish.py
deleted file mode 100644
index 8c81d96..0000000
--- a/frozen_deps/Crypto/Cipher/Blowfish.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/Blowfish.py : Blowfish
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""Blowfish symmetric cipher
-
-Blowfish_ is a symmetric block cipher designed by Bruce Schneier.
-
-It has a fixed data block size of 8 bytes and its keys can vary in length
-from 32 to 448 bits (4 to 56 bytes).
-
-Blowfish is deemed secure and it is fast. However, its keys should be chosen
-to be big enough to withstand a brute force attack (e.g. at least 16 bytes).
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import Blowfish
- >>> from Crypto import Random
- >>> from struct import pack
- >>>
- >>> bs = Blowfish.block_size
- >>> key = b'An arbitrarily long key'
- >>> iv = Random.new().read(bs)
- >>> cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
- >>> plaintext = b'docendo discimus '
- >>> plen = bs - divmod(len(plaintext),bs)[1]
- >>> padding = [plen]*plen
- >>> padding = pack('b'*plen, *padding)
- >>> msg = iv + cipher.encrypt(plaintext + padding)
-
-.. _Blowfish: http://www.schneier.com/blowfish.html
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _Blowfish
-
-class BlowfishCipher (blockalgo.BlockAlgo):
- """Blowfish cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize a Blowfish cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _Blowfish, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new Blowfish cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- Its length can vary from 4 to 56 bytes.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
-
- :Return: a `BlowfishCipher` object
- """
- return BlowfishCipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 8
-#: Size of a key (in bytes)
-key_size = range(4,56+1)
-
diff --git a/frozen_deps/Crypto/Cipher/CAST.py b/frozen_deps/Crypto/Cipher/CAST.py
deleted file mode 100644
index 89543b2..0000000
--- a/frozen_deps/Crypto/Cipher/CAST.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/CAST.py : CAST
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""CAST-128 symmetric cipher
-
-CAST-128_ (or CAST5) is a symmetric block cipher specified in RFC2144_.
-
-It has a fixed data block size of 8 bytes. Its key can vary in length
-from 40 to 128 bits.
-
-CAST is deemed to be cryptographically secure, but its usage is not widespread.
-Keys of sufficient length should be used to prevent brute force attacks
-(128 bits are recommended).
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import CAST
- >>> from Crypto import Random
- >>>
- >>> key = b'Sixteen byte key'
- >>> iv = Random.new().read(CAST.block_size)
- >>> cipher = CAST.new(key, CAST.MODE_OPENPGP, iv)
- >>> plaintext = b'sona si latine loqueris '
- >>> msg = cipher.encrypt(plaintext)
- >>>
- ...
- >>> eiv = msg[:CAST.block_size+2]
- >>> ciphertext = msg[CAST.block_size+2:]
- >>> cipher = CAST.new(key, CAST.MODE_OPENPGP, eiv)
- >>> print cipher.decrypt(ciphertext)
-
-.. _CAST-128: http://en.wikipedia.org/wiki/CAST-128
-.. _RFC2144: http://tools.ietf.org/html/rfc2144
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _CAST
-
-class CAST128Cipher(blockalgo.BlockAlgo):
- """CAST-128 cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize a CAST-128 cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _CAST, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new CAST-128 cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- Its length may vary from 5 to 16 bytes.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
-
- :Return: an `CAST128Cipher` object
- """
- return CAST128Cipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 8
-#: Size of a key (in bytes)
-key_size = range(5,16+1)
diff --git a/frozen_deps/Crypto/Cipher/DES.py b/frozen_deps/Crypto/Cipher/DES.py
deleted file mode 100644
index 2fae42f..0000000
--- a/frozen_deps/Crypto/Cipher/DES.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/DES.py : DES
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""DES symmetric cipher
-
-DES `(Data Encryption Standard)`__ is a symmetric block cipher standardized
-by NIST_ . It has a fixed data block size of 8 bytes.
-Its keys are 64 bits long, even though 8 bits were used for integrity (now they
-are ignored) and do not contribute to securty.
-
-DES is cryptographically secure, but its key length is too short by nowadays
-standards and it could be brute forced with some effort.
-
-DES should not be used for new designs. Use `AES`.
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import DES3
- >>> from Crypto import Random
- >>>
- >>> key = b'Sixteen byte key'
- >>> iv = Random.new().read(DES3.block_size)
- >>> cipher = DES3.new(key, DES3.MODE_OFB, iv)
- >>> plaintext = b'sona si latine loqueris '
- >>> msg = iv + cipher.encrypt(plaintext)
-
-.. __: http://en.wikipedia.org/wiki/Data_Encryption_Standard
-.. _NIST: http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _DES
-
-class DESCipher(blockalgo.BlockAlgo):
- """DES cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize a DES cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _DES, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new DES cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- It must be 8 byte long. The parity bits will be ignored.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
-
- :Return: an `DESCipher` object
- """
- return DESCipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 8
-#: Size of a key (in bytes)
-key_size = 8
diff --git a/frozen_deps/Crypto/Cipher/DES3.py b/frozen_deps/Crypto/Cipher/DES3.py
deleted file mode 100644
index 7fedac8..0000000
--- a/frozen_deps/Crypto/Cipher/DES3.py
+++ /dev/null
@@ -1,133 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/DES3.py : DES3
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""Triple DES symmetric cipher
-
-`Triple DES`__ (or TDES or TDEA or 3DES) is a symmetric block cipher standardized by NIST_.
-It has a fixed data block size of 8 bytes. Its keys are 128 (*Option 1*) or 192
-bits (*Option 2*) long.
-However, 1 out of 8 bits is used for redundancy and do not contribute to
-security. The effective key length is respectively 112 or 168 bits.
-
-TDES consists of the concatenation of 3 simple `DES` ciphers.
-
-The plaintext is first DES encrypted with *K1*, then decrypted with *K2*,
-and finally encrypted again with *K3*. The ciphertext is decrypted in the reverse manner.
-
-The 192 bit key is a bundle of three 64 bit independent subkeys: *K1*, *K2*, and *K3*.
-
-The 128 bit key is split into *K1* and *K2*, whereas *K1=K3*.
-
-It is important that all subkeys are different, otherwise TDES would degrade to
-single `DES`.
-
-TDES is cryptographically secure, even though it is neither as secure nor as fast
-as `AES`.
-
-As an example, encryption can be done as follows:
-
- >>> from Crypto.Cipher import DES
- >>> from Crypto import Random
- >>> from Crypto.Util import Counter
- >>>
- >>> key = b'-8B key-'
- >>> nonce = Random.new().read(DES.block_size/2)
- >>> ctr = Counter.new(DES.block_size*8/2, prefix=nonce)
- >>> cipher = DES.new(key, DES.MODE_CTR, counter=ctr)
- >>> plaintext = b'We are no longer the knights who say ni!'
- >>> msg = nonce + cipher.encrypt(plaintext)
-
-.. __: http://en.wikipedia.org/wiki/Triple_DES
-.. _NIST: http://csrc.nist.gov/publications/nistpubs/800-67/SP800-67.pdf
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import blockalgo
-from Crypto.Cipher import _DES3
-
-class DES3Cipher(blockalgo.BlockAlgo):
- """TDES cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize a TDES cipher object
-
- See also `new()` at the module level."""
- blockalgo.BlockAlgo.__init__(self, _DES3, key, *args, **kwargs)
-
-def new(key, *args, **kwargs):
- """Create a new TDES cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- It must be 16 or 24 bytes long. The parity bits will be ignored.
- :Keywords:
- mode : a *MODE_** constant
- The chaining mode to use for encryption or decryption.
- Default is `MODE_ECB`.
- IV : byte string
- The initialization vector to use for encryption or decryption.
-
- It is ignored for `MODE_ECB` and `MODE_CTR`.
-
- For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption
- and `block_size` +2 bytes for decryption (in the latter case, it is
- actually the *encrypted* IV which was prefixed to the ciphertext).
- It is mandatory.
-
- For all other modes, it must be `block_size` bytes longs. It is optional and
- when not present it will be given a default value of all zeroes.
- counter : callable
- (*Only* `MODE_CTR`). A stateful function that returns the next
- *counter block*, which is a byte string of `block_size` bytes.
- For better performance, use `Crypto.Util.Counter`.
- segment_size : integer
- (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext
- are segmented in.
- It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8.
-
- :Attention: it is important that all 8 byte subkeys are different,
- otherwise TDES would degrade to single `DES`.
- :Return: an `DES3Cipher` object
- """
- return DES3Cipher(key, *args, **kwargs)
-
-#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`.
-MODE_ECB = 1
-#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`.
-MODE_CBC = 2
-#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`.
-MODE_CFB = 3
-#: This mode should not be used.
-MODE_PGP = 4
-#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`.
-MODE_OFB = 5
-#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`.
-MODE_CTR = 6
-#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`.
-MODE_OPENPGP = 7
-#: Size of a data block (in bytes)
-block_size = 8
-#: Size of a key (in bytes)
-key_size = ( 16, 24 )
diff --git a/frozen_deps/Crypto/Cipher/PKCS1_OAEP.py b/frozen_deps/Crypto/Cipher/PKCS1_OAEP.py
deleted file mode 100644
index 2738ce3..0000000
--- a/frozen_deps/Crypto/Cipher/PKCS1_OAEP.py
+++ /dev/null
@@ -1,255 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""RSA encryption protocol according to PKCS#1 OAEP
-
-See RFC3447__ or the `original RSA Labs specification`__ .
-
-This scheme is more properly called ``RSAES-OAEP``.
-
-As an example, a sender may encrypt a message in this way:
-
- >>> from Crypto.Cipher import PKCS1_OAEP
- >>> from Crypto.PublicKey import RSA
- >>>
- >>> message = 'To be encrypted'
- >>> key = RSA.importKey(open('pubkey.der').read())
- >>> cipher = PKCS1_OAEP.new(key)
- >>> ciphertext = cipher.encrypt(message)
-
-At the receiver side, decryption can be done using the private part of
-the RSA key:
-
- >>> key = RSA.importKey(open('privkey.der').read())
- >>> cipher = PKCS1_OAP.new(key)
- >>> message = cipher.decrypt(ciphertext)
-
-:undocumented: __revision__, __package__
-
-.. __: http://www.ietf.org/rfc/rfc3447.txt
-.. __: http://www.rsa.com/rsalabs/node.asp?id=2125.
-"""
-
-
-
-__revision__ = "$Id$"
-__all__ = [ 'new', 'PKCS1OAEP_Cipher' ]
-
-import Crypto.Signature.PKCS1_PSS
-import Crypto.Hash.SHA
-
-from Crypto.Util.py3compat import *
-import Crypto.Util.number
-from Crypto.Util.number import ceil_div
-from Crypto.Util.strxor import strxor
-
-class PKCS1OAEP_Cipher:
- """This cipher can perform PKCS#1 v1.5 OAEP encryption or decryption."""
-
- def __init__(self, key, hashAlgo, mgfunc, label):
- """Initialize this PKCS#1 OAEP cipher object.
-
- :Parameters:
- key : an RSA key object
- If a private half is given, both encryption and decryption are possible.
- If a public half is given, only encryption is possible.
- hashAlgo : hash object
- The hash function to use. This can be a module under `Crypto.Hash`
- or an existing hash object created from any of such modules. If not specified,
- `Crypto.Hash.SHA` (that is, SHA-1) is used.
- mgfunc : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- If not specified, the standard MGF1 is used (a safe choice).
- label : string
- A label to apply to this particular encryption. If not specified,
- an empty string is used. Specifying a label does not improve
- security.
-
- :attention: Modify the mask generation function only if you know what you are doing.
- Sender and receiver must use the same one.
- """
- self._key = key
-
- if hashAlgo:
- self._hashObj = hashAlgo
- else:
- self._hashObj = Crypto.Hash.SHA
-
- if mgfunc:
- self._mgf = mgfunc
- else:
- self._mgf = lambda x,y: Crypto.Signature.PKCS1_PSS.MGF1(x,y,self._hashObj)
-
- self._label = label
-
- def can_encrypt(self):
- """Return True/1 if this cipher object can be used for encryption."""
- return self._key.can_encrypt()
-
- def can_decrypt(self):
- """Return True/1 if this cipher object can be used for decryption."""
- return self._key.can_decrypt()
-
- def encrypt(self, message):
- """Produce the PKCS#1 OAEP encryption of a message.
-
- This function is named ``RSAES-OAEP-ENCRYPT``, and is specified in
- section 7.1.1 of RFC3447.
-
- :Parameters:
- message : string
- The message to encrypt, also known as plaintext. It can be of
- variable length, but not longer than the RSA modulus (in bytes)
- minus 2, minus twice the hash output size.
-
- :Return: A string, the ciphertext in which the message is encrypted.
- It is as long as the RSA modulus (in bytes).
- :Raise ValueError:
- If the RSA key length is not sufficiently long to deal with the given
- message.
- """
- # TODO: Verify the key is RSA
-
- randFunc = self._key._randfunc
-
- # See 7.1.1 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
- hLen = self._hashObj.digest_size
- mLen = len(message)
-
- # Step 1b
- ps_len = k-mLen-2*hLen-2
- if ps_len<0:
- raise ValueError("Plaintext is too long.")
- # Step 2a
- lHash = self._hashObj.new(self._label).digest()
- # Step 2b
- ps = bchr(0x00)*ps_len
- # Step 2c
- db = lHash + ps + bchr(0x01) + message
- # Step 2d
- ros = randFunc(hLen)
- # Step 2e
- dbMask = self._mgf(ros, k-hLen-1)
- # Step 2f
- maskedDB = strxor(db, dbMask)
- # Step 2g
- seedMask = self._mgf(maskedDB, hLen)
- # Step 2h
- maskedSeed = strxor(ros, seedMask)
- # Step 2i
- em = bchr(0x00) + maskedSeed + maskedDB
- # Step 3a (OS2IP), step 3b (RSAEP), part of step 3c (I2OSP)
- m = self._key.encrypt(em, 0)[0]
- # Complete step 3c (I2OSP)
- c = bchr(0x00)*(k-len(m)) + m
- return c
-
- def decrypt(self, ct):
- """Decrypt a PKCS#1 OAEP ciphertext.
-
- This function is named ``RSAES-OAEP-DECRYPT``, and is specified in
- section 7.1.2 of RFC3447.
-
- :Parameters:
- ct : string
- The ciphertext that contains the message to recover.
-
- :Return: A string, the original message.
- :Raise ValueError:
- If the ciphertext length is incorrect, or if the decryption does not
- succeed.
- :Raise TypeError:
- If the RSA key has no private half.
- """
- # TODO: Verify the key is RSA
-
- # See 7.1.2 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
- hLen = self._hashObj.digest_size
-
- # Step 1b and 1c
- if len(ct) != k or k<hLen+2:
- raise ValueError("Ciphertext with incorrect length.")
- # Step 2a (O2SIP), 2b (RSADP), and part of 2c (I2OSP)
- m = self._key.decrypt(ct)
- # Complete step 2c (I2OSP)
- em = bchr(0x00)*(k-len(m)) + m
- # Step 3a
- lHash = self._hashObj.new(self._label).digest()
- # Step 3b
- y = em[0]
- # y must be 0, but we MUST NOT check it here in order not to
- # allow attacks like Manger's (http://dl.acm.org/citation.cfm?id=704143)
- maskedSeed = em[1:hLen+1]
- maskedDB = em[hLen+1:]
- # Step 3c
- seedMask = self._mgf(maskedDB, hLen)
- # Step 3d
- seed = strxor(maskedSeed, seedMask)
- # Step 3e
- dbMask = self._mgf(seed, k-hLen-1)
- # Step 3f
- db = strxor(maskedDB, dbMask)
- # Step 3g
- valid = 1
- one = db[hLen:].find(bchr(0x01))
- lHash1 = db[:hLen]
- if lHash1!=lHash:
- valid = 0
- if one<0:
- valid = 0
- if bord(y)!=0:
- valid = 0
- if not valid:
- raise ValueError("Incorrect decryption.")
- # Step 4
- return db[hLen+one+1:]
-
-def new(key, hashAlgo=None, mgfunc=None, label=b('')):
- """Return a cipher object `PKCS1OAEP_Cipher` that can be used to perform PKCS#1 OAEP encryption or decryption.
-
- :Parameters:
- key : RSA key object
- The key to use to encrypt or decrypt the message. This is a `Crypto.PublicKey.RSA` object.
- Decryption is only possible if *key* is a private RSA key.
- hashAlgo : hash object
- The hash function to use. This can be a module under `Crypto.Hash`
- or an existing hash object created from any of such modules. If not specified,
- `Crypto.Hash.SHA` (that is, SHA-1) is used.
- mgfunc : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- If not specified, the standard MGF1 is used (a safe choice).
- label : string
- A label to apply to this particular encryption. If not specified,
- an empty string is used. Specifying a label does not improve
- security.
-
- :attention: Modify the mask generation function only if you know what you are doing.
- Sender and receiver must use the same one.
- """
- return PKCS1OAEP_Cipher(key, hashAlgo, mgfunc, label)
-
diff --git a/frozen_deps/Crypto/Cipher/PKCS1_v1_5.py b/frozen_deps/Crypto/Cipher/PKCS1_v1_5.py
deleted file mode 100644
index 3602cb0..0000000
--- a/frozen_deps/Crypto/Cipher/PKCS1_v1_5.py
+++ /dev/null
@@ -1,226 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/PKCS1-v1_5.py : PKCS#1 v1.5
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""RSA encryption protocol according to PKCS#1 v1.5
-
-See RFC3447__ or the `original RSA Labs specification`__ .
-
-This scheme is more properly called ``RSAES-PKCS1-v1_5``.
-
-**If you are designing a new protocol, consider using the more robust PKCS#1 OAEP.**
-
-As an example, a sender may encrypt a message in this way:
-
- >>> from Crypto.Cipher import PKCS1_v1_5
- >>> from Crypto.PublicKey import RSA
- >>> from Crypto.Hash import SHA
- >>>
- >>> message = 'To be encrypted'
- >>> h = SHA.new(message)
- >>>
- >>> key = RSA.importKey(open('pubkey.der').read())
- >>> cipher = PKCS1_v1_5.new(key)
- >>> ciphertext = cipher.encrypt(message+h.digest())
-
-At the receiver side, decryption can be done using the private part of
-the RSA key:
-
- >>> From Crypto.Hash import SHA
- >>> from Crypto import Random
- >>>
- >>> key = RSA.importKey(open('privkey.der').read())
- >>>
- >>> dsize = SHA.digest_size
- >>> sentinel = Random.new().read(15+dsize) # Let's assume that average data length is 15
- >>>
- >>> cipher = PKCS1_v1_5.new(key)
- >>> message = cipher.decrypt(ciphertext, sentinel)
- >>>
- >>> digest = SHA.new(message[:-dsize]).digest()
- >>> if digest==message[-dsize:]: # Note how we DO NOT look for the sentinel
- >>> print "Encryption was correct."
- >>> else:
- >>> print "Encryption was not correct."
-
-:undocumented: __revision__, __package__
-
-.. __: http://www.ietf.org/rfc/rfc3447.txt
-.. __: http://www.rsa.com/rsalabs/node.asp?id=2125.
-"""
-
-__revision__ = "$Id$"
-__all__ = [ 'new', 'PKCS115_Cipher' ]
-
-from Crypto.Util.number import ceil_div
-from Crypto.Util.py3compat import *
-import Crypto.Util.number
-
-class PKCS115_Cipher:
- """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption."""
-
- def __init__(self, key):
- """Initialize this PKCS#1 v1.5 cipher object.
-
- :Parameters:
- key : an RSA key object
- If a private half is given, both encryption and decryption are possible.
- If a public half is given, only encryption is possible.
- """
- self._key = key
-
- def can_encrypt(self):
- """Return True if this cipher object can be used for encryption."""
- return self._key.can_encrypt()
-
- def can_decrypt(self):
- """Return True if this cipher object can be used for decryption."""
- return self._key.can_decrypt()
-
- def encrypt(self, message):
- """Produce the PKCS#1 v1.5 encryption of a message.
-
- This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and is specified in
- section 7.2.1 of RFC3447.
- For a complete example see `Crypto.Cipher.PKCS1_v1_5`.
-
- :Parameters:
- message : byte string
- The message to encrypt, also known as plaintext. It can be of
- variable length, but not longer than the RSA modulus (in bytes) minus 11.
-
- :Return: A byte string, the ciphertext in which the message is encrypted.
- It is as long as the RSA modulus (in bytes).
- :Raise ValueError:
- If the RSA key length is not sufficiently long to deal with the given
- message.
-
- """
- # TODO: Verify the key is RSA
-
- randFunc = self._key._randfunc
-
- # See 7.2.1 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
- mLen = len(message)
-
- # Step 1
- if mLen > k-11:
- raise ValueError("Plaintext is too long.")
- # Step 2a
- class nonZeroRandByte:
- def __init__(self, rf): self.rf=rf
- def __call__(self, c):
- while bord(c)==0x00: c=self.rf(1)[0]
- return c
- ps = tobytes(list(map(nonZeroRandByte(randFunc), randFunc(k-mLen-3))))
- # Step 2b
- em = b('\x00\x02') + ps + bchr(0x00) + message
- # Step 3a (OS2IP), step 3b (RSAEP), part of step 3c (I2OSP)
- m = self._key.encrypt(em, 0)[0]
- # Complete step 3c (I2OSP)
- c = bchr(0x00)*(k-len(m)) + m
- return c
-
- def decrypt(self, ct, sentinel):
- """Decrypt a PKCS#1 v1.5 ciphertext.
-
- This function is named ``RSAES-PKCS1-V1_5-DECRYPT``, and is specified in
- section 7.2.2 of RFC3447.
- For a complete example see `Crypto.Cipher.PKCS1_v1_5`.
-
- :Parameters:
- ct : byte string
- The ciphertext that contains the message to recover.
- sentinel : any type
- The object to return to indicate that an error was detected during decryption.
-
- :Return: A byte string. It is either the original message or the ``sentinel`` (in case of an error).
- :Raise ValueError:
- If the ciphertext length is incorrect
- :Raise TypeError:
- If the RSA key has no private half.
-
- :attention:
- You should **never** let the party who submitted the ciphertext know that
- this function returned the ``sentinel`` value.
- Armed with such knowledge (for a fair amount of carefully crafted but invalid ciphertexts),
- an attacker is able to recontruct the plaintext of any other encryption that were carried out
- with the same RSA public key (see `Bleichenbacher's`__ attack).
-
- In general, it should not be possible for the other party to distinguish
- whether processing at the server side failed because the value returned
- was a ``sentinel`` as opposed to a random, invalid message.
-
- In fact, the second option is not that unlikely: encryption done according to PKCS#1 v1.5
- embeds no good integrity check. There is roughly one chance
- in 2^16 for a random ciphertext to be returned as a valid message
- (although random looking).
-
- It is therefore advisabled to:
-
- 1. Select as ``sentinel`` a value that resembles a plausable random, invalid message.
- 2. Not report back an error as soon as you detect a ``sentinel`` value.
- Put differently, you should not explicitly check if the returned value is the ``sentinel`` or not.
- 3. Cover all possible errors with a single, generic error indicator.
- 4. Embed into the definition of ``message`` (at the protocol level) a digest (e.g. ``SHA-1``).
- It is recommended for it to be the rightmost part ``message``.
- 5. Where possible, monitor the number of errors due to ciphertexts originating from the same party,
- and slow down the rate of the requests from such party (or even blacklist it altogether).
-
- **If you are designing a new protocol, consider using the more robust PKCS#1 OAEP.**
-
- .. __: http://www.bell-labs.com/user/bleichen/papers/pkcs.ps
-
- """
-
- # TODO: Verify the key is RSA
-
- # See 7.2.1 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
-
- # Step 1
- if len(ct) != k:
- raise ValueError("Ciphertext with incorrect length.")
- # Step 2a (O2SIP), 2b (RSADP), and part of 2c (I2OSP)
- m = self._key.decrypt(ct)
- # Complete step 2c (I2OSP)
- em = bchr(0x00)*(k-len(m)) + m
- # Step 3
- sep = em.find(bchr(0x00),2)
- if not em.startswith(b('\x00\x02')) or sep<10:
- return sentinel
- # Step 4
- return em[sep+1:]
-
-def new(key):
- """Return a cipher object `PKCS115_Cipher` that can be used to perform PKCS#1 v1.5 encryption or decryption.
-
- :Parameters:
- key : RSA key object
- The key to use to encrypt or decrypt the message. This is a `Crypto.PublicKey.RSA` object.
- Decryption is only possible if *key* is a private RSA key.
-
- """
- return PKCS115_Cipher(key)
-
diff --git a/frozen_deps/Crypto/Cipher/XOR.py b/frozen_deps/Crypto/Cipher/XOR.py
deleted file mode 100644
index 46b8464..0000000
--- a/frozen_deps/Crypto/Cipher/XOR.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/XOR.py : XOR
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""XOR toy cipher
-
-XOR is one the simplest stream ciphers. Encryption and decryption are
-performed by XOR-ing data with a keystream made by contatenating
-the key.
-
-Do not use it for real applications!
-
-:undocumented: __revision__, __package__
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Cipher import _XOR
-
-class XORCipher:
- """XOR cipher object"""
-
- def __init__(self, key, *args, **kwargs):
- """Initialize a XOR cipher object
-
- See also `new()` at the module level."""
- self._cipher = _XOR.new(key, *args, **kwargs)
- self.block_size = self._cipher.block_size
- self.key_size = self._cipher.key_size
-
- def encrypt(self, plaintext):
- """Encrypt a piece of data.
-
- :Parameters:
- plaintext : byte string
- The piece of data to encrypt. It can be of any size.
- :Return: the encrypted data (byte string, as long as the
- plaintext).
- """
- return self._cipher.encrypt(plaintext)
-
- def decrypt(self, ciphertext):
- """Decrypt a piece of data.
-
- :Parameters:
- ciphertext : byte string
- The piece of data to decrypt. It can be of any size.
- :Return: the decrypted data (byte string, as long as the
- ciphertext).
- """
- return self._cipher.decrypt(ciphertext)
-
-def new(key, *args, **kwargs):
- """Create a new XOR cipher
-
- :Parameters:
- key : byte string
- The secret key to use in the symmetric cipher.
- Its length may vary from 1 to 32 bytes.
-
- :Return: an `XORCipher` object
- """
- return XORCipher(key, *args, **kwargs)
-
-#: Size of a data block (in bytes)
-block_size = 1
-#: Size of a key (in bytes)
-key_size = range(1,32+1)
-
diff --git a/frozen_deps/Crypto/Cipher/_AES.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_AES.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index e9ffeb9..0000000
--- a/frozen_deps/Crypto/Cipher/_AES.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_ARC2.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_ARC2.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index b325488..0000000
--- a/frozen_deps/Crypto/Cipher/_ARC2.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_ARC4.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_ARC4.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 982a28d..0000000
--- a/frozen_deps/Crypto/Cipher/_ARC4.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_Blowfish.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_Blowfish.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 2648636..0000000
--- a/frozen_deps/Crypto/Cipher/_Blowfish.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_CAST.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_CAST.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 439731a..0000000
--- a/frozen_deps/Crypto/Cipher/_CAST.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_DES.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_DES.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index e025c0d..0000000
--- a/frozen_deps/Crypto/Cipher/_DES.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_DES3.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_DES3.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index faef3f9..0000000
--- a/frozen_deps/Crypto/Cipher/_DES3.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/_XOR.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Cipher/_XOR.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 43f0560..0000000
--- a/frozen_deps/Crypto/Cipher/_XOR.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Cipher/__init__.py b/frozen_deps/Crypto/Cipher/__init__.py
deleted file mode 100644
index 7afed2d..0000000
--- a/frozen_deps/Crypto/Cipher/__init__.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Symmetric- and asymmetric-key encryption algorithms.
-
-Encryption algorithms transform plaintext in some way that
-is dependent on a key or key pair, producing ciphertext.
-
-Symmetric algorithms
---------------------
-
-Encryption can easily be reversed, if (and, hopefully, only if)
-one knows the same key.
-In other words, sender and receiver share the same key.
-
-The symmetric encryption modules here all support the interface described in PEP
-272, "API for Block Encryption Algorithms".
-
-If you don't know which algorithm to choose, use AES because it's
-standard and has undergone a fair bit of examination.
-
-======================== ======= ========================
-Module name Type Description
-======================== ======= ========================
-`Crypto.Cipher.AES` Block Advanced Encryption Standard
-`Crypto.Cipher.ARC2` Block Alleged RC2
-`Crypto.Cipher.ARC4` Stream Alleged RC4
-`Crypto.Cipher.Blowfish` Block Blowfish
-`Crypto.Cipher.CAST` Block CAST
-`Crypto.Cipher.DES` Block The Data Encryption Standard.
- Very commonly used in the past,
- but today its 56-bit keys are too small.
-`Crypto.Cipher.DES3` Block Triple DES.
-`Crypto.Cipher.XOR` Stream The simple XOR cipher.
-======================== ======= ========================
-
-
-Asymmetric algorithms
----------------------
-
-For asymmetric algorithms, the key to be used for decryption is totally
-different and cannot be derived in a feasible way from the key used
-for encryption. Put differently, sender and receiver each own one half
-of a key pair. The encryption key is often called ``public`` whereas
-the decryption key is called ``private``.
-
-========================== =======================
-Module name Description
-========================== =======================
-`Crypto.Cipher.PKCS1_v1_5` PKCS#1 v1.5 encryption, based on RSA key pairs
-`Crypto.Cipher.PKCS1_OAEP` PKCS#1 OAEP encryption, based on RSA key pairs
-========================== =======================
-
-:undocumented: __revision__, __package__, _AES, _ARC2, _ARC4, _Blowfish
- _CAST, _DES, _DES3, _XOR
-"""
-
-__all__ = ['AES', 'ARC2', 'ARC4',
- 'Blowfish', 'CAST', 'DES', 'DES3',
- 'XOR',
- 'PKCS1_v1_5', 'PKCS1_OAEP'
- ]
-
-__revision__ = "$Id$"
-
-
diff --git a/frozen_deps/Crypto/Cipher/blockalgo.py b/frozen_deps/Crypto/Cipher/blockalgo.py
deleted file mode 100644
index dd183dc..0000000
--- a/frozen_deps/Crypto/Cipher/blockalgo.py
+++ /dev/null
@@ -1,296 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Cipher/blockalgo.py
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""Module with definitions common to all block ciphers."""
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-
-#: *Electronic Code Book (ECB)*.
-#: This is the simplest encryption mode. Each of the plaintext blocks
-#: is directly encrypted into a ciphertext block, independently of
-#: any other block. This mode exposes frequency of symbols
-#: in your plaintext. Other modes (e.g. *CBC*) should be used instead.
-#:
-#: See `NIST SP800-38A`_ , Section 6.1 .
-#:
-#: .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
-MODE_ECB = 1
-
-#: *Cipher-Block Chaining (CBC)*. Each of the ciphertext blocks depends
-#: on the current and all previous plaintext blocks. An Initialization Vector
-#: (*IV*) is required.
-#:
-#: The *IV* is a data block to be transmitted to the receiver.
-#: The *IV* can be made public, but it must be authenticated by the receiver and
-#: it should be picked randomly.
-#:
-#: See `NIST SP800-38A`_ , Section 6.2 .
-#:
-#: .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
-MODE_CBC = 2
-
-#: *Cipher FeedBack (CFB)*. This mode is similar to CBC, but it transforms
-#: the underlying block cipher into a stream cipher. Plaintext and ciphertext
-#: are processed in *segments* of **s** bits. The mode is therefore sometimes
-#: labelled **s**-bit CFB. An Initialization Vector (*IV*) is required.
-#:
-#: When encrypting, each ciphertext segment contributes to the encryption of
-#: the next plaintext segment.
-#:
-#: This *IV* is a data block to be transmitted to the receiver.
-#: The *IV* can be made public, but it should be picked randomly.
-#: Reusing the same *IV* for encryptions done with the same key lead to
-#: catastrophic cryptographic failures.
-#:
-#: See `NIST SP800-38A`_ , Section 6.3 .
-#:
-#: .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
-MODE_CFB = 3
-
-#: This mode should not be used.
-MODE_PGP = 4
-
-#: *Output FeedBack (OFB)*. This mode is very similar to CBC, but it
-#: transforms the underlying block cipher into a stream cipher.
-#: The keystream is the iterated block encryption of an Initialization Vector (*IV*).
-#:
-#: The *IV* is a data block to be transmitted to the receiver.
-#: The *IV* can be made public, but it should be picked randomly.
-#:
-#: Reusing the same *IV* for encryptions done with the same key lead to
-#: catastrophic cryptograhic failures.
-#:
-#: See `NIST SP800-38A`_ , Section 6.4 .
-#:
-#: .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
-MODE_OFB = 5
-
-#: *CounTeR (CTR)*. This mode is very similar to ECB, in that
-#: encryption of one block is done independently of all other blocks.
-#: Unlike ECB, the block *position* contributes to the encryption and no
-#: information leaks about symbol frequency.
-#:
-#: Each message block is associated to a *counter* which must be unique
-#: across all messages that get encrypted with the same key (not just within
-#: the same message). The counter is as big as the block size.
-#:
-#: Counters can be generated in several ways. The most straightword one is
-#: to choose an *initial counter block* (which can be made public, similarly
-#: to the *IV* for the other modes) and increment its lowest **m** bits by
-#: one (modulo *2^m*) for each block. In most cases, **m** is chosen to be half
-#: the block size.
-#:
-#: Reusing the same *initial counter block* for encryptions done with the same
-#: key lead to catastrophic cryptograhic failures.
-#:
-#: See `NIST SP800-38A`_ , Section 6.5 (for the mode) and Appendix B (for how
-#: to manage the *initial counter block*).
-#:
-#: .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
-MODE_CTR = 6
-
-#: OpenPGP. This mode is a variant of CFB, and it is only used in PGP and OpenPGP_ applications.
-#: An Initialization Vector (*IV*) is required.
-#:
-#: Unlike CFB, the IV is not transmitted to the receiver. Instead, the *encrypted* IV is.
-#: The IV is a random data block. Two of its bytes are duplicated to act as a checksum
-#: for the correctness of the key. The encrypted IV is therefore 2 bytes longer than
-#: the clean IV.
-#:
-#: .. _OpenPGP: http://tools.ietf.org/html/rfc4880
-MODE_OPENPGP = 7
-
-def _getParameter(name, index, args, kwargs, default=None):
- """Find a parameter in tuple and dictionary arguments a function receives"""
- param = kwargs.get(name)
- if len(args)>index:
- if param:
- raise ValueError("Parameter '%s' is specified twice" % name)
- param = args[index]
- return param or default
-
-class BlockAlgo:
- """Class modelling an abstract block cipher."""
-
- def __init__(self, factory, key, *args, **kwargs):
- self.mode = _getParameter('mode', 0, args, kwargs, default=MODE_ECB)
- self.block_size = factory.block_size
-
- if self.mode != MODE_OPENPGP:
- self._cipher = factory.new(key, *args, **kwargs)
- self.IV = self._cipher.IV
- else:
- # OPENPGP mode. For details, see 13.9 in RCC4880.
- #
- # A few members are specifically created for this mode:
- # - _encrypted_iv, set in this constructor
- # - _done_first_block, set to True after the first encryption
- # - _done_last_block, set to True after a partial block is processed
-
- self._done_first_block = False
- self._done_last_block = False
- self.IV = _getParameter('iv', 1, args, kwargs)
- if not self.IV:
- raise ValueError("MODE_OPENPGP requires an IV")
-
- # Instantiate a temporary cipher to process the IV
- IV_cipher = factory.new(key, MODE_CFB,
- b('\x00')*self.block_size, # IV for CFB
- segment_size=self.block_size*8)
-
- # The cipher will be used for...
- if len(self.IV) == self.block_size:
- # ... encryption
- self._encrypted_IV = IV_cipher.encrypt(
- self.IV + self.IV[-2:] + # Plaintext
- b('\x00')*(self.block_size-2) # Padding
- )[:self.block_size+2]
- elif len(self.IV) == self.block_size+2:
- # ... decryption
- self._encrypted_IV = self.IV
- self.IV = IV_cipher.decrypt(self.IV + # Ciphertext
- b('\x00')*(self.block_size-2) # Padding
- )[:self.block_size+2]
- if self.IV[-2:] != self.IV[-4:-2]:
- raise ValueError("Failed integrity check for OPENPGP IV")
- self.IV = self.IV[:-2]
- else:
- raise ValueError("Length of IV must be %d or %d bytes for MODE_OPENPGP"
- % (self.block_size, self.block_size+2))
-
- # Instantiate the cipher for the real PGP data
- self._cipher = factory.new(key, MODE_CFB,
- self._encrypted_IV[-self.block_size:],
- segment_size=self.block_size*8)
-
- def encrypt(self, plaintext):
- """Encrypt data with the key and the parameters set at initialization.
-
- The cipher object is stateful; encryption of a long block
- of data can be broken up in two or more calls to `encrypt()`.
- That is, the statement:
-
- >>> c.encrypt(a) + c.encrypt(b)
-
- is always equivalent to:
-
- >>> c.encrypt(a+b)
-
- That also means that you cannot reuse an object for encrypting
- or decrypting other data with the same key.
-
- This function does not perform any padding.
-
- - For `MODE_ECB`, `MODE_CBC`, and `MODE_OFB`, *plaintext* length
- (in bytes) must be a multiple of *block_size*.
-
- - For `MODE_CFB`, *plaintext* length (in bytes) must be a multiple
- of *segment_size*/8.
-
- - For `MODE_CTR`, *plaintext* can be of any length.
-
- - For `MODE_OPENPGP`, *plaintext* must be a multiple of *block_size*,
- unless it is the last chunk of the message.
-
- :Parameters:
- plaintext : byte string
- The piece of data to encrypt.
- :Return:
- the encrypted data, as a byte string. It is as long as
- *plaintext* with one exception: when encrypting the first message
- chunk with `MODE_OPENPGP`, the encypted IV is prepended to the
- returned ciphertext.
- """
-
- if self.mode == MODE_OPENPGP:
- padding_length = (self.block_size - len(plaintext) % self.block_size) % self.block_size
- if padding_length>0:
- # CFB mode requires ciphertext to have length multiple of block size,
- # but PGP mode allows the last block to be shorter
- if self._done_last_block:
- raise ValueError("Only the last chunk is allowed to have length not multiple of %d bytes",
- self.block_size)
- self._done_last_block = True
- padded = plaintext + b('\x00')*padding_length
- res = self._cipher.encrypt(padded)[:len(plaintext)]
- else:
- res = self._cipher.encrypt(plaintext)
- if not self._done_first_block:
- res = self._encrypted_IV + res
- self._done_first_block = True
- return res
-
- return self._cipher.encrypt(plaintext)
-
- def decrypt(self, ciphertext):
- """Decrypt data with the key and the parameters set at initialization.
-
- The cipher object is stateful; decryption of a long block
- of data can be broken up in two or more calls to `decrypt()`.
- That is, the statement:
-
- >>> c.decrypt(a) + c.decrypt(b)
-
- is always equivalent to:
-
- >>> c.decrypt(a+b)
-
- That also means that you cannot reuse an object for encrypting
- or decrypting other data with the same key.
-
- This function does not perform any padding.
-
- - For `MODE_ECB`, `MODE_CBC`, and `MODE_OFB`, *ciphertext* length
- (in bytes) must be a multiple of *block_size*.
-
- - For `MODE_CFB`, *ciphertext* length (in bytes) must be a multiple
- of *segment_size*/8.
-
- - For `MODE_CTR`, *ciphertext* can be of any length.
-
- - For `MODE_OPENPGP`, *plaintext* must be a multiple of *block_size*,
- unless it is the last chunk of the message.
-
- :Parameters:
- ciphertext : byte string
- The piece of data to decrypt.
- :Return: the decrypted data (byte string, as long as *ciphertext*).
- """
- if self.mode == MODE_OPENPGP:
- padding_length = (self.block_size - len(ciphertext) % self.block_size) % self.block_size
- if padding_length>0:
- # CFB mode requires ciphertext to have length multiple of block size,
- # but PGP mode allows the last block to be shorter
- if self._done_last_block:
- raise ValueError("Only the last chunk is allowed to have length not multiple of %d bytes",
- self.block_size)
- self._done_last_block = True
- padded = ciphertext + b('\x00')*padding_length
- res = self._cipher.decrypt(padded)[:len(ciphertext)]
- else:
- res = self._cipher.decrypt(ciphertext)
- return res
-
- return self._cipher.decrypt(ciphertext)
-
diff --git a/frozen_deps/Crypto/Hash/HMAC.py b/frozen_deps/Crypto/Hash/HMAC.py
deleted file mode 100644
index 324f534..0000000
--- a/frozen_deps/Crypto/Hash/HMAC.py
+++ /dev/null
@@ -1,212 +0,0 @@
-# HMAC.py - Implements the HMAC algorithm as described by RFC 2104.
-#
-# ===================================================================
-# Portions Copyright (c) 2001, 2002, 2003 Python Software Foundation;
-# All Rights Reserved
-#
-# This file contains code from the Python 2.2 hmac.py module (the
-# "Original Code"), with modifications made after it was incorporated
-# into PyCrypto (the "Modifications").
-#
-# To the best of our knowledge, the Python Software Foundation is the
-# copyright holder of the Original Code, and has licensed it under the
-# Python 2.2 license. See the file LEGAL/copy/LICENSE.python-2.2 for
-# details.
-#
-# The Modifications to this file are dedicated to the public domain.
-# To the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever. No rights are
-# reserved.
-#
-# 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.
-# ===================================================================
-
-
-"""HMAC (Hash-based Message Authentication Code) algorithm
-
-HMAC is a MAC defined in RFC2104_ and FIPS-198_ and constructed using
-a cryptograpic hash algorithm.
-It is usually named *HMAC-X*, where *X* is the hash algorithm; for
-instance *HMAC-SHA1* or *HMAC-MD5*.
-
-The strength of an HMAC depends on:
-
- - the strength of the hash algorithm
- - the length and entropy of the secret key
-
-An example of possible usage is the following:
-
- >>> from Crypto.Hash import HMAC
- >>>
- >>> secret = b'Swordfish'
- >>> h = HMAC.new(secret)
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-.. _RFC2104: http://www.ietf.org/rfc/rfc2104.txt
-.. _FIPS-198: http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf
-"""
-
-# This is just a copy of the Python 2.2 HMAC module, modified to work when
-# used on versions of Python before 2.2.
-
-__revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'HMAC' ]
-
-from Crypto.Util.strxor import strxor_c
-from Crypto.Util.py3compat import *
-
-#: The size of the authentication tag produced by the MAC.
-#: It matches the digest size on the underlying
-#: hashing module used.
-digest_size = None
-
-class HMAC:
- """Class that implements HMAC"""
-
- #: The size of the authentication tag produced by the MAC.
- #: It matches the digest size on the underlying
- #: hashing module used.
- digest_size = None
-
- def __init__(self, key, msg = None, digestmod = None):
- """Create a new HMAC object.
-
- :Parameters:
- key : byte string
- secret key for the MAC object.
- It must be long enough to match the expected security level of the
- MAC. However, there is no benefit in using keys longer than the
- `digest_size` of the underlying hash algorithm.
- msg : byte string
- The very first chunk of the message to authenticate.
- It is equivalent to an early call to `update()`. Optional.
- :Parameter digestmod:
- The hash algorithm the HMAC is based on.
- Default is `Crypto.Hash.MD5`.
- :Type digestmod:
- A hash module or object instantiated from `Crypto.Hash`
- """
- if digestmod is None:
- from . import MD5
- digestmod = MD5
-
- self.digestmod = digestmod
- self.outer = digestmod.new()
- self.inner = digestmod.new()
- try:
- self.digest_size = digestmod.digest_size
- except AttributeError:
- self.digest_size = len(self.outer.digest())
-
- try:
- # The block size is 128 bytes for SHA384 and SHA512 and 64 bytes
- # for the others hash function
- blocksize = digestmod.block_size
- except AttributeError:
- blocksize = 64
-
- ipad = 0x36
- opad = 0x5C
-
- if len(key) > blocksize:
- key = digestmod.new(key).digest()
-
- key = key + bchr(0) * (blocksize - len(key))
- self.outer.update(strxor_c(key, opad))
- self.inner.update(strxor_c(key, ipad))
- if (msg):
- self.update(msg)
-
- def update(self, msg):
- """Continue authentication of a message by consuming the next chunk of data.
-
- Repeated calls are equivalent to a single call with the concatenation
- of all the arguments. In other words:
-
- >>> m.update(a); m.update(b)
-
- is equivalent to:
-
- >>> m.update(a+b)
-
- :Parameters:
- msg : byte string
- The next chunk of the message being authenticated
- """
-
- self.inner.update(msg)
-
- def copy(self):
- """Return a copy ("clone") of the MAC object.
-
- The copy will have the same internal state as the original MAC
- object.
- This can be used to efficiently compute the MAC of strings that
- share a common initial substring.
-
- :Returns: An `HMAC` object
- """
- other = HMAC(b(""))
- other.digestmod = self.digestmod
- other.inner = self.inner.copy()
- other.outer = self.outer.copy()
- return other
-
- def digest(self):
- """Return the **binary** (non-printable) MAC of the message that has
- been authenticated so far.
-
- This method does not change the state of the MAC object.
- You can continue updating the object after calling this function.
-
- :Return: A byte string of `digest_size` bytes. It may contain non-ASCII
- characters, including null bytes.
- """
- h = self.outer.copy()
- h.update(self.inner.digest())
- return h.digest()
-
- def hexdigest(self):
- """Return the **printable** MAC of the message that has been
- authenticated so far.
-
- This method does not change the state of the MAC object.
-
- :Return: A string of 2* `digest_size` bytes. It contains only
- hexadecimal ASCII digits.
- """
- return "".join(["%02x" % bord(x)
- for x in tuple(self.digest())])
-
-def new(key, msg = None, digestmod = None):
- """Create a new HMAC object.
-
- :Parameters:
- key : byte string
- key for the MAC object.
- It must be long enough to match the expected security level of the
- MAC. However, there is no benefit in using keys longer than the
- `digest_size` of the underlying hash algorithm.
- msg : byte string
- The very first chunk of the message to authenticate.
- It is equivalent to an early call to `HMAC.update()`.
- Optional.
- :Parameter digestmod:
- The hash to use to implement the HMAC. Default is `Crypto.Hash.MD5`.
- :Type digestmod:
- A hash module or instantiated object from `Crypto.Hash`
- :Returns: An `HMAC` object
- """
- return HMAC(key, msg, digestmod)
-
diff --git a/frozen_deps/Crypto/Hash/MD2.py b/frozen_deps/Crypto/Hash/MD2.py
deleted file mode 100644
index dac959e..0000000
--- a/frozen_deps/Crypto/Hash/MD2.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""MD2 cryptographic hash algorithm.
-
-MD2 is specified in RFC1319_ and it produces the 128 bit digest of a message.
-
- >>> from Crypto.Hash import MD2
- >>>
- >>> h = MD2.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-MD2 stand for Message Digest version 2, and it was invented by Rivest in 1989.
-
-This algorithm is both slow and insecure. Do not use it for new designs.
-
-.. _RFC1319: http://tools.ietf.org/html/rfc1319
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'MD2Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-import Crypto.Hash._MD2 as _MD2
-hashFactory = _MD2
-
-class MD2Hash(HashAlgo):
- """Class that implements an MD2 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-md2 OBJECT IDENTIFIER ::= {
- #: iso(1) member-body(2) us(840) rsadsi(113549)
- #: digestAlgorithm(2) 2
- #: }
- #:
- #: This value uniquely identifies the MD2 algorithm.
- oid = b('\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02')
-
- digest_size = 16
- block_size = 16
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return MD2Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `MD2Hash.update()`.
- Optional.
-
- :Return: An `MD2Hash` object
- """
- return MD2Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = MD2Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = MD2Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/MD4.py b/frozen_deps/Crypto/Hash/MD4.py
deleted file mode 100644
index e28a201..0000000
--- a/frozen_deps/Crypto/Hash/MD4.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""MD4 cryptographic hash algorithm.
-
-MD4 is specified in RFC1320_ and produces the 128 bit digest of a message.
-
- >>> from Crypto.Hash import MD4
- >>>
- >>> h = MD4.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-MD4 stand for Message Digest version 4, and it was invented by Rivest in 1990.
-
-This algorithm is insecure. Do not use it for new designs.
-
-.. _RFC1320: http://tools.ietf.org/html/rfc1320
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'MD4Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-import Crypto.Hash._MD4 as _MD4
-hashFactory = _MD4
-
-class MD4Hash(HashAlgo):
- """Class that implements an MD4 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-md2 OBJECT IDENTIFIER ::= {
- #: iso(1) member-body(2) us(840) rsadsi(113549)
- #: digestAlgorithm(2) 4
- #: }
- #:
- #: This value uniquely identifies the MD4 algorithm.
- oid = b('\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x04')
-
- digest_size = 16
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return MD4Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `MD4Hash.update()`.
- Optional.
-
- :Return: A `MD4Hash` object
- """
- return MD4Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = MD4Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = MD4Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/MD5.py b/frozen_deps/Crypto/Hash/MD5.py
deleted file mode 100644
index 18e9e7b..0000000
--- a/frozen_deps/Crypto/Hash/MD5.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""MD5 cryptographic hash algorithm.
-
-MD5 is specified in RFC1321_ and produces the 128 bit digest of a message.
-
- >>> from Crypto.Hash import MD5
- >>>
- >>> h = MD5.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-MD5 stand for Message Digest version 5, and it was invented by Rivest in 1991.
-
-This algorithm is insecure. Do not use it for new designs.
-
-.. _RFC1321: http://tools.ietf.org/html/rfc1321
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'MD5Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- # The md5 module is deprecated in Python 2.6, so use hashlib when possible.
- import hashlib
- hashFactory = hashlib.md5
-
-except ImportError:
- import md5
- hashFactory = md5
-
-class MD5Hash(HashAlgo):
- """Class that implements an MD5 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-md5 OBJECT IDENTIFIER ::= {
- #: iso(1) member-body(2) us(840) rsadsi(113549)
- #: digestAlgorithm(2) 5
- #: }
- #:
- #: This value uniquely identifies the MD5 algorithm.
- oid = b('\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05')
-
- digest_size = 16
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return MD5Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `MD5Hash.update()`.
- Optional.
-
- :Return: A `MD5Hash` object
- """
- return MD5Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = MD5Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = MD5Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/RIPEMD.py b/frozen_deps/Crypto/Hash/RIPEMD.py
deleted file mode 100644
index 33099cb..0000000
--- a/frozen_deps/Crypto/Hash/RIPEMD.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""RIPEMD-160 cryptographic hash algorithm.
-
-RIPEMD-160_ produces the 160 bit digest of a message.
-
- >>> from Crypto.Hash import RIPEMD
- >>>
- >>> h = RIPEMD.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-RIPEMD-160 stands for RACE Integrity Primitives Evaluation Message Digest
-with a 160 bit digest. It was invented by Dobbertin, Bosselaers, and Preneel.
-
-This algorithm is considered secure, although it has not been scrutinized as
-extensively as SHA-1. Moreover, it provides an informal security level of just
-80bits.
-
-.. _RIPEMD-160: http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'RIPEMD160Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-import Crypto.Hash._RIPEMD160 as _RIPEMD160
-hashFactory = _RIPEMD160
-
-class RIPEMD160Hash(HashAlgo):
- """Class that implements a RIPMD-160 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-ripemd160 OBJECT IDENTIFIER ::= {
- #: iso(1) identified-organization(3) teletrust(36)
- #: algorithm(3) hashAlgorithm(2) ripemd160(1)
- #: }
- #:
- #: This value uniquely identifies the RIPMD-160 algorithm.
- oid = b("\x06\x05\x2b\x24\x03\x02\x01")
-
- digest_size = 20
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return RIPEMD160Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `RIPEMD160Hash.update()`.
- Optional.
-
- :Return: A `RIPEMD160Hash` object
- """
- return RIPEMD160Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = RIPEMD160Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = RIPEMD160Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/SHA.py b/frozen_deps/Crypto/Hash/SHA.py
deleted file mode 100644
index 0bc5917..0000000
--- a/frozen_deps/Crypto/Hash/SHA.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""SHA-1 cryptographic hash algorithm.
-
-SHA-1_ produces the 160 bit digest of a message.
-
- >>> from Crypto.Hash import SHA
- >>>
- >>> h = SHA.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-*SHA* stands for Secure Hash Algorithm.
-
-This algorithm is not considered secure. Do not use it for new designs.
-
-.. _SHA-1: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'SHA1Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- # The sha module is deprecated in Python 2.6, so use hashlib when possible.
- import hashlib
- hashFactory = hashlib.sha1
-
-except ImportError:
- import sha
- hashFactory = sha
-
-class SHA1Hash(HashAlgo):
- """Class that implements a SHA-1 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-sha1 OBJECT IDENTIFIER ::= {
- #: iso(1) identified-organization(3) oiw(14) secsig(3)
- #: algorithms(2) 26
- #: }
- #:
- #: This value uniquely identifies the SHA-1 algorithm.
- oid = b('\x06\x05\x2b\x0e\x03\x02\x1a')
-
- digest_size = 20
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return SHA1Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `SHA1Hash.update()`.
- Optional.
-
- :Return: A `SHA1Hash` object
- """
- return SHA1Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = SHA1Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = SHA1Hash.block_size
-
-
diff --git a/frozen_deps/Crypto/Hash/SHA224.py b/frozen_deps/Crypto/Hash/SHA224.py
deleted file mode 100644
index 959b56d..0000000
--- a/frozen_deps/Crypto/Hash/SHA224.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""SHA-224 cryptographic hash algorithm.
-
-SHA-224 belongs to the SHA-2_ family of cryptographic hashes.
-It produces the 224 bit digest of a message.
-
- >>> from Crypto.Hash import SHA224
- >>>
- >>> h = SHA224.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-*SHA* stands for Secure Hash Algorithm.
-
-.. _SHA-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'SHA224Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- import hashlib
- hashFactory = hashlib.sha224
-
-except ImportError:
- from Crypto.Hash import _SHA224
- hashFactory = _SHA224
-
-class SHA224Hash(HashAlgo):
- """Class that implements a SHA-224 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-sha224 OBJECT IDENTIFIER ::= {
- #: joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3)
- #: nistalgorithm(4) hashalgs(2) 4
- #: }
- #:
- #: This value uniquely identifies the SHA-224 algorithm.
- oid = b('\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04')
-
- digest_size = 28
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return SHA224Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `SHA224Hash.update()`.
- Optional.
-
- :Return: A `SHA224Hash` object
- """
- return SHA224Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = SHA224Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = SHA224Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/SHA256.py b/frozen_deps/Crypto/Hash/SHA256.py
deleted file mode 100644
index b0a99b3..0000000
--- a/frozen_deps/Crypto/Hash/SHA256.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""SHA-256 cryptographic hash algorithm.
-
-SHA-256 belongs to the SHA-2_ family of cryptographic hashes.
-It produces the 256 bit digest of a message.
-
- >>> from Crypto.Hash import SHA256
- >>>
- >>> h = SHA256.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-*SHA* stands for Secure Hash Algorithm.
-
-.. _SHA-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'SHA256Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- import hashlib
- hashFactory = hashlib.sha256
-
-except ImportError:
- from Crypto.Hash import _SHA256
- hashFactory = _SHA256
-
-class SHA256Hash(HashAlgo):
- """Class that implements a SHA-256 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-sha256 OBJECT IDENTIFIER ::= {
- #: joint-iso-itu-t(2) country(16) us(840) organization(1)
- #: gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1
- #: }
- #:
- #: This value uniquely identifies the SHA-256 algorithm.
- oid = b('\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01')
-
- digest_size = 32
- block_size = 64
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return SHA256Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `SHA256Hash.update()`.
- Optional.
-
- :Return: A `SHA256Hash` object
- """
- return SHA256Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = SHA256Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = SHA256Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/SHA384.py b/frozen_deps/Crypto/Hash/SHA384.py
deleted file mode 100644
index 3490b02..0000000
--- a/frozen_deps/Crypto/Hash/SHA384.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""SHA-384 cryptographic hash algorithm.
-
-SHA-384 belongs to the SHA-2_ family of cryptographic hashes.
-It produces the 384 bit digest of a message.
-
- >>> from Crypto.Hash import SHA384
- >>>
- >>> h = SHA384.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-*SHA* stands for Secure Hash Algorithm.
-
-.. _SHA-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'SHA384Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- import hashlib
- hashFactory = hashlib.sha384
-
-except ImportError:
- from Crypto.Hash import _SHA384
- hashFactory = _SHA384
-
-class SHA384Hash(HashAlgo):
- """Class that implements a SHA-384 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-sha384 OBJECT IDENTIFIER ::= {
- #: joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3)
- #: nistalgorithm(4) hashalgs(2) 2
- #: }
- #:
- #: This value uniquely identifies the SHA-384 algorithm.
- oid = b('\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02')
-
- digest_size = 48
- block_size = 128
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return SHA384Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `SHA384Hash.update()`.
- Optional.
-
- :Return: A `SHA384Hash` object
- """
- return SHA384Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = SHA384Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = SHA384Hash.block_size
-
-
diff --git a/frozen_deps/Crypto/Hash/SHA512.py b/frozen_deps/Crypto/Hash/SHA512.py
deleted file mode 100644
index d57548d..0000000
--- a/frozen_deps/Crypto/Hash/SHA512.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""SHA-512 cryptographic hash algorithm.
-
-SHA-512 belongs to the SHA-2_ family of cryptographic hashes.
-It produces the 512 bit digest of a message.
-
- >>> from Crypto.Hash import SHA512
- >>>
- >>> h = SHA512.new()
- >>> h.update(b'Hello')
- >>> print h.hexdigest()
-
-*SHA* stands for Secure Hash Algorithm.
-
-.. _SHA-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-"""
-
-_revision__ = "$Id$"
-
-__all__ = ['new', 'digest_size', 'SHA512Hash' ]
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash.hashalgo import HashAlgo
-
-try:
- import hashlib
- hashFactory = hashlib.sha512
-
-except ImportError:
- from Crypto.Hash import _SHA512
- hashFactory = _SHA512
-
-class SHA512Hash(HashAlgo):
- """Class that implements a SHA-512 hash
-
- :undocumented: block_size
- """
-
- #: ASN.1 Object identifier (OID)::
- #:
- #: id-sha512 OBJECT IDENTIFIER ::= {
- #: joint-iso-itu-t(2)
- #: country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3
- #: }
- #:
- #: This value uniquely identifies the SHA-512 algorithm.
- oid = b('\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03')
-
- digest_size = 64
- block_size = 128
-
- def __init__(self, data=None):
- HashAlgo.__init__(self, hashFactory, data)
-
- def new(self, data=None):
- return SHA512Hash(data)
-
-def new(data=None):
- """Return a fresh instance of the hash object.
-
- :Parameters:
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `SHA512Hash.update()`.
- Optional.
-
- :Return: A `SHA512Hash` object
- """
- return SHA512Hash().new(data)
-
-#: The size of the resulting hash in bytes.
-digest_size = SHA512Hash.digest_size
-
-#: The internal block size of the hash algorithm in bytes.
-block_size = SHA512Hash.block_size
-
diff --git a/frozen_deps/Crypto/Hash/_MD2.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_MD2.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 6fbfc79..0000000
--- a/frozen_deps/Crypto/Hash/_MD2.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_MD4.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_MD4.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 286f3ec..0000000
--- a/frozen_deps/Crypto/Hash/_MD4.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_RIPEMD160.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_RIPEMD160.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index a66d804..0000000
--- a/frozen_deps/Crypto/Hash/_RIPEMD160.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_SHA224.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_SHA224.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index eac6cae..0000000
--- a/frozen_deps/Crypto/Hash/_SHA224.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_SHA256.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_SHA256.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 0155f47..0000000
--- a/frozen_deps/Crypto/Hash/_SHA256.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_SHA384.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_SHA384.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 3d1049b..0000000
--- a/frozen_deps/Crypto/Hash/_SHA384.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/_SHA512.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Hash/_SHA512.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index e3c5c5c..0000000
--- a/frozen_deps/Crypto/Hash/_SHA512.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Hash/__init__.py b/frozen_deps/Crypto/Hash/__init__.py
deleted file mode 100644
index 4582c66..0000000
--- a/frozen_deps/Crypto/Hash/__init__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Hashing algorithms
-
-Hash functions take arbitrary binary strings as input, and produce a random-like output
-of fixed size that is dependent on the input; it should be practically infeasible
-to derive the original input data given only the hash function's
-output. In other words, the hash function is *one-way*.
-
-It should also not be practically feasible to find a second piece of data
-(a *second pre-image*) whose hash is the same as the original message
-(*weak collision resistance*).
-
-Finally, it should not be feasible to find two arbitrary messages with the
-same hash (*strong collision resistance*).
-
-The output of the hash function is called the *digest* of the input message.
-In general, the security of a hash function is related to the length of the
-digest. If the digest is *n* bits long, its security level is roughly comparable
-to the the one offered by an *n/2* bit encryption algorithm.
-
-Hash functions can be used simply as a integrity check, or, in
-association with a public-key algorithm, can be used to implement
-digital signatures.
-
-The hashing modules here all support the interface described in `PEP
-247`_ , "API for Cryptographic Hash Functions".
-
-.. _`PEP 247` : http://www.python.org/dev/peps/pep-0247/
-
-:undocumented: _MD2, _MD4, _RIPEMD160, _SHA224, _SHA256, _SHA384, _SHA512
-"""
-
-__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD', 'SHA',
- 'SHA224', 'SHA256', 'SHA384', 'SHA512']
-__revision__ = "$Id$"
-
-
diff --git a/frozen_deps/Crypto/Hash/hashalgo.py b/frozen_deps/Crypto/Hash/hashalgo.py
deleted file mode 100644
index b38b3a6..0000000
--- a/frozen_deps/Crypto/Hash/hashalgo.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-from binascii import hexlify
-
-class HashAlgo:
- """A generic class for an abstract cryptographic hash algorithm.
-
- :undocumented: block_size
- """
-
- #: The size of the resulting hash in bytes.
- digest_size = None
- #: The internal block size of the hash algorithm in bytes.
- block_size = None
-
- def __init__(self, hashFactory, data=None):
- """Initialize the hash object.
-
- :Parameters:
- hashFactory : callable
- An object that will generate the actual hash implementation.
- *hashFactory* must have a *new()* method, or must be directly
- callable.
- data : byte string
- The very first chunk of the message to hash.
- It is equivalent to an early call to `update()`.
- """
- if hasattr(hashFactory, 'new'):
- self._hash = hashFactory.new()
- else:
- self._hash = hashFactory()
- if data:
- self.update(data)
-
- def update(self, data):
- """Continue hashing of a message by consuming the next chunk of data.
-
- Repeated calls are equivalent to a single call with the concatenation
- of all the arguments. In other words:
-
- >>> m.update(a); m.update(b)
-
- is equivalent to:
-
- >>> m.update(a+b)
-
- :Parameters:
- data : byte string
- The next chunk of the message being hashed.
- """
- return self._hash.update(data)
-
- def digest(self):
- """Return the **binary** (non-printable) digest of the message that has been hashed so far.
-
- This method does not change the state of the hash object.
- You can continue updating the object after calling this function.
-
- :Return: A byte string of `digest_size` bytes. It may contain non-ASCII
- characters, including null bytes.
- """
- return self._hash.digest()
-
- def hexdigest(self):
- """Return the **printable** digest of the message that has been hashed so far.
-
- This method does not change the state of the hash object.
-
- :Return: A string of 2* `digest_size` characters. It contains only
- hexadecimal ASCII digits.
- """
- return self._hash.hexdigest()
-
- def copy(self):
- """Return a copy ("clone") of the hash object.
-
- The copy will have the same internal state as the original hash
- object.
- This can be used to efficiently compute the digests of strings that
- share a common initial substring.
-
- :Return: A hash object of the same type
- """
- return self._hash.copy()
-
- def new(self, data=None):
- """Return a fresh instance of the hash object.
-
- Unlike the `copy` method, the internal state of the object is empty.
-
- :Parameters:
- data : byte string
- The next chunk of the message being hashed.
-
- :Return: A hash object of the same type
- """
- pass
-
diff --git a/frozen_deps/Crypto/Protocol/AllOrNothing.py b/frozen_deps/Crypto/Protocol/AllOrNothing.py
deleted file mode 100644
index dd20536..0000000
--- a/frozen_deps/Crypto/Protocol/AllOrNothing.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#
-# AllOrNothing.py : all-or-nothing package transformations
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew M. Kuchling and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""This file implements all-or-nothing package transformations.
-
-An all-or-nothing package transformation is one in which some text is
-transformed into message blocks, such that all blocks must be obtained before
-the reverse transformation can be applied. Thus, if any blocks are corrupted
-or lost, the original message cannot be reproduced.
-
-An all-or-nothing package transformation is not encryption, although a block
-cipher algorithm is used. The encryption key is randomly generated and is
-extractable from the message blocks.
-
-This class implements the All-Or-Nothing package transformation algorithm
-described in:
-
-Ronald L. Rivest. "All-Or-Nothing Encryption and The Package Transform"
-http://theory.lcs.mit.edu/~rivest/fusion.pdf
-
-"""
-
-__revision__ = "$Id$"
-
-import operator
-import sys
-from Crypto.Util.number import bytes_to_long, long_to_bytes
-from Crypto.Util.py3compat import *
-from functools import reduce
-
-def isInt(x):
- test = 0
- try:
- test += x
- except TypeError:
- return 0
- return 1
-
-class AllOrNothing:
- """Class implementing the All-or-Nothing package transform.
-
- Methods for subclassing:
-
- _inventkey(key_size):
- Returns a randomly generated key. Subclasses can use this to
- implement better random key generating algorithms. The default
- algorithm is probably not very cryptographically secure.
-
- """
-
- def __init__(self, ciphermodule, mode=None, IV=None):
- """AllOrNothing(ciphermodule, mode=None, IV=None)
-
- ciphermodule is a module implementing the cipher algorithm to
- use. It must provide the PEP272 interface.
-
- Note that the encryption key is randomly generated
- automatically when needed. Optional arguments mode and IV are
- passed directly through to the ciphermodule.new() method; they
- are the feedback mode and initialization vector to use. All
- three arguments must be the same for the object used to create
- the digest, and to undigest'ify the message blocks.
- """
-
- self.__ciphermodule = ciphermodule
- self.__mode = mode
- self.__IV = IV
- self.__key_size = ciphermodule.key_size
- if not isInt(self.__key_size) or self.__key_size==0:
- self.__key_size = 16
-
- __K0digit = bchr(0x69)
-
- def digest(self, text):
- """digest(text:string) : [string]
-
- Perform the All-or-Nothing package transform on the given
- string. Output is a list of message blocks describing the
- transformed text, where each block is a string of bit length equal
- to the ciphermodule's block_size.
- """
-
- # generate a random session key and K0, the key used to encrypt the
- # hash blocks. Rivest calls this a fixed, publically-known encryption
- # key, but says nothing about the security implications of this key or
- # how to choose it.
- key = self._inventkey(self.__key_size)
- K0 = self.__K0digit * self.__key_size
-
- # we need two cipher objects here, one that is used to encrypt the
- # message blocks and one that is used to encrypt the hashes. The
- # former uses the randomly generated key, while the latter uses the
- # well-known key.
- mcipher = self.__newcipher(key)
- hcipher = self.__newcipher(K0)
-
- # Pad the text so that its length is a multiple of the cipher's
- # block_size. Pad with trailing spaces, which will be eliminated in
- # the undigest() step.
- block_size = self.__ciphermodule.block_size
- padbytes = block_size - (len(text) % block_size)
- text = text + b(' ') * padbytes
-
- # Run through the algorithm:
- # s: number of message blocks (size of text / block_size)
- # input sequence: m1, m2, ... ms
- # random key K' (`key' in the code)
- # Compute output sequence: m'1, m'2, ... m's' for s' = s + 1
- # Let m'i = mi ^ E(K', i) for i = 1, 2, 3, ..., s
- # Let m's' = K' ^ h1 ^ h2 ^ ... hs
- # where hi = E(K0, m'i ^ i) for i = 1, 2, ... s
- #
- # The one complication I add is that the last message block is hard
- # coded to the number of padbytes added, so that these can be stripped
- # during the undigest() step
- s = divmod(len(text), block_size)[0]
- blocks = []
- hashes = []
- for i in range(1, s+1):
- start = (i-1) * block_size
- end = start + block_size
- mi = text[start:end]
- assert len(mi) == block_size
- cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
- mticki = bytes_to_long(mi) ^ bytes_to_long(cipherblock)
- blocks.append(mticki)
- # calculate the hash block for this block
- hi = hcipher.encrypt(long_to_bytes(mticki ^ i, block_size))
- hashes.append(bytes_to_long(hi))
-
- # Add the padbytes length as a message block
- i = i + 1
- cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
- mticki = padbytes ^ bytes_to_long(cipherblock)
- blocks.append(mticki)
-
- # calculate this block's hash
- hi = hcipher.encrypt(long_to_bytes(mticki ^ i, block_size))
- hashes.append(bytes_to_long(hi))
-
- # Now calculate the last message block of the sequence 1..s'. This
- # will contain the random session key XOR'd with all the hash blocks,
- # so that for undigest(), once all the hash blocks are calculated, the
- # session key can be trivially extracted. Calculating all the hash
- # blocks requires that all the message blocks be received, thus the
- # All-or-Nothing algorithm succeeds.
- mtick_stick = bytes_to_long(key) ^ reduce(operator.xor, hashes)
- blocks.append(mtick_stick)
-
- # we convert the blocks to strings since in Python, byte sequences are
- # always represented as strings. This is more consistent with the
- # model that encryption and hash algorithms always operate on strings.
- return [long_to_bytes(i,self.__ciphermodule.block_size) for i in blocks]
-
-
- def undigest(self, blocks):
- """undigest(blocks : [string]) : string
-
- Perform the reverse package transformation on a list of message
- blocks. Note that the ciphermodule used for both transformations
- must be the same. blocks is a list of strings of bit length
- equal to the ciphermodule's block_size.
- """
-
- # better have at least 2 blocks, for the padbytes package and the hash
- # block accumulator
- if len(blocks) < 2:
- raise ValueError("List must be at least length 2.")
-
- # blocks is a list of strings. We need to deal with them as long
- # integers
- blocks = list(map(bytes_to_long, blocks))
-
- # Calculate the well-known key, to which the hash blocks are
- # encrypted, and create the hash cipher.
- K0 = self.__K0digit * self.__key_size
- hcipher = self.__newcipher(K0)
- block_size = self.__ciphermodule.block_size
-
- # Since we have all the blocks (or this method would have been called
- # prematurely), we can calculate all the hash blocks.
- hashes = []
- for i in range(1, len(blocks)):
- mticki = blocks[i-1] ^ i
- hi = hcipher.encrypt(long_to_bytes(mticki, block_size))
- hashes.append(bytes_to_long(hi))
-
- # now we can calculate K' (key). remember the last block contains
- # m's' which we don't include here
- key = blocks[-1] ^ reduce(operator.xor, hashes)
-
- # and now we can create the cipher object
- mcipher = self.__newcipher(long_to_bytes(key, self.__key_size))
-
- # And we can now decode the original message blocks
- parts = []
- for i in range(1, len(blocks)):
- cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
- mi = blocks[i-1] ^ bytes_to_long(cipherblock)
- parts.append(mi)
-
- # The last message block contains the number of pad bytes appended to
- # the original text string, such that its length was an even multiple
- # of the cipher's block_size. This number should be small enough that
- # the conversion from long integer to integer should never overflow
- padbytes = int(parts[-1])
- text = b('').join(map(long_to_bytes, parts[:-1]))
- return text[:-padbytes]
-
- def _inventkey(self, key_size):
- # Return key_size random bytes
- from Crypto import Random
- return Random.new().read(key_size)
-
- def __newcipher(self, key):
- if self.__mode is None and self.__IV is None:
- return self.__ciphermodule.new(key)
- elif self.__IV is None:
- return self.__ciphermodule.new(key, self.__mode)
- else:
- return self.__ciphermodule.new(key, self.__mode, self.__IV)
-
-
-
-if __name__ == '__main__':
- import sys
- import getopt
- import base64
-
- usagemsg = '''\
-Test module usage: %(program)s [-c cipher] [-l] [-h]
-
-Where:
- --cipher module
- -c module
- Cipher module to use. Default: %(ciphermodule)s
-
- --aslong
- -l
- Print the encoded message blocks as long integers instead of base64
- encoded strings
-
- --help
- -h
- Print this help message
-'''
-
- ciphermodule = 'AES'
- aslong = 0
-
- def usage(code, msg=None):
- if msg:
- print(msg)
- print(usagemsg % {'program': sys.argv[0],
- 'ciphermodule': ciphermodule})
- sys.exit(code)
-
- try:
- opts, args = getopt.getopt(sys.argv[1:],
- 'c:l', ['cipher=', 'aslong'])
- except getopt.error as msg:
- usage(1, msg)
-
- if args:
- usage(1, 'Too many arguments')
-
- for opt, arg in opts:
- if opt in ('-h', '--help'):
- usage(0)
- elif opt in ('-c', '--cipher'):
- ciphermodule = arg
- elif opt in ('-l', '--aslong'):
- aslong = 1
-
- # ugly hack to force __import__ to give us the end-path module
- module = __import__('Crypto.Cipher.'+ciphermodule, None, None, ['new'])
-
- x = AllOrNothing(module)
- print('Original text:\n==========')
- print(__doc__)
- print('==========')
- msgblocks = x.digest(b(__doc__))
- print('message blocks:')
- for i, blk in zip(list(range(len(msgblocks))), msgblocks):
- # base64 adds a trailing newline
- print(' %3d' % i, end=' ')
- if aslong:
- print(bytes_to_long(blk))
- else:
- print(base64.encodestring(blk)[:-1])
- #
- # get a new undigest-only object so there's no leakage
- y = AllOrNothing(module)
- text = y.undigest(msgblocks)
- if text == b(__doc__):
- print('They match!')
- else:
- print('They differ!')
diff --git a/frozen_deps/Crypto/Protocol/Chaffing.py b/frozen_deps/Crypto/Protocol/Chaffing.py
deleted file mode 100644
index bbfcbda..0000000
--- a/frozen_deps/Crypto/Protocol/Chaffing.py
+++ /dev/null
@@ -1,245 +0,0 @@
-#
-# Chaffing.py : chaffing & winnowing support
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew M. Kuchling, Barry A. Warsaw, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-"""This file implements the chaffing algorithm.
-
-Winnowing and chaffing is a technique for enhancing privacy without requiring
-strong encryption. In short, the technique takes a set of authenticated
-message blocks (the wheat) and adds a number of chaff blocks which have
-randomly chosen data and MAC fields. This means that to an adversary, the
-chaff blocks look as valid as the wheat blocks, and so the authentication
-would have to be performed on every block. By tailoring the number of chaff
-blocks added to the message, the sender can make breaking the message
-computationally infeasible. There are many other interesting properties of
-the winnow/chaff technique.
-
-For example, say Alice is sending a message to Bob. She packetizes the
-message and performs an all-or-nothing transformation on the packets. Then
-she authenticates each packet with a message authentication code (MAC). The
-MAC is a hash of the data packet, and there is a secret key which she must
-share with Bob (key distribution is an exercise left to the reader). She then
-adds a serial number to each packet, and sends the packets to Bob.
-
-Bob receives the packets, and using the shared secret authentication key,
-authenticates the MACs for each packet. Those packets that have bad MACs are
-simply discarded. The remainder are sorted by serial number, and passed
-through the reverse all-or-nothing transform. The transform means that an
-eavesdropper (say Eve) must acquire all the packets before any of the data can
-be read. If even one packet is missing, the data is useless.
-
-There's one twist: by adding chaff packets, Alice and Bob can make Eve's job
-much harder, since Eve now has to break the shared secret key, or try every
-combination of wheat and chaff packet to read any of the message. The cool
-thing is that Bob doesn't need to add any additional code; the chaff packets
-are already filtered out because their MACs don't match (in all likelihood --
-since the data and MACs for the chaff packets are randomly chosen it is
-possible, but very unlikely that a chaff MAC will match the chaff data). And
-Alice need not even be the party adding the chaff! She could be completely
-unaware that a third party, say Charles, is adding chaff packets to her
-messages as they are transmitted.
-
-For more information on winnowing and chaffing see this paper:
-
-Ronald L. Rivest, "Chaffing and Winnowing: Confidentiality without Encryption"
-http://theory.lcs.mit.edu/~rivest/chaffing.txt
-
-"""
-
-__revision__ = "$Id$"
-
-from Crypto.Util.number import bytes_to_long
-
-class Chaff:
- """Class implementing the chaff adding algorithm.
-
- Methods for subclasses:
-
- _randnum(size):
- Returns a randomly generated number with a byte-length equal
- to size. Subclasses can use this to implement better random
- data and MAC generating algorithms. The default algorithm is
- probably not very cryptographically secure. It is most
- important that the chaff data does not contain any patterns
- that can be used to discern it from wheat data without running
- the MAC.
-
- """
-
- def __init__(self, factor=1.0, blocksper=1):
- """Chaff(factor:float, blocksper:int)
-
- factor is the number of message blocks to add chaff to,
- expressed as a percentage between 0.0 and 1.0. blocksper is
- the number of chaff blocks to include for each block being
- chaffed. Thus the defaults add one chaff block to every
- message block. By changing the defaults, you can adjust how
- computationally difficult it could be for an adversary to
- brute-force crack the message. The difficulty is expressed
- as:
-
- pow(blocksper, int(factor * number-of-blocks))
-
- For ease of implementation, when factor < 1.0, only the first
- int(factor*number-of-blocks) message blocks are chaffed.
- """
-
- if not (0.0<=factor<=1.0):
- raise ValueError("'factor' must be between 0.0 and 1.0")
- if blocksper < 0:
- raise ValueError("'blocksper' must be zero or more")
-
- self.__factor = factor
- self.__blocksper = blocksper
-
-
- def chaff(self, blocks):
- """chaff( [(serial-number:int, data:string, MAC:string)] )
- : [(int, string, string)]
-
- Add chaff to message blocks. blocks is a list of 3-tuples of the
- form (serial-number, data, MAC).
-
- Chaff is created by choosing a random number of the same
- byte-length as data, and another random number of the same
- byte-length as MAC. The message block's serial number is
- placed on the chaff block and all the packet's chaff blocks
- are randomly interspersed with the single wheat block. This
- method then returns a list of 3-tuples of the same form.
- Chaffed blocks will contain multiple instances of 3-tuples
- with the same serial number, but the only way to figure out
- which blocks are wheat and which are chaff is to perform the
- MAC hash and compare values.
- """
-
- chaffedblocks = []
-
- # count is the number of blocks to add chaff to. blocksper is the
- # number of chaff blocks to add per message block that is being
- # chaffed.
- count = len(blocks) * self.__factor
- blocksper = list(range(self.__blocksper))
- for i, wheat in zip(list(range(len(blocks))), blocks):
- # it shouldn't matter which of the n blocks we add chaff to, so for
- # ease of implementation, we'll just add them to the first count
- # blocks
- if i < count:
- serial, data, mac = wheat
- datasize = len(data)
- macsize = len(mac)
- addwheat = 1
- # add chaff to this block
- for j in blocksper:
- import sys
- chaffdata = self._randnum(datasize)
- chaffmac = self._randnum(macsize)
- chaff = (serial, chaffdata, chaffmac)
- # mix up the order, if the 5th bit is on then put the
- # wheat on the list
- if addwheat and bytes_to_long(self._randnum(16)) & 0x40:
- chaffedblocks.append(wheat)
- addwheat = 0
- chaffedblocks.append(chaff)
- if addwheat:
- chaffedblocks.append(wheat)
- else:
- # just add the wheat
- chaffedblocks.append(wheat)
- return chaffedblocks
-
- def _randnum(self, size):
- from Crypto import Random
- return Random.new().read(size)
-
-
-if __name__ == '__main__':
- text = """\
-We hold these truths to be self-evident, that all men are created equal, that
-they are endowed by their Creator with certain unalienable Rights, that among
-these are Life, Liberty, and the pursuit of Happiness. That to secure these
-rights, Governments are instituted among Men, deriving their just powers from
-the consent of the governed. That whenever any Form of Government becomes
-destructive of these ends, it is the Right of the People to alter or to
-abolish it, and to institute new Government, laying its foundation on such
-principles and organizing its powers in such form, as to them shall seem most
-likely to effect their Safety and Happiness.
-"""
- print('Original text:\n==========')
- print(text)
- print('==========')
-
- # first transform the text into packets
- blocks = [] ; size = 40
- for i in range(0, len(text), size):
- blocks.append( text[i:i+size] )
-
- # now get MACs for all the text blocks. The key is obvious...
- print('Calculating MACs...')
- from Crypto.Hash import HMAC, SHA
- key = 'Jefferson'
- macs = [HMAC.new(key, block, digestmod=SHA).digest()
- for block in blocks]
-
- assert len(blocks) == len(macs)
-
- # put these into a form acceptable as input to the chaffing procedure
- source = []
- m = list(zip(list(range(len(blocks))), blocks, macs))
- print(m)
- for i, data, mac in m:
- source.append((i, data, mac))
-
- # now chaff these
- print('Adding chaff...')
- c = Chaff(factor=0.5, blocksper=2)
- chaffed = c.chaff(source)
-
- from base64 import encodestring
-
- # print the chaffed message blocks. meanwhile, separate the wheat from
- # the chaff
-
- wheat = []
- print('chaffed message blocks:')
- for i, data, mac in chaffed:
- # do the authentication
- h = HMAC.new(key, data, digestmod=SHA)
- pmac = h.digest()
- if pmac == mac:
- tag = '-->'
- wheat.append(data)
- else:
- tag = ' '
- # base64 adds a trailing newline
- print(tag, '%3d' % i, \
- repr(data), encodestring(mac)[:-1])
-
- # now decode the message packets and check it against the original text
- print('Undigesting wheat...')
- # PY3K: This is meant to be text, do not change to bytes (data)
- newtext = "".join(wheat)
- if newtext == text:
- print('They match!')
- else:
- print('They differ!')
diff --git a/frozen_deps/Crypto/Protocol/KDF.py b/frozen_deps/Crypto/Protocol/KDF.py
deleted file mode 100644
index af4e2a6..0000000
--- a/frozen_deps/Crypto/Protocol/KDF.py
+++ /dev/null
@@ -1,123 +0,0 @@
-#
-# KDF.py : a collection of Key Derivation Functions
-#
-# Part of the Python Cryptography Toolkit
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""This file contains a collection of standard key derivation functions.
-
-A key derivation function derives one or more secondary secret keys from
-one primary secret (a master key or a pass phrase).
-
-This is typically done to insulate the secondary keys from each other,
-to avoid that leakage of a secondary key compromises the security of the
-master key, or to thwart attacks on pass phrases (e.g. via rainbow tables).
-
-:undocumented: __revision__
-"""
-
-__revision__ = "$Id$"
-
-import math
-import struct
-
-from Crypto.Util.py3compat import *
-from Crypto.Hash import SHA as SHA1, HMAC
-from Crypto.Util.strxor import strxor
-
-def PBKDF1(password, salt, dkLen, count=1000, hashAlgo=None):
- """Derive one key from a password (or passphrase).
-
- This function performs key derivation according an old version of
- the PKCS#5 standard (v1.5).
-
- This algorithm is called ``PBKDF1``. Even though it is still described
- in the latest version of the PKCS#5 standard (version 2, or RFC2898),
- newer applications should use the more secure and versatile `PBKDF2` instead.
-
- :Parameters:
- password : string
- The secret password or pass phrase to generate the key from.
- salt : byte string
- An 8 byte string to use for better protection from dictionary attacks.
- This value does not need to be kept secret, but it should be randomly
- chosen for each derivation.
- dkLen : integer
- The length of the desired key. Default is 16 bytes, suitable for instance for `Crypto.Cipher.AES`.
- count : integer
- The number of iterations to carry out. It's recommended to use at least 1000.
- hashAlgo : module
- The hash algorithm to use, as a module or an object from the `Crypto.Hash` package.
- The digest length must be no shorter than ``dkLen``.
- The default algorithm is `SHA1`.
-
- :Return: A byte string of length `dkLen` that can be used as key.
- """
- if not hashAlgo:
- hashAlgo = SHA1
- password = tobytes(password)
- pHash = hashAlgo.new(password+salt)
- digest = pHash.digest_size
- if dkLen>digest:
- raise ValueError("Selected hash algorithm has a too short digest (%d bytes)." % digest)
- if len(salt)!=8:
- raise ValueError("Salt is not 8 bytes long.")
- for i in range(count-1):
- pHash = pHash.new(pHash.digest())
- return pHash.digest()[:dkLen]
-
-def PBKDF2(password, salt, dkLen=16, count=1000, prf=None):
- """Derive one or more keys from a password (or passphrase).
-
- This performs key derivation according to the PKCS#5 standard (v2.0),
- by means of the ``PBKDF2`` algorithm.
-
- :Parameters:
- password : string
- The secret password or pass phrase to generate the key from.
- salt : string
- A string to use for better protection from dictionary attacks.
- This value does not need to be kept secret, but it should be randomly
- chosen for each derivation. It is recommended to be at least 8 bytes long.
- dkLen : integer
- The cumulative length of the desired keys. Default is 16 bytes, suitable for instance for `Crypto.Cipher.AES`.
- count : integer
- The number of iterations to carry out. It's recommended to use at least 1000.
- prf : callable
- A pseudorandom function. It must be a function that returns a pseudorandom string
- from two parameters: a secret and a salt. If not specified, HMAC-SHA1 is used.
-
- :Return: A byte string of length `dkLen` that can be used as key material.
- If you wanted multiple keys, just break up this string into segments of the desired length.
-"""
- password = tobytes(password)
- if prf is None:
- prf = lambda p,s: HMAC.new(p,s,SHA1).digest()
- key = b('')
- i = 1
- while len(key)<dkLen:
- U = previousU = prf(password,salt+struct.pack(">I", i))
- for j in range(count-1):
- previousU = t = prf(password,previousU)
- U = strxor(U,t)
- key += U
- i = i + 1
- return key[:dkLen]
-
diff --git a/frozen_deps/Crypto/Protocol/__init__.py b/frozen_deps/Crypto/Protocol/__init__.py
deleted file mode 100644
index cacc685..0000000
--- a/frozen_deps/Crypto/Protocol/__init__.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Cryptographic protocols
-
-Implements various cryptographic protocols. (Don't expect to find
-network protocols here.)
-
-Crypto.Protocol.AllOrNothing
- Transforms a message into a set of message blocks, such that the blocks
- can be recombined to get the message back.
-
-Crypto.Protocol.Chaffing
- Takes a set of authenticated message blocks (the wheat) and adds a number
- of randomly generated blocks (the chaff).
-
-Crypto.Protocol.KDF
- A collection of standard key derivation functions.
-
-:undocumented: __revision__
-"""
-
-__all__ = ['AllOrNothing', 'Chaffing', 'KDF']
-__revision__ = "$Id$"
diff --git a/frozen_deps/Crypto/PublicKey/DSA.py b/frozen_deps/Crypto/PublicKey/DSA.py
deleted file mode 100644
index 648f4b2..0000000
--- a/frozen_deps/Crypto/PublicKey/DSA.py
+++ /dev/null
@@ -1,379 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# PublicKey/DSA.py : DSA signature primitive
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""DSA public-key signature algorithm.
-
-DSA_ is a widespread public-key signature algorithm. Its security is
-based on the discrete logarithm problem (DLP_). Given a cyclic
-group, a generator *g*, and an element *h*, it is hard
-to find an integer *x* such that *g^x = h*. The problem is believed
-to be difficult, and it has been proved such (and therefore secure) for
-more than 30 years.
-
-The group is actually a sub-group over the integers modulo *p*, with *p* prime.
-The sub-group order is *q*, which is prime too; it always holds that *(p-1)* is a multiple of *q*.
-The cryptographic strength is linked to the magnitude of *p* and *q*.
-The signer holds a value *x* (*0<x<q-1*) as private key, and its public
-key (*y* where *y=g^x mod p*) is distributed.
-
-In 2012, a sufficient size is deemed to be 2048 bits for *p* and 256 bits for *q*.
-For more information, see the most recent ECRYPT_ report.
-
-DSA is reasonably secure for new designs.
-
-The algorithm can only be used for authentication (digital signature).
-DSA cannot be used for confidentiality (encryption).
-
-The values *(p,q,g)* are called *domain parameters*;
-they are not sensitive but must be shared by both parties (the signer and the verifier).
-Different signers can share the same domain parameters with no security
-concerns.
-
-The DSA signature is twice as big as the size of *q* (64 bytes if *q* is 256 bit
-long).
-
-This module provides facilities for generating new DSA keys and for constructing
-them from known components. DSA keys allows you to perform basic signing and
-verification.
-
- >>> from Crypto.Random import random
- >>> from Crypto.PublicKey import DSA
- >>> from Crypto.Hash import SHA
- >>>
- >>> message = "Hello"
- >>> key = DSA.generate(1024)
- >>> h = SHA.new(message).digest()
- >>> k = random.StrongRandom().randint(1,key.q-1)
- >>> sig = key.sign(h,k)
- >>> ...
- >>> if key.verify(h,sig):
- >>> print "OK"
- >>> else:
- >>> print "Incorrect signature"
-
-.. _DSA: http://en.wikipedia.org/wiki/Digital_Signature_Algorithm
-.. _DLP: http://www.cosic.esat.kuleuven.be/publications/talk-78.pdf
-.. _ECRYPT: http://www.ecrypt.eu.org/documents/D.SPA.17.pdf
-"""
-
-__revision__ = "$Id$"
-
-__all__ = ['generate', 'construct', 'error', 'DSAImplementation', '_DSAobj']
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-
-from Crypto.PublicKey import _DSA, _slowmath, pubkey
-from Crypto import Random
-
-try:
- from Crypto.PublicKey import _fastmath
-except ImportError:
- _fastmath = None
-
-class _DSAobj(pubkey.pubkey):
- """Class defining an actual DSA key.
-
- :undocumented: __getstate__, __setstate__, __repr__, __getattr__
- """
- #: Dictionary of DSA parameters.
- #:
- #: A public key will only have the following entries:
- #:
- #: - **y**, the public key.
- #: - **g**, the generator.
- #: - **p**, the modulus.
- #: - **q**, the order of the sub-group.
- #:
- #: A private key will also have:
- #:
- #: - **x**, the private key.
- keydata = ['y', 'g', 'p', 'q', 'x']
-
- def __init__(self, implementation, key):
- self.implementation = implementation
- self.key = key
-
- def __getattr__(self, attrname):
- if attrname in self.keydata:
- # For backward compatibility, allow the user to get (not set) the
- # DSA key parameters directly from this object.
- return getattr(self.key, attrname)
- else:
- raise AttributeError("%s object has no %r attribute" % (self.__class__.__name__, attrname,))
-
- def sign(self, M, K):
- """Sign a piece of data with DSA.
-
- :Parameter M: The piece of data to sign with DSA. It may
- not be longer in bit size than the sub-group order (*q*).
- :Type M: byte string or long
-
- :Parameter K: A secret number, chosen randomly in the closed
- range *[1,q-1]*.
- :Type K: long (recommended) or byte string (not recommended)
-
- :attention: selection of *K* is crucial for security. Generating a
- random number larger than *q* and taking the modulus by *q* is
- **not** secure, since smaller values will occur more frequently.
- Generating a random number systematically smaller than *q-1*
- (e.g. *floor((q-1)/8)* random bytes) is also **not** secure. In general,
- it shall not be possible for an attacker to know the value of `any
- bit of K`__.
-
- :attention: The number *K* shall not be reused for any other
- operation and shall be discarded immediately.
-
- :attention: M must be a digest cryptographic hash, otherwise
- an attacker may mount an existential forgery attack.
-
- :Return: A tuple with 2 longs.
-
- .. __: http://www.di.ens.fr/~pnguyen/pub_NgSh00.htm
- """
- return pubkey.pubkey.sign(self, M, K)
-
- def verify(self, M, signature):
- """Verify the validity of a DSA signature.
-
- :Parameter M: The expected message.
- :Type M: byte string or long
-
- :Parameter signature: The DSA signature to verify.
- :Type signature: A tuple with 2 longs as return by `sign`
-
- :Return: True if the signature is correct, False otherwise.
- """
- return pubkey.pubkey.verify(self, M, signature)
-
- def _encrypt(self, c, K):
- raise TypeError("DSA cannot encrypt")
-
- def _decrypt(self, c):
- raise TypeError("DSA cannot decrypt")
-
- def _blind(self, m, r):
- raise TypeError("DSA cannot blind")
-
- def _unblind(self, m, r):
- raise TypeError("DSA cannot unblind")
-
- def _sign(self, m, k):
- return self.key._sign(m, k)
-
- def _verify(self, m, sig):
- (r, s) = sig
- return self.key._verify(m, r, s)
-
- def has_private(self):
- return self.key.has_private()
-
- def size(self):
- return self.key.size()
-
- def can_blind(self):
- return False
-
- def can_encrypt(self):
- return False
-
- def can_sign(self):
- return True
-
- def publickey(self):
- return self.implementation.construct((self.key.y, self.key.g, self.key.p, self.key.q))
-
- def __getstate__(self):
- d = {}
- for k in self.keydata:
- try:
- d[k] = getattr(self.key, k)
- except AttributeError:
- pass
- return d
-
- def __setstate__(self, d):
- if not hasattr(self, 'implementation'):
- self.implementation = DSAImplementation()
- t = []
- for k in self.keydata:
- if k not in d:
- break
- t.append(d[k])
- self.key = self.implementation._math.dsa_construct(*tuple(t))
-
- def __repr__(self):
- attrs = []
- for k in self.keydata:
- if k == 'p':
- attrs.append("p(%d)" % (self.size()+1,))
- elif hasattr(self.key, k):
- attrs.append(k)
- if self.has_private():
- attrs.append("private")
- # PY3K: This is meant to be text, do not change to bytes (data)
- return "<%s @0x%x %s>" % (self.__class__.__name__, id(self), ",".join(attrs))
-
-class DSAImplementation(object):
- """
- A DSA key factory.
-
- This class is only internally used to implement the methods of the
- `Crypto.PublicKey.DSA` module.
- """
-
- def __init__(self, **kwargs):
- """Create a new DSA key factory.
-
- :Keywords:
- use_fast_math : bool
- Specify which mathematic library to use:
-
- - *None* (default). Use fastest math available.
- - *True* . Use fast math.
- - *False* . Use slow math.
- default_randfunc : callable
- Specify how to collect random data:
-
- - *None* (default). Use Random.new().read().
- - not *None* . Use the specified function directly.
- :Raise RuntimeError:
- When **use_fast_math** =True but fast math is not available.
- """
- use_fast_math = kwargs.get('use_fast_math', None)
- if use_fast_math is None: # Automatic
- if _fastmath is not None:
- self._math = _fastmath
- else:
- self._math = _slowmath
-
- elif use_fast_math: # Explicitly select fast math
- if _fastmath is not None:
- self._math = _fastmath
- else:
- raise RuntimeError("fast math module not available")
-
- else: # Explicitly select slow math
- self._math = _slowmath
-
- self.error = self._math.error
-
- # 'default_randfunc' parameter:
- # None (default) - use Random.new().read
- # not None - use the specified function
- self._default_randfunc = kwargs.get('default_randfunc', None)
- self._current_randfunc = None
-
- def _get_randfunc(self, randfunc):
- if randfunc is not None:
- return randfunc
- elif self._current_randfunc is None:
- self._current_randfunc = Random.new().read
- return self._current_randfunc
-
- def generate(self, bits, randfunc=None, progress_func=None):
- """Randomly generate a fresh, new DSA key.
-
- :Parameters:
- bits : int
- Key length, or size (in bits) of the DSA modulus
- *p*.
- It must be a multiple of 64, in the closed
- interval [512,1024].
- randfunc : callable
- Random number generation function; it should accept
- a single integer N and return a string of random data
- N bytes long.
- If not specified, a new one will be instantiated
- from ``Crypto.Random``.
- progress_func : callable
- Optional function that will be called with a short string
- containing the key parameter currently being generated;
- it's useful for interactive applications where a user is
- waiting for a key to be generated.
-
- :attention: You should always use a cryptographically secure random number generator,
- such as the one defined in the ``Crypto.Random`` module; **don't** just use the
- current time and the ``random`` module.
-
- :Return: A DSA key object (`_DSAobj`).
-
- :Raise ValueError:
- When **bits** is too little, too big, or not a multiple of 64.
- """
-
- # Check against FIPS 186-2, which says that the size of the prime p
- # must be a multiple of 64 bits between 512 and 1024
- for i in (0, 1, 2, 3, 4, 5, 6, 7, 8):
- if bits == 512 + 64*i:
- return self._generate(bits, randfunc, progress_func)
-
- # The March 2006 draft of FIPS 186-3 also allows 2048 and 3072-bit
- # primes, but only with longer q values. Since the current DSA
- # implementation only supports a 160-bit q, we don't support larger
- # values.
- raise ValueError("Number of bits in p must be a multiple of 64 between 512 and 1024, not %d bits" % (bits,))
-
- def _generate(self, bits, randfunc=None, progress_func=None):
- rf = self._get_randfunc(randfunc)
- obj = _DSA.generate_py(bits, rf, progress_func) # TODO: Don't use legacy _DSA module
- key = self._math.dsa_construct(obj.y, obj.g, obj.p, obj.q, obj.x)
- return _DSAobj(self, key)
-
- def construct(self, tup):
- """Construct a DSA key from a tuple of valid DSA components.
-
- The modulus *p* must be a prime.
-
- The following equations must apply:
-
- - p-1 = 0 mod q
- - g^x = y mod p
- - 0 < x < q
- - 1 < g < p
-
- :Parameters:
- tup : tuple
- A tuple of long integers, with 4 or 5 items
- in the following order:
-
- 1. Public key (*y*).
- 2. Sub-group generator (*g*).
- 3. Modulus, finite field order (*p*).
- 4. Sub-group order (*q*).
- 5. Private key (*x*). Optional.
-
- :Return: A DSA key object (`_DSAobj`).
- """
- key = self._math.dsa_construct(*tup)
- return _DSAobj(self, key)
-
-_impl = DSAImplementation()
-generate = _impl.generate
-construct = _impl.construct
-error = _impl.error
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
-
diff --git a/frozen_deps/Crypto/PublicKey/ElGamal.py b/frozen_deps/Crypto/PublicKey/ElGamal.py
deleted file mode 100644
index 99af71c..0000000
--- a/frozen_deps/Crypto/PublicKey/ElGamal.py
+++ /dev/null
@@ -1,373 +0,0 @@
-#
-# ElGamal.py : ElGamal encryption/decryption and signatures
-#
-# Part of the Python Cryptography Toolkit
-#
-# Originally written by: A.M. Kuchling
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""ElGamal public-key algorithm (randomized encryption and signature).
-
-Signature algorithm
--------------------
-The security of the ElGamal signature scheme is based (like DSA) on the discrete
-logarithm problem (DLP_). Given a cyclic group, a generator *g*,
-and an element *h*, it is hard to find an integer *x* such that *g^x = h*.
-
-The group is the largest multiplicative sub-group of the integers modulo *p*,
-with *p* prime.
-The signer holds a value *x* (*0<x<p-1*) as private key, and its public
-key (*y* where *y=g^x mod p*) is distributed.
-
-The ElGamal signature is twice as big as *p*.
-
-Encryption algorithm
---------------------
-The security of the ElGamal encryption scheme is based on the computational
-Diffie-Hellman problem (CDH_). Given a cyclic group, a generator *g*,
-and two integers *a* and *b*, it is difficult to find
-the element *g^{ab}* when only *g^a* and *g^b* are known, and not *a* and *b*.
-
-As before, the group is the largest multiplicative sub-group of the integers
-modulo *p*, with *p* prime.
-The receiver holds a value *a* (*0<a<p-1*) as private key, and its public key
-(*b* where *b*=g^a*) is given to the sender.
-
-The ElGamal ciphertext is twice as big as *p*.
-
-Domain parameters
------------------
-For both signature and encryption schemes, the values *(p,g)* are called
-*domain parameters*.
-They are not sensitive but must be distributed to all parties (senders and
-receivers).
-Different signers can share the same domain parameters, as can
-different recipients of encrypted messages.
-
-Security
---------
-Both DLP and CDH problem are believed to be difficult, and they have been proved
-such (and therefore secure) for more than 30 years.
-
-The cryptographic strength is linked to the magnitude of *p*.
-In 2012, a sufficient size for *p* is deemed to be 2048 bits.
-For more information, see the most recent ECRYPT_ report.
-
-Even though ElGamal algorithms are in theory reasonably secure for new designs,
-in practice there are no real good reasons for using them.
-The signature is four times larger than the equivalent DSA, and the ciphertext
-is two times larger than the equivalent RSA.
-
-Functionality
--------------
-This module provides facilities for generating new ElGamal keys and for constructing
-them from known components. ElGamal keys allows you to perform basic signing,
-verification, encryption, and decryption.
-
- >>> from Crypto import Random
- >>> from Crypto.Random import random
- >>> from Crypto.PublicKey import ElGamal
- >>> from Crypto.Util.number import GCD
- >>> from Crypto.Hash import SHA
- >>>
- >>> message = "Hello"
- >>> key = ElGamal.generate(1024, Random.new().read)
- >>> h = SHA.new(message).digest()
- >>> while 1:
- >>> k = random.StrongRandom().randint(1,key.p-1)
- >>> if GCD(k,key.p-1)==1: break
- >>> sig = key.sign(h,k)
- >>> ...
- >>> if key.verify(h,sig):
- >>> print "OK"
- >>> else:
- >>> print "Incorrect signature"
-
-.. _DLP: http://www.cosic.esat.kuleuven.be/publications/talk-78.pdf
-.. _CDH: http://en.wikipedia.org/wiki/Computational_Diffie%E2%80%93Hellman_assumption
-.. _ECRYPT: http://www.ecrypt.eu.org/documents/D.SPA.17.pdf
-"""
-
-__revision__ = "$Id$"
-
-__all__ = ['generate', 'construct', 'error', 'ElGamalobj']
-
-from Crypto.PublicKey.pubkey import *
-from Crypto.Util import number
-
-class error (Exception):
- pass
-
-# Generate an ElGamal key with N bits
-def generate(bits, randfunc, progress_func=None):
- """Randomly generate a fresh, new ElGamal key.
-
- The key will be safe for use for both encryption and signature
- (although it should be used for **only one** purpose).
-
- :Parameters:
- bits : int
- Key length, or size (in bits) of the modulus *p*.
- Recommended value is 2048.
- randfunc : callable
- Random number generation function; it should accept
- a single integer N and return a string of random data
- N bytes long.
- progress_func : callable
- Optional function that will be called with a short string
- containing the key parameter currently being generated;
- it's useful for interactive applications where a user is
- waiting for a key to be generated.
-
- :attention: You should always use a cryptographically secure random number generator,
- such as the one defined in the ``Crypto.Random`` module; **don't** just use the
- current time and the ``random`` module.
-
- :Return: An ElGamal key object (`ElGamalobj`).
- """
- obj=ElGamalobj()
- # Generate a safe prime p
- # See Algorithm 4.86 in Handbook of Applied Cryptography
- if progress_func:
- progress_func('p\n')
- while 1:
- q = bignum(getPrime(bits-1, randfunc))
- obj.p = 2*q+1
- if number.isPrime(obj.p, randfunc=randfunc):
- break
- # Generate generator g
- # See Algorithm 4.80 in Handbook of Applied Cryptography
- # Note that the order of the group is n=p-1=2q, where q is prime
- if progress_func:
- progress_func('g\n')
- while 1:
- # We must avoid g=2 because of Bleichenbacher's attack described
- # in "Generating ElGamal signatures without knowning the secret key",
- # 1996
- #
- obj.g = number.getRandomRange(3, obj.p, randfunc)
- safe = 1
- if pow(obj.g, 2, obj.p)==1:
- safe=0
- if safe and pow(obj.g, q, obj.p)==1:
- safe=0
- # Discard g if it divides p-1 because of the attack described
- # in Note 11.67 (iii) in HAC
- if safe and divmod(obj.p-1, obj.g)[1]==0:
- safe=0
- # g^{-1} must not divide p-1 because of Khadir's attack
- # described in "Conditions of the generator for forging ElGamal
- # signature", 2011
- ginv = number.inverse(obj.g, obj.p)
- if safe and divmod(obj.p-1, ginv)[1]==0:
- safe=0
- if safe:
- break
- # Generate private key x
- if progress_func:
- progress_func('x\n')
- obj.x=number.getRandomRange(2, obj.p-1, randfunc)
- # Generate public key y
- if progress_func:
- progress_func('y\n')
- obj.y = pow(obj.g, obj.x, obj.p)
- return obj
-
-def construct(tup):
- """Construct an ElGamal key from a tuple of valid ElGamal components.
-
- The modulus *p* must be a prime.
-
- The following conditions must apply:
-
- - 1 < g < p-1
- - g^{p-1} = 1 mod p
- - 1 < x < p-1
- - g^x = y mod p
-
- :Parameters:
- tup : tuple
- A tuple of long integers, with 3 or 4 items
- in the following order:
-
- 1. Modulus (*p*).
- 2. Generator (*g*).
- 3. Public key (*y*).
- 4. Private key (*x*). Optional.
-
- :Return: An ElGamal key object (`ElGamalobj`).
- """
-
- obj=ElGamalobj()
- if len(tup) not in [3,4]:
- raise ValueError('argument for construct() wrong length')
- for i in range(len(tup)):
- field = obj.keydata[i]
- setattr(obj, field, tup[i])
- return obj
-
-class ElGamalobj(pubkey):
- """Class defining an ElGamal key.
-
- :undocumented: __getstate__, __setstate__, __repr__, __getattr__
- """
-
- #: Dictionary of ElGamal parameters.
- #:
- #: A public key will only have the following entries:
- #:
- #: - **y**, the public key.
- #: - **g**, the generator.
- #: - **p**, the modulus.
- #:
- #: A private key will also have:
- #:
- #: - **x**, the private key.
- keydata=['p', 'g', 'y', 'x']
-
- def encrypt(self, plaintext, K):
- """Encrypt a piece of data with ElGamal.
-
- :Parameter plaintext: The piece of data to encrypt with ElGamal.
- It must be numerically smaller than the module (*p*).
- :Type plaintext: byte string or long
-
- :Parameter K: A secret number, chosen randomly in the closed
- range *[1,p-2]*.
- :Type K: long (recommended) or byte string (not recommended)
-
- :Return: A tuple with two items. Each item is of the same type as the
- plaintext (string or long).
-
- :attention: selection of *K* is crucial for security. Generating a
- random number larger than *p-1* and taking the modulus by *p-1* is
- **not** secure, since smaller values will occur more frequently.
- Generating a random number systematically smaller than *p-1*
- (e.g. *floor((p-1)/8)* random bytes) is also **not** secure.
- In general, it shall not be possible for an attacker to know
- the value of any bit of K.
-
- :attention: The number *K* shall not be reused for any other
- operation and shall be discarded immediately.
- """
- return pubkey.encrypt(self, plaintext, K)
-
- def decrypt(self, ciphertext):
- """Decrypt a piece of data with ElGamal.
-
- :Parameter ciphertext: The piece of data to decrypt with ElGamal.
- :Type ciphertext: byte string, long or a 2-item tuple as returned
- by `encrypt`
-
- :Return: A byte string if ciphertext was a byte string or a tuple
- of byte strings. A long otherwise.
- """
- return pubkey.decrypt(self, ciphertext)
-
- def sign(self, M, K):
- """Sign a piece of data with ElGamal.
-
- :Parameter M: The piece of data to sign with ElGamal. It may
- not be longer in bit size than *p-1*.
- :Type M: byte string or long
-
- :Parameter K: A secret number, chosen randomly in the closed
- range *[1,p-2]* and such that *gcd(k,p-1)=1*.
- :Type K: long (recommended) or byte string (not recommended)
-
- :attention: selection of *K* is crucial for security. Generating a
- random number larger than *p-1* and taking the modulus by *p-1* is
- **not** secure, since smaller values will occur more frequently.
- Generating a random number systematically smaller than *p-1*
- (e.g. *floor((p-1)/8)* random bytes) is also **not** secure.
- In general, it shall not be possible for an attacker to know
- the value of any bit of K.
-
- :attention: The number *K* shall not be reused for any other
- operation and shall be discarded immediately.
-
- :attention: M must be be a cryptographic hash, otherwise an
- attacker may mount an existential forgery attack.
-
- :Return: A tuple with 2 longs.
- """
- return pubkey.sign(self, M, K)
-
- def verify(self, M, signature):
- """Verify the validity of an ElGamal signature.
-
- :Parameter M: The expected message.
- :Type M: byte string or long
-
- :Parameter signature: The ElGamal signature to verify.
- :Type signature: A tuple with 2 longs as return by `sign`
-
- :Return: True if the signature is correct, False otherwise.
- """
- return pubkey.verify(self, M, signature)
-
- def _encrypt(self, M, K):
- a=pow(self.g, K, self.p)
- b=( M*pow(self.y, K, self.p) ) % self.p
- return ( a,b )
-
- def _decrypt(self, M):
- if (not hasattr(self, 'x')):
- raise TypeError('Private key not available in this object')
- ax=pow(M[0], self.x, self.p)
- plaintext=(M[1] * inverse(ax, self.p ) ) % self.p
- return plaintext
-
- def _sign(self, M, K):
- if (not hasattr(self, 'x')):
- raise TypeError('Private key not available in this object')
- p1=self.p-1
- if (GCD(K, p1)!=1):
- raise ValueError('Bad K value: GCD(K,p-1)!=1')
- a=pow(self.g, K, self.p)
- t=(M-self.x*a) % p1
- while t<0: t=t+p1
- b=(t*inverse(K, p1)) % p1
- return (a, b)
-
- def _verify(self, M, sig):
- if sig[0]<1 or sig[0]>self.p-1:
- return 0
- v1=pow(self.y, sig[0], self.p)
- v1=(v1*pow(sig[0], sig[1], self.p)) % self.p
- v2=pow(self.g, M, self.p)
- if v1==v2:
- return 1
- return 0
-
- def size(self):
- return number.size(self.p) - 1
-
- def has_private(self):
- if hasattr(self, 'x'):
- return 1
- else:
- return 0
-
- def publickey(self):
- return construct((self.p, self.g, self.y))
-
-
-object=ElGamalobj
diff --git a/frozen_deps/Crypto/PublicKey/RSA.py b/frozen_deps/Crypto/PublicKey/RSA.py
deleted file mode 100644
index debe39e..0000000
--- a/frozen_deps/Crypto/PublicKey/RSA.py
+++ /dev/null
@@ -1,719 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# PublicKey/RSA.py : RSA public key primitive
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""RSA public-key cryptography algorithm (signature and encryption).
-
-RSA_ is the most widespread and used public key algorithm. Its security is
-based on the difficulty of factoring large integers. The algorithm has
-withstood attacks for 30 years, and it is therefore considered reasonably
-secure for new designs.
-
-The algorithm can be used for both confidentiality (encryption) and
-authentication (digital signature). It is worth noting that signing and
-decryption are significantly slower than verification and encryption.
-The cryptograhic strength is primarily linked to the length of the modulus *n*.
-In 2012, a sufficient length is deemed to be 2048 bits. For more information,
-see the most recent ECRYPT_ report.
-
-Both RSA ciphertext and RSA signature are as big as the modulus *n* (256
-bytes if *n* is 2048 bit long).
-
-This module provides facilities for generating fresh, new RSA keys, constructing
-them from known components, exporting them, and importing them.
-
- >>> from Crypto.PublicKey import RSA
- >>>
- >>> key = RSA.generate(2048)
- >>> f = open('mykey.pem','w')
- >>> f.write(RSA.exportKey('PEM'))
- >>> f.close()
- ...
- >>> f = open('mykey.pem','r')
- >>> key = RSA.importKey(f.read())
-
-Even though you may choose to directly use the methods of an RSA key object
-to perform the primitive cryptographic operations (e.g. `_RSAobj.encrypt`),
-it is recommended to use one of the standardized schemes instead (like
-`Crypto.Cipher.PKCS1_v1_5` or `Crypto.Signature.PKCS1_v1_5`).
-
-.. _RSA: http://en.wikipedia.org/wiki/RSA_%28algorithm%29
-.. _ECRYPT: http://www.ecrypt.eu.org/documents/D.SPA.17.pdf
-
-:sort: generate,construct,importKey,error
-"""
-
-__revision__ = "$Id$"
-
-__all__ = ['generate', 'construct', 'error', 'importKey', 'RSAImplementation', '_RSAobj']
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-#from Crypto.Util.python_compat import *
-from Crypto.Util.number import getRandomRange, bytes_to_long, long_to_bytes
-
-from Crypto.PublicKey import _RSA, _slowmath, pubkey
-from Crypto import Random
-
-from Crypto.Util.asn1 import DerObject, DerSequence, DerNull
-import binascii
-import struct
-
-from Crypto.Util.number import inverse
-
-from Crypto.Util.number import inverse
-
-try:
- from Crypto.PublicKey import _fastmath
-except ImportError:
- _fastmath = None
-
-class _RSAobj(pubkey.pubkey):
- """Class defining an actual RSA key.
-
- :undocumented: __getstate__, __setstate__, __repr__, __getattr__
- """
- #: Dictionary of RSA parameters.
- #:
- #: A public key will only have the following entries:
- #:
- #: - **n**, the modulus.
- #: - **e**, the public exponent.
- #:
- #: A private key will also have:
- #:
- #: - **d**, the private exponent.
- #: - **p**, the first factor of n.
- #: - **q**, the second factor of n.
- #: - **u**, the CRT coefficient (1/p) mod q.
- keydata = ['n', 'e', 'd', 'p', 'q', 'u']
-
- def __init__(self, implementation, key, randfunc=None):
- self.implementation = implementation
- self.key = key
- if randfunc is None:
- randfunc = Random.new().read
- self._randfunc = randfunc
-
- def __getattr__(self, attrname):
- if attrname in self.keydata:
- # For backward compatibility, allow the user to get (not set) the
- # RSA key parameters directly from this object.
- return getattr(self.key, attrname)
- else:
- raise AttributeError("%s object has no %r attribute" % (self.__class__.__name__, attrname,))
-
- def encrypt(self, plaintext, K):
- """Encrypt a piece of data with RSA.
-
- :Parameter plaintext: The piece of data to encrypt with RSA. It may not
- be numerically larger than the RSA module (**n**).
- :Type plaintext: byte string or long
-
- :Parameter K: A random parameter (*for compatibility only. This
- value will be ignored*)
- :Type K: byte string or long
-
- :attention: this function performs the plain, primitive RSA encryption
- (*textbook*). In real applications, you always need to use proper
- cryptographic padding, and you should not directly encrypt data with
- this method. Failure to do so may lead to security vulnerabilities.
- It is recommended to use modules
- `Crypto.Cipher.PKCS1_OAEP` or `Crypto.Cipher.PKCS1_v1_5` instead.
-
- :Return: A tuple with two items. The first item is the ciphertext
- of the same type as the plaintext (string or long). The second item
- is always None.
- """
- return pubkey.pubkey.encrypt(self, plaintext, K)
-
- def decrypt(self, ciphertext):
- """Decrypt a piece of data with RSA.
-
- Decryption always takes place with blinding.
-
- :attention: this function performs the plain, primitive RSA decryption
- (*textbook*). In real applications, you always need to use proper
- cryptographic padding, and you should not directly decrypt data with
- this method. Failure to do so may lead to security vulnerabilities.
- It is recommended to use modules
- `Crypto.Cipher.PKCS1_OAEP` or `Crypto.Cipher.PKCS1_v1_5` instead.
-
- :Parameter ciphertext: The piece of data to decrypt with RSA. It may
- not be numerically larger than the RSA module (**n**). If a tuple,
- the first item is the actual ciphertext; the second item is ignored.
-
- :Type ciphertext: byte string, long or a 2-item tuple as returned by
- `encrypt`
-
- :Return: A byte string if ciphertext was a byte string or a tuple
- of byte strings. A long otherwise.
- """
- return pubkey.pubkey.decrypt(self, ciphertext)
-
- def sign(self, M, K):
- """Sign a piece of data with RSA.
-
- Signing always takes place with blinding.
-
- :attention: this function performs the plain, primitive RSA decryption
- (*textbook*). In real applications, you always need to use proper
- cryptographic padding, and you should not directly sign data with
- this method. Failure to do so may lead to security vulnerabilities.
- It is recommended to use modules
- `Crypto.Signature.PKCS1_PSS` or `Crypto.Signature.PKCS1_v1_5` instead.
-
- :Parameter M: The piece of data to sign with RSA. It may
- not be numerically larger than the RSA module (**n**).
- :Type M: byte string or long
-
- :Parameter K: A random parameter (*for compatibility only. This
- value will be ignored*)
- :Type K: byte string or long
-
- :Return: A 2-item tuple. The first item is the actual signature (a
- long). The second item is always None.
- """
- return pubkey.pubkey.sign(self, M, K)
-
- def verify(self, M, signature):
- """Verify the validity of an RSA signature.
-
- :attention: this function performs the plain, primitive RSA encryption
- (*textbook*). In real applications, you always need to use proper
- cryptographic padding, and you should not directly verify data with
- this method. Failure to do so may lead to security vulnerabilities.
- It is recommended to use modules
- `Crypto.Signature.PKCS1_PSS` or `Crypto.Signature.PKCS1_v1_5` instead.
-
- :Parameter M: The expected message.
- :Type M: byte string or long
-
- :Parameter signature: The RSA signature to verify. The first item of
- the tuple is the actual signature (a long not larger than the modulus
- **n**), whereas the second item is always ignored.
- :Type signature: A 2-item tuple as return by `sign`
-
- :Return: True if the signature is correct, False otherwise.
- """
- return pubkey.pubkey.verify(self, M, signature)
-
- def _encrypt(self, c, K):
- return (self.key._encrypt(c),)
-
- def _decrypt(self, c):
- #(ciphertext,) = c
- (ciphertext,) = c[:1] # HACK - We should use the previous line
- # instead, but this is more compatible and we're
- # going to replace the Crypto.PublicKey API soon
- # anyway.
-
- # Blinded RSA decryption (to prevent timing attacks):
- # Step 1: Generate random secret blinding factor r, such that 0 < r < n-1
- r = getRandomRange(1, self.key.n-1, randfunc=self._randfunc)
- # Step 2: Compute c' = c * r**e mod n
- cp = self.key._blind(ciphertext, r)
- # Step 3: Compute m' = c'**d mod n (ordinary RSA decryption)
- mp = self.key._decrypt(cp)
- # Step 4: Compute m = m**(r-1) mod n
- return self.key._unblind(mp, r)
-
- def _blind(self, m, r):
- return self.key._blind(m, r)
-
- def _unblind(self, m, r):
- return self.key._unblind(m, r)
-
- def _sign(self, m, K=None):
- return (self.key._sign(m),)
-
- def _verify(self, m, sig):
- #(s,) = sig
- (s,) = sig[:1] # HACK - We should use the previous line instead, but
- # this is more compatible and we're going to replace
- # the Crypto.PublicKey API soon anyway.
- return self.key._verify(m, s)
-
- def has_private(self):
- return self.key.has_private()
-
- def size(self):
- return self.key.size()
-
- def can_blind(self):
- return True
-
- def can_encrypt(self):
- return True
-
- def can_sign(self):
- return True
-
- def publickey(self):
- return self.implementation.construct((self.key.n, self.key.e))
-
- def __getstate__(self):
- d = {}
- for k in self.keydata:
- try:
- d[k] = getattr(self.key, k)
- except AttributeError:
- pass
- return d
-
- def __setstate__(self, d):
- if not hasattr(self, 'implementation'):
- self.implementation = RSAImplementation()
- t = []
- for k in self.keydata:
- if k not in d:
- break
- t.append(d[k])
- self.key = self.implementation._math.rsa_construct(*tuple(t))
-
- def __repr__(self):
- attrs = []
- for k in self.keydata:
- if k == 'n':
- attrs.append("n(%d)" % (self.size()+1,))
- elif hasattr(self.key, k):
- attrs.append(k)
- if self.has_private():
- attrs.append("private")
- # PY3K: This is meant to be text, do not change to bytes (data)
- return "<%s @0x%x %s>" % (self.__class__.__name__, id(self), ",".join(attrs))
-
- def exportKey(self, format='PEM', passphrase=None, pkcs=1):
- """Export this RSA key.
-
- :Parameter format: The format to use for wrapping the key.
-
- - *'DER'*. Binary encoding, always unencrypted.
- - *'PEM'*. Textual encoding, done according to `RFC1421`_/`RFC1423`_.
- Unencrypted (default) or encrypted.
- - *'OpenSSH'*. Textual encoding, done according to OpenSSH specification.
- Only suitable for public keys (not private keys).
- :Type format: string
-
- :Parameter passphrase: In case of PEM, the pass phrase to derive the encryption key from.
- :Type passphrase: string
-
- :Parameter pkcs: The PKCS standard to follow for assembling the key.
- You have two choices:
-
- - with **1**, the public key is embedded into an X.509 `SubjectPublicKeyInfo` DER SEQUENCE.
- The private key is embedded into a `PKCS#1`_ `RSAPrivateKey` DER SEQUENCE.
- This mode is the default.
- - with **8**, the private key is embedded into a `PKCS#8`_ `PrivateKeyInfo` DER SEQUENCE.
- This mode is not available for public keys.
-
- PKCS standards are not relevant for the *OpenSSH* format.
- :Type pkcs: integer
-
- :Return: A byte string with the encoded public or private half.
- :Raise ValueError:
- When the format is unknown.
-
- .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt
- .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt
- .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt
- .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt
- """
- if passphrase is not None:
- passphrase = tobytes(passphrase)
- if format=='OpenSSH':
- eb = long_to_bytes(self.e)
- nb = long_to_bytes(self.n)
- if bord(eb[0]) & 0x80: eb=bchr(0x00)+eb
- if bord(nb[0]) & 0x80: nb=bchr(0x00)+nb
- keyparts = [ 'ssh-rsa', eb, nb ]
- keystring = ''.join([ struct.pack(">I",len(kp))+kp for kp in keyparts])
- return 'ssh-rsa '+binascii.b2a_base64(keystring)[:-1]
-
- # DER format is always used, even in case of PEM, which simply
- # encodes it into BASE64.
- der = DerSequence()
- if self.has_private():
- keyType= { 1: 'RSA PRIVATE', 8: 'PRIVATE' }[pkcs]
- der[:] = [ 0, self.n, self.e, self.d, self.p, self.q,
- self.d % (self.p-1), self.d % (self.q-1),
- inverse(self.q, self.p) ]
- if pkcs==8:
- derkey = der.encode()
- der = DerSequence([0])
- der.append(algorithmIdentifier)
- der.append(DerObject('OCTET STRING', derkey).encode())
- else:
- keyType = "PUBLIC"
- der.append(algorithmIdentifier)
- bitmap = DerObject('BIT STRING')
- derPK = DerSequence( [ self.n, self.e ] )
- bitmap.payload = bchr(0x00) + derPK.encode()
- der.append(bitmap.encode())
- if format=='DER':
- return der.encode()
- if format=='PEM':
- pem = b("-----BEGIN " + keyType + " KEY-----\n")
- objenc = None
- if passphrase and keyType.endswith('PRIVATE'):
- # We only support 3DES for encryption
- import Crypto.Hash.MD5
- from Crypto.Cipher import DES3
- from Crypto.Protocol.KDF import PBKDF1
- salt = self._randfunc(8)
- key = PBKDF1(passphrase, salt, 16, 1, Crypto.Hash.MD5)
- key += PBKDF1(key+passphrase, salt, 8, 1, Crypto.Hash.MD5)
- objenc = DES3.new(key, Crypto.Cipher.DES3.MODE_CBC, salt)
- pem += b('Proc-Type: 4,ENCRYPTED\n')
- pem += b('DEK-Info: DES-EDE3-CBC,') + binascii.b2a_hex(salt).upper() + b('\n\n')
-
- binaryKey = der.encode()
- if objenc:
- # Add PKCS#7-like padding
- padding = objenc.block_size-len(binaryKey)%objenc.block_size
- binaryKey = objenc.encrypt(binaryKey+bchr(padding)*padding)
-
- # Each BASE64 line can take up to 64 characters (=48 bytes of data)
- chunks = [ binascii.b2a_base64(binaryKey[i:i+48]) for i in range(0, len(binaryKey), 48) ]
- pem += b('').join(chunks)
- pem += b("-----END " + keyType + " KEY-----")
- return pem
- return ValueError("Unknown key format '%s'. Cannot export the RSA key." % format)
-
-class RSAImplementation(object):
- """
- An RSA key factory.
-
- This class is only internally used to implement the methods of the `Crypto.PublicKey.RSA` module.
-
- :sort: __init__,generate,construct,importKey
- :undocumented: _g*, _i*
- """
-
- def __init__(self, **kwargs):
- """Create a new RSA key factory.
-
- :Keywords:
- use_fast_math : bool
- Specify which mathematic library to use:
-
- - *None* (default). Use fastest math available.
- - *True* . Use fast math.
- - *False* . Use slow math.
- default_randfunc : callable
- Specify how to collect random data:
-
- - *None* (default). Use Random.new().read().
- - not *None* . Use the specified function directly.
- :Raise RuntimeError:
- When **use_fast_math** =True but fast math is not available.
- """
- use_fast_math = kwargs.get('use_fast_math', None)
- if use_fast_math is None: # Automatic
- if _fastmath is not None:
- self._math = _fastmath
- else:
- self._math = _slowmath
-
- elif use_fast_math: # Explicitly select fast math
- if _fastmath is not None:
- self._math = _fastmath
- else:
- raise RuntimeError("fast math module not available")
-
- else: # Explicitly select slow math
- self._math = _slowmath
-
- self.error = self._math.error
-
- self._default_randfunc = kwargs.get('default_randfunc', None)
- self._current_randfunc = None
-
- def _get_randfunc(self, randfunc):
- if randfunc is not None:
- return randfunc
- elif self._current_randfunc is None:
- self._current_randfunc = Random.new().read
- return self._current_randfunc
-
- def generate(self, bits, randfunc=None, progress_func=None, e=65537):
- """Randomly generate a fresh, new RSA key.
-
- :Parameters:
- bits : int
- Key length, or size (in bits) of the RSA modulus.
- It must be a multiple of 256, and no smaller than 1024.
-
- randfunc : callable
- Random number generation function; it should accept
- a single integer N and return a string of random data
- N bytes long.
- If not specified, a new one will be instantiated
- from ``Crypto.Random``.
-
- progress_func : callable
- Optional function that will be called with a short string
- containing the key parameter currently being generated;
- it's useful for interactive applications where a user is
- waiting for a key to be generated.
-
- e : int
- Public RSA exponent. It must be an odd positive integer.
- It is typically a small number with very few ones in its
- binary representation.
- The default value 65537 (= ``0b10000000000000001`` ) is a safe
- choice: other common values are 5, 7, 17, and 257.
-
- :attention: You should always use a cryptographically secure random number generator,
- such as the one defined in the ``Crypto.Random`` module; **don't** just use the
- current time and the ``random`` module.
-
- :attention: Exponent 3 is also widely used, but it requires very special care when padding
- the message.
-
- :Return: An RSA key object (`_RSAobj`).
-
- :Raise ValueError:
- When **bits** is too little or not a multiple of 256, or when
- **e** is not odd or smaller than 2.
- """
- if bits < 1024 or (bits & 0xff) != 0:
- # pubkey.getStrongPrime doesn't like anything that's not a multiple of 256 and >= 1024
- raise ValueError("RSA modulus length must be a multiple of 256 and >= 1024")
- if e%2==0 or e<3:
- raise ValueError("RSA public exponent must be a positive, odd integer larger than 2.")
- rf = self._get_randfunc(randfunc)
- obj = _RSA.generate_py(bits, rf, progress_func, e) # TODO: Don't use legacy _RSA module
- key = self._math.rsa_construct(obj.n, obj.e, obj.d, obj.p, obj.q, obj.u)
- return _RSAobj(self, key)
-
- def construct(self, tup):
- """Construct an RSA key from a tuple of valid RSA components.
-
- The modulus **n** must be the product of two primes.
- The public exponent **e** must be odd and larger than 1.
-
- In case of a private key, the following equations must apply:
-
- - e != 1
- - p*q = n
- - e*d = 1 mod (p-1)(q-1)
- - p*u = 1 mod q
-
- :Parameters:
- tup : tuple
- A tuple of long integers, with at least 2 and no
- more than 6 items. The items come in the following order:
-
- 1. RSA modulus (n).
- 2. Public exponent (e).
- 3. Private exponent (d). Only required if the key is private.
- 4. First factor of n (p). Optional.
- 5. Second factor of n (q). Optional.
- 6. CRT coefficient, (1/p) mod q (u). Optional.
-
- :Return: An RSA key object (`_RSAobj`).
- """
- key = self._math.rsa_construct(*tup)
- return _RSAobj(self, key)
-
- def _importKeyDER(self, externKey):
- """Import an RSA key (public or private half), encoded in DER form."""
-
- try:
-
- der = DerSequence()
- der.decode(externKey, True)
-
- # Try PKCS#1 first, for a private key
- if len(der)==9 and der.hasOnlyInts() and der[0]==0:
- # ASN.1 RSAPrivateKey element
- del der[6:] # Remove d mod (p-1), d mod (q-1), and q^{-1} mod p
- der.append(inverse(der[4],der[5])) # Add p^{-1} mod q
- del der[0] # Remove version
- return self.construct(der[:])
-
- # Keep on trying PKCS#1, but now for a public key
- if len(der)==2:
- # The DER object is an RSAPublicKey SEQUENCE with two elements
- if der.hasOnlyInts():
- return self.construct(der[:])
- # The DER object is a SubjectPublicKeyInfo SEQUENCE with two elements:
- # an 'algorithm' (or 'algorithmIdentifier') SEQUENCE and a 'subjectPublicKey' BIT STRING.
- # 'algorithm' takes the value given a few lines above.
- # 'subjectPublicKey' encapsulates the actual ASN.1 RSAPublicKey element.
- if der[0]==algorithmIdentifier:
- bitmap = DerObject()
- bitmap.decode(der[1], True)
- if bitmap.isType('BIT STRING') and bord(bitmap.payload[0])==0x00:
- der.decode(bitmap.payload[1:], True)
- if len(der)==2 and der.hasOnlyInts():
- return self.construct(der[:])
-
- # Try unencrypted PKCS#8
- if der[0]==0:
- # The second element in the SEQUENCE is algorithmIdentifier.
- # It must say RSA (see above for description).
- if der[1]==algorithmIdentifier:
- privateKey = DerObject()
- privateKey.decode(der[2], True)
- if privateKey.isType('OCTET STRING'):
- return self._importKeyDER(privateKey.payload)
-
- except ValueError as IndexError:
- pass
-
- raise ValueError("RSA key format is not supported")
-
- def importKey(self, externKey, passphrase=None):
- """Import an RSA key (public or private half), encoded in standard form.
-
- :Parameter externKey:
- The RSA key to import, encoded as a string.
-
- An RSA public key can be in any of the following formats:
-
- - X.509 `subjectPublicKeyInfo` DER SEQUENCE (binary or PEM encoding)
- - `PKCS#1`_ `RSAPublicKey` DER SEQUENCE (binary or PEM encoding)
- - OpenSSH (textual public key only)
-
- An RSA private key can be in any of the following formats:
-
- - PKCS#1 `RSAPrivateKey` DER SEQUENCE (binary or PEM encoding)
- - `PKCS#8`_ `PrivateKeyInfo` DER SEQUENCE (binary or PEM encoding)
- - OpenSSH (textual public key only)
-
- For details about the PEM encoding, see `RFC1421`_/`RFC1423`_.
-
- In case of PEM encoding, the private key can be encrypted with DES or 3TDES according to a certain ``pass phrase``.
- Only OpenSSL-compatible pass phrases are supported.
- :Type externKey: string
-
- :Parameter passphrase:
- In case of an encrypted PEM key, this is the pass phrase from which the encryption key is derived.
- :Type passphrase: string
-
- :Return: An RSA key object (`_RSAobj`).
-
- :Raise ValueError/IndexError/TypeError:
- When the given key cannot be parsed (possibly because the pass phrase is wrong).
-
- .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt
- .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt
- .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt
- .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt
- """
- externKey = tobytes(externKey)
- if passphrase is not None:
- passphrase = tobytes(passphrase)
-
- if externKey.startswith(b('-----')):
- # This is probably a PEM encoded key
- lines = externKey.replace(b(" "),b('')).split()
- keyobj = None
-
- # The encrypted PEM format
- if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')):
- DEK = lines[2].split(b(':'))
- if len(DEK)!=2 or DEK[0]!=b('DEK-Info') or not passphrase:
- raise ValueError("PEM encryption format not supported.")
- algo, salt = DEK[1].split(b(','))
- salt = binascii.a2b_hex(salt)
- import Crypto.Hash.MD5
- from Crypto.Cipher import DES, DES3
- from Crypto.Protocol.KDF import PBKDF1
- if algo==b("DES-CBC"):
- # This is EVP_BytesToKey in OpenSSL
- key = PBKDF1(passphrase, salt, 8, 1, Crypto.Hash.MD5)
- keyobj = DES.new(key, Crypto.Cipher.DES.MODE_CBC, salt)
- elif algo==b("DES-EDE3-CBC"):
- # Note that EVP_BytesToKey is note exactly the same as PBKDF1
- key = PBKDF1(passphrase, salt, 16, 1, Crypto.Hash.MD5)
- key += PBKDF1(key+passphrase, salt, 8, 1, Crypto.Hash.MD5)
- keyobj = DES3.new(key, Crypto.Cipher.DES3.MODE_CBC, salt)
- else:
- raise ValueError("Unsupport PEM encryption algorithm.")
- lines = lines[2:]
-
- der = binascii.a2b_base64(b('').join(lines[1:-1]))
- if keyobj:
- der = keyobj.decrypt(der)
- padding = bord(der[-1])
- der = der[:-padding]
- return self._importKeyDER(der)
-
- if externKey.startswith(b('ssh-rsa ')):
- # This is probably an OpenSSH key
- keystring = binascii.a2b_base64(externKey.split(b(' '))[1])
- keyparts = []
- while len(keystring)>4:
- l = struct.unpack(">I",keystring[:4])[0]
- keyparts.append(keystring[4:4+l])
- keystring = keystring[4+l:]
- e = bytes_to_long(keyparts[1])
- n = bytes_to_long(keyparts[2])
- return self.construct([n, e])
- if bord(externKey[0])==0x30:
- # This is probably a DER encoded key
- return self._importKeyDER(externKey)
-
- raise ValueError("RSA key format is not supported")
-
-#: This is the ASN.1 DER object that qualifies an algorithm as
-#: compliant to PKCS#1 (that is, the standard RSA).
-# It is found in all 'algorithm' fields (also called 'algorithmIdentifier').
-# It is a SEQUENCE with the oid assigned to RSA and with its parameters (none).
-# 0x06 0x09 OBJECT IDENTIFIER, 9 bytes of payload
-# 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x01
-# rsaEncryption (1 2 840 113549 1 1 1) (PKCS #1)
-# 0x05 0x00 NULL
-algorithmIdentifier = DerSequence(
- [ b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01'),
- DerNull().encode() ]
- ).encode()
-
-_impl = RSAImplementation()
-#:
-#: Randomly generate a fresh, new RSA key object.
-#:
-#: See `RSAImplementation.generate`.
-#:
-generate = _impl.generate
-#:
-#: Construct an RSA key object from a tuple of valid RSA components.
-#:
-#: See `RSAImplementation.construct`.
-#:
-construct = _impl.construct
-#:
-#: Import an RSA key (public or private half), encoded in standard form.
-#:
-#: See `RSAImplementation.importKey`.
-#:
-importKey = _impl.importKey
-error = _impl.error
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
-
diff --git a/frozen_deps/Crypto/PublicKey/_DSA.py b/frozen_deps/Crypto/PublicKey/_DSA.py
deleted file mode 100644
index 1787ced..0000000
--- a/frozen_deps/Crypto/PublicKey/_DSA.py
+++ /dev/null
@@ -1,115 +0,0 @@
-
-#
-# DSA.py : Digital Signature Algorithm
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew Kuchling, Paul Swartz, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-
-__revision__ = "$Id$"
-
-from Crypto.PublicKey.pubkey import *
-from Crypto.Util import number
-from Crypto.Util.number import bytes_to_long, long_to_bytes
-from Crypto.Hash import SHA
-from Crypto.Util.py3compat import *
-
-class error (Exception):
- pass
-
-def generateQ(randfunc):
- S=randfunc(20)
- hash1=SHA.new(S).digest()
- hash2=SHA.new(long_to_bytes(bytes_to_long(S)+1)).digest()
- q = bignum(0)
- for i in range(0,20):
- c=bord(hash1[i])^bord(hash2[i])
- if i==0:
- c=c | 128
- if i==19:
- c= c | 1
- q=q*256+c
- while (not isPrime(q)):
- q=q+2
- if pow(2,159) < q < pow(2,160):
- return S, q
- raise RuntimeError('Bad q value generated')
-
-def generate_py(bits, randfunc, progress_func=None):
- """generate(bits:int, randfunc:callable, progress_func:callable)
-
- Generate a DSA key of length 'bits', using 'randfunc' to get
- random data and 'progress_func', if present, to display
- the progress of the key generation.
- """
-
- if bits<160:
- raise ValueError('Key length < 160 bits')
- obj=DSAobj()
- # Generate string S and prime q
- if progress_func:
- progress_func('p,q\n')
- while (1):
- S, obj.q = generateQ(randfunc)
- n=divmod(bits-1, 160)[0]
- C, N, V = 0, 2, {}
- b=(obj.q >> 5) & 15
- powb=pow(bignum(2), b)
- powL1=pow(bignum(2), bits-1)
- while C<4096:
- for k in range(0, n+1):
- V[k]=bytes_to_long(SHA.new(S+bstr(N)+bstr(k)).digest())
- W=V[n] % powb
- for k in range(n-1, -1, -1):
- W=(W<<160)+V[k]
- X=W+powL1
- p=X-(X%(2*obj.q)-1)
- if powL1<=p and isPrime(p):
- break
- C, N = C+1, N+n+1
- if C<4096:
- break
- if progress_func:
- progress_func('4096 multiples failed\n')
-
- obj.p = p
- power=divmod(p-1, obj.q)[0]
- if progress_func:
- progress_func('h,g\n')
- while (1):
- h=bytes_to_long(randfunc(bits)) % (p-1)
- g=pow(h, power, p)
- if 1<h<p-1 and g>1:
- break
- obj.g=g
- if progress_func:
- progress_func('x,y\n')
- while (1):
- x=bytes_to_long(randfunc(20))
- if 0 < x < obj.q:
- break
- obj.x, obj.y = x, pow(g, x, p)
- return obj
-
-class DSAobj:
- pass
-
diff --git a/frozen_deps/Crypto/PublicKey/_RSA.py b/frozen_deps/Crypto/PublicKey/_RSA.py
deleted file mode 100644
index 601ab7c..0000000
--- a/frozen_deps/Crypto/PublicKey/_RSA.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#
-# RSA.py : RSA encryption/decryption
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew Kuchling, Paul Swartz, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-
-__revision__ = "$Id$"
-
-from Crypto.PublicKey import pubkey
-from Crypto.Util import number
-
-def generate_py(bits, randfunc, progress_func=None, e=65537):
- """generate(bits:int, randfunc:callable, progress_func:callable, e:int)
-
- Generate an RSA key of length 'bits', public exponent 'e'(which must be
- odd), using 'randfunc' to get random data and 'progress_func',
- if present, to display the progress of the key generation.
- """
- obj=RSAobj()
- obj.e = int(e)
-
- # Generate the prime factors of n
- if progress_func:
- progress_func('p,q\n')
- p = q = 1
- while number.size(p*q) < bits:
- # Note that q might be one bit longer than p if somebody specifies an odd
- # number of bits for the key. (Why would anyone do that? You don't get
- # more security.)
- p = pubkey.getStrongPrime(bits>>1, obj.e, 1e-12, randfunc)
- q = pubkey.getStrongPrime(bits - (bits>>1), obj.e, 1e-12, randfunc)
-
- # It's OK for p to be larger than q, but let's be
- # kind to the function that will invert it for
- # th calculation of u.
- if p > q:
- (p, q)=(q, p)
- obj.p = p
- obj.q = q
-
- if progress_func:
- progress_func('u\n')
- obj.u = pubkey.inverse(obj.p, obj.q)
- obj.n = obj.p*obj.q
-
- if progress_func:
- progress_func('d\n')
- obj.d=pubkey.inverse(obj.e, (obj.p-1)*(obj.q-1))
-
- assert bits <= 1+obj.size(), "Generated key is too small"
-
- return obj
-
-class RSAobj(pubkey.pubkey):
-
- def size(self):
- """size() : int
- Return the maximum number of bits that can be handled by this key.
- """
- return number.size(self.n) - 1
-
diff --git a/frozen_deps/Crypto/PublicKey/__init__.py b/frozen_deps/Crypto/PublicKey/__init__.py
deleted file mode 100644
index 503809f..0000000
--- a/frozen_deps/Crypto/PublicKey/__init__.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Public-key encryption and signature algorithms.
-
-Public-key encryption uses two different keys, one for encryption and
-one for decryption. The encryption key can be made public, and the
-decryption key is kept private. Many public-key algorithms can also
-be used to sign messages, and some can *only* be used for signatures.
-
-======================== =============================================
-Module Description
-======================== =============================================
-Crypto.PublicKey.DSA Digital Signature Algorithm (Signature only)
-Crypto.PublicKey.ElGamal (Signing and encryption)
-Crypto.PublicKey.RSA (Signing, encryption, and blinding)
-======================== =============================================
-
-:undocumented: _DSA, _RSA, _fastmath, _slowmath, pubkey
-"""
-
-__all__ = ['RSA', 'DSA', 'ElGamal']
-__revision__ = "$Id$"
-
diff --git a/frozen_deps/Crypto/PublicKey/_fastmath.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/PublicKey/_fastmath.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index f0fe708..0000000
--- a/frozen_deps/Crypto/PublicKey/_fastmath.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/PublicKey/_slowmath.py b/frozen_deps/Crypto/PublicKey/_slowmath.py
deleted file mode 100644
index c87bdd2..0000000
--- a/frozen_deps/Crypto/PublicKey/_slowmath.py
+++ /dev/null
@@ -1,187 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# PubKey/RSA/_slowmath.py : Pure Python implementation of the RSA portions of _fastmath
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Pure Python implementation of the RSA-related portions of Crypto.PublicKey._fastmath."""
-
-__revision__ = "$Id$"
-
-__all__ = ['rsa_construct']
-
-import sys
-
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.number import size, inverse, GCD
-
-class error(Exception):
- pass
-
-class _RSAKey(object):
- def _blind(self, m, r):
- # compute r**e * m (mod n)
- return m * pow(r, self.e, self.n)
-
- def _unblind(self, m, r):
- # compute m / r (mod n)
- return inverse(r, self.n) * m % self.n
-
- def _decrypt(self, c):
- # compute c**d (mod n)
- if not self.has_private():
- raise TypeError("No private key")
- if (hasattr(self,'p') and hasattr(self,'q') and hasattr(self,'u')):
- m1 = pow(c, self.d % (self.p-1), self.p)
- m2 = pow(c, self.d % (self.q-1), self.q)
- h = m2 - m1
- if (h<0):
- h = h + self.q
- h = h*self.u % self.q
- return h*self.p+m1
- return pow(c, self.d, self.n)
-
- def _encrypt(self, m):
- # compute m**d (mod n)
- return pow(m, self.e, self.n)
-
- def _sign(self, m): # alias for _decrypt
- if not self.has_private():
- raise TypeError("No private key")
- return self._decrypt(m)
-
- def _verify(self, m, sig):
- return self._encrypt(sig) == m
-
- def has_private(self):
- return hasattr(self, 'd')
-
- def size(self):
- """Return the maximum number of bits that can be encrypted"""
- return size(self.n) - 1
-
-def rsa_construct(n, e, d=None, p=None, q=None, u=None):
- """Construct an RSAKey object"""
- assert isinstance(n, int)
- assert isinstance(e, int)
- assert isinstance(d, (int, type(None)))
- assert isinstance(p, (int, type(None)))
- assert isinstance(q, (int, type(None)))
- assert isinstance(u, (int, type(None)))
- obj = _RSAKey()
- obj.n = n
- obj.e = e
- if d is None:
- return obj
- obj.d = d
- if p is not None and q is not None:
- obj.p = p
- obj.q = q
- else:
- # Compute factors p and q from the private exponent d.
- # We assume that n has no more than two factors.
- # 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=divmod(t,2)[0]
- # 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 = 0
- a = 2
- while not spotted and a<100:
- 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.
- obj.p = GCD(cand+1,n)
- spotted = 1
- break
- k = k*2
- # This value was not any good... let's try another!
- a = a+2
- if not spotted:
- raise ValueError("Unable to compute factors p and q from exponent d.")
- # Found !
- assert ((n % obj.p)==0)
- obj.q = divmod(n,obj.p)[0]
- if u is not None:
- obj.u = u
- else:
- obj.u = inverse(obj.p, obj.q)
- return obj
-
-class _DSAKey(object):
- def size(self):
- """Return the maximum number of bits that can be encrypted"""
- return size(self.p) - 1
-
- def has_private(self):
- return hasattr(self, 'x')
-
- def _sign(self, m, k): # alias for _decrypt
- # SECURITY TODO - We _should_ be computing SHA1(m), but we don't because that's the API.
- if not self.has_private():
- raise TypeError("No private key")
- if not (1 < k < self.q):
- raise ValueError("k is not between 2 and q-1")
- inv_k = inverse(k, self.q) # Compute k**-1 mod q
- r = pow(self.g, k, self.p) % self.q # r = (g**k mod p) mod q
- s = (inv_k * (m + self.x * r)) % self.q
- return (r, s)
-
- def _verify(self, m, r, s):
- # SECURITY TODO - We _should_ be computing SHA1(m), but we don't because that's the API.
- if not (0 < r < self.q) or not (0 < s < self.q):
- return False
- w = inverse(s, self.q)
- u1 = (m*w) % self.q
- u2 = (r*w) % self.q
- v = (pow(self.g, u1, self.p) * pow(self.y, u2, self.p) % self.p) % self.q
- return v == r
-
-def dsa_construct(y, g, p, q, x=None):
- assert isinstance(y, int)
- assert isinstance(g, int)
- assert isinstance(p, int)
- assert isinstance(q, int)
- assert isinstance(x, (int, type(None)))
- obj = _DSAKey()
- obj.y = y
- obj.g = g
- obj.p = p
- obj.q = q
- if x is not None: obj.x = x
- return obj
-
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
-
diff --git a/frozen_deps/Crypto/PublicKey/pubkey.py b/frozen_deps/Crypto/PublicKey/pubkey.py
deleted file mode 100644
index e46b076..0000000
--- a/frozen_deps/Crypto/PublicKey/pubkey.py
+++ /dev/null
@@ -1,240 +0,0 @@
-#
-# pubkey.py : Internal functions for public key operations
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew Kuchling, Paul Swartz, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-
-__revision__ = "$Id$"
-
-import types, warnings
-from Crypto.Util.number import *
-
-# Basic public key class
-class pubkey:
- """An abstract class for a public key object.
-
- :undocumented: __getstate__, __setstate__, __eq__, __ne__, validate
- """
- def __init__(self):
- pass
-
- def __getstate__(self):
- """To keep key objects platform-independent, the key data is
- converted to standard Python long integers before being
- written out. It will then be reconverted as necessary on
- restoration."""
- d=self.__dict__
- for key in self.keydata:
- if key in d: d[key]=int(d[key])
- return d
-
- def __setstate__(self, d):
- """On unpickling a key object, the key data is converted to the big
-number representation being used, whether that is Python long
-integers, MPZ objects, or whatever."""
- for key in self.keydata:
- if key in d: self.__dict__[key]=bignum(d[key])
-
- def encrypt(self, plaintext, K):
- """Encrypt a piece of data.
-
- :Parameter plaintext: The piece of data to encrypt.
- :Type plaintext: byte string or long
-
- :Parameter K: A random parameter required by some algorithms
- :Type K: byte string or long
-
- :Return: A tuple with two items. Each item is of the same type as the
- plaintext (string or long).
- """
- wasString=0
- if isinstance(plaintext, bytes):
- plaintext=bytes_to_long(plaintext) ; wasString=1
- if isinstance(K, bytes):
- K=bytes_to_long(K)
- ciphertext=self._encrypt(plaintext, K)
- if wasString: return tuple(map(long_to_bytes, ciphertext))
- else: return ciphertext
-
- def decrypt(self, ciphertext):
- """Decrypt a piece of data.
-
- :Parameter ciphertext: The piece of data to decrypt.
- :Type ciphertext: byte string, long or a 2-item tuple as returned by `encrypt`
-
- :Return: A byte string if ciphertext was a byte string or a tuple
- of byte strings. A long otherwise.
- """
- wasString=0
- if not isinstance(ciphertext, tuple):
- ciphertext=(ciphertext,)
- if isinstance(ciphertext[0], bytes):
- ciphertext=tuple(map(bytes_to_long, ciphertext)) ; wasString=1
- plaintext=self._decrypt(ciphertext)
- if wasString: return long_to_bytes(plaintext)
- else: return plaintext
-
- def sign(self, M, K):
- """Sign a piece of data.
-
- :Parameter M: The piece of data to encrypt.
- :Type M: byte string or long
-
- :Parameter K: A random parameter required by some algorithms
- :Type K: byte string or long
-
- :Return: A tuple with two items.
- """
- if (not self.has_private()):
- raise TypeError('Private key not available in this object')
- if isinstance(M, bytes): M=bytes_to_long(M)
- if isinstance(K, bytes): K=bytes_to_long(K)
- return self._sign(M, K)
-
- def verify (self, M, signature):
- """Verify the validity of a signature.
-
- :Parameter M: The expected message.
- :Type M: byte string or long
-
- :Parameter signature: The signature to verify.
- :Type signature: tuple with two items, as return by `sign`
-
- :Return: True if the signature is correct, False otherwise.
- """
- if isinstance(M, bytes): M=bytes_to_long(M)
- return self._verify(M, signature)
-
- # alias to compensate for the old validate() name
- def validate (self, M, signature):
- warnings.warn("validate() method name is obsolete; use verify()",
- DeprecationWarning)
-
- def blind(self, M, B):
- """Blind a message to prevent certain side-channel attacks.
-
- :Parameter M: The message to blind.
- :Type M: byte string or long
-
- :Parameter B: Blinding factor.
- :Type B: byte string or long
-
- :Return: A byte string if M was so. A long otherwise.
- """
- wasString=0
- if isinstance(M, bytes):
- M=bytes_to_long(M) ; wasString=1
- if isinstance(B, bytes): B=bytes_to_long(B)
- blindedmessage=self._blind(M, B)
- if wasString: return long_to_bytes(blindedmessage)
- else: return blindedmessage
-
- def unblind(self, M, B):
- """Unblind a message after cryptographic processing.
-
- :Parameter M: The encoded message to unblind.
- :Type M: byte string or long
-
- :Parameter B: Blinding factor.
- :Type B: byte string or long
- """
- wasString=0
- if isinstance(M, bytes):
- M=bytes_to_long(M) ; wasString=1
- if isinstance(B, bytes): B=bytes_to_long(B)
- unblindedmessage=self._unblind(M, B)
- if wasString: return long_to_bytes(unblindedmessage)
- else: return unblindedmessage
-
-
- # The following methods will usually be left alone, except for
- # signature-only algorithms. They both return Boolean values
- # recording whether this key's algorithm can sign and encrypt.
- def can_sign (self):
- """Tell if the algorithm can deal with cryptographic signatures.
-
- This property concerns the *algorithm*, not the key itself.
- It may happen that this particular key object hasn't got
- the private information required to generate a signature.
-
- :Return: boolean
- """
- return 1
-
- def can_encrypt (self):
- """Tell if the algorithm can deal with data encryption.
-
- This property concerns the *algorithm*, not the key itself.
- It may happen that this particular key object hasn't got
- the private information required to decrypt data.
-
- :Return: boolean
- """
- return 1
-
- def can_blind (self):
- """Tell if the algorithm can deal with data blinding.
-
- This property concerns the *algorithm*, not the key itself.
- It may happen that this particular key object hasn't got
- the private information required carry out blinding.
-
- :Return: boolean
- """
- return 0
-
- # The following methods will certainly be overridden by
- # subclasses.
-
- def size (self):
- """Tell the maximum number of bits that can be handled by this key.
-
- :Return: int
- """
- return 0
-
- def has_private (self):
- """Tell if the key object contains private components.
-
- :Return: bool
- """
- return 0
-
- def publickey (self):
- """Construct a new key carrying only the public information.
-
- :Return: A new `pubkey` object.
- """
- return self
-
- def __eq__ (self, other):
- """__eq__(other): 0, 1
- Compare us to other for equality.
- """
- return self.__getstate__() == other.__getstate__()
-
- def __ne__ (self, other):
- """__ne__(other): 0, 1
- Compare us to other for inequality.
- """
- return not self.__eq__(other)
diff --git a/frozen_deps/Crypto/Random/Fortuna/FortunaAccumulator.py b/frozen_deps/Crypto/Random/Fortuna/FortunaAccumulator.py
deleted file mode 100644
index 5c6beb0..0000000
--- a/frozen_deps/Crypto/Random/Fortuna/FortunaAccumulator.py
+++ /dev/null
@@ -1,171 +0,0 @@
-# -*- coding: ascii -*-
-#
-# FortunaAccumulator.py : Fortuna's internal accumulator
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-
-from binascii import b2a_hex
-import time
-import warnings
-
-from Crypto.pct_warnings import ClockRewindWarning
-from . import SHAd256
-
-from . import FortunaGenerator
-
-class FortunaPool(object):
- """Fortuna pool type
-
- This object acts like a hash object, with the following differences:
-
- - It keeps a count (the .length attribute) of the number of bytes that
- have been added to the pool
- - It supports a .reset() method for in-place reinitialization
- - The method to add bytes to the pool is .append(), not .update().
- """
-
- digest_size = SHAd256.digest_size
-
- def __init__(self):
- self.reset()
-
- def append(self, data):
- self._h.update(data)
- self.length += len(data)
-
- def digest(self):
- return self._h.digest()
-
- def hexdigest(self):
- if sys.version_info[0] == 2:
- return b2a_hex(self.digest())
- else:
- return b2a_hex(self.digest()).decode()
-
- def reset(self):
- self._h = SHAd256.new()
- self.length = 0
-
-def which_pools(r):
- """Return a list of pools indexes (in range(32)) that are to be included during reseed number r.
-
- According to _Practical Cryptography_, chapter 10.5.2 "Pools":
-
- "Pool P_i is included if 2**i is a divisor of r. Thus P_0 is used
- every reseed, P_1 every other reseed, P_2 every fourth reseed, etc."
- """
- # This is a separate function so that it can be unit-tested.
- assert r >= 1
- retval = []
- mask = 0
- for i in range(32):
- # "Pool P_i is included if 2**i is a divisor of [reseed_count]"
- if (r & mask) == 0:
- retval.append(i)
- else:
- break # optimization. once this fails, it always fails
- mask = (mask << 1) | 1
- return retval
-
-class FortunaAccumulator(object):
-
- # An estimate of how many bytes we must append to pool 0 before it will
- # contain 128 bits of entropy (with respect to an attack). We reseed the
- # generator only after pool 0 contains `min_pool_size` bytes. Note that
- # unlike with some other PRNGs, Fortuna's security does not rely on the
- # accuracy of this estimate---we can accord to be optimistic here.
- min_pool_size = 64 # size in bytes
-
- # If an attacker can predict some (but not all) of our entropy sources, the
- # `min_pool_size` check may not be sufficient to prevent a successful state
- # compromise extension attack. To resist this attack, Fortuna spreads the
- # input across 32 pools, which are then consumed (to reseed the output
- # generator) with exponentially decreasing frequency.
- #
- # In order to prevent an attacker from gaining knowledge of all 32 pools
- # before we have a chance to fill them with enough information that the
- # attacker cannot predict, we impose a rate limit of 10 reseeds/second (one
- # per 100 ms). This ensures that a hypothetical 33rd pool would only be
- # needed after a minimum of 13 years of sustained attack.
- reseed_interval = 0.100 # time in seconds
-
- def __init__(self):
- self.reseed_count = 0
- self.generator = FortunaGenerator.AESGenerator()
- self.last_reseed = None
-
- # Initialize 32 FortunaPool instances.
- # NB: This is _not_ equivalent to [FortunaPool()]*32, which would give
- # us 32 references to the _same_ FortunaPool instance (and cause the
- # assertion below to fail).
- self.pools = [FortunaPool() for i in range(32)] # 32 pools
- assert(self.pools[0] is not self.pools[1])
-
- def _forget_last_reseed(self):
- # This is not part of the standard Fortuna definition, and using this
- # function frequently can weaken Fortuna's ability to resist a state
- # compromise extension attack, but we need this in order to properly
- # implement Crypto.Random.atfork(). Otherwise, forked child processes
- # might continue to use their parent's PRNG state for up to 100ms in
- # some cases. (e.g. CVE-2013-1445)
- self.last_reseed = None
-
- def random_data(self, bytes):
- current_time = time.time()
- if (self.last_reseed is not None and self.last_reseed > current_time): # Avoid float comparison to None to make Py3k happy
- warnings.warn("Clock rewind detected. Resetting last_reseed.", ClockRewindWarning)
- self.last_reseed = None
- if (self.pools[0].length >= self.min_pool_size and
- (self.last_reseed is None or
- current_time > self.last_reseed + self.reseed_interval)):
- self._reseed(current_time)
- # The following should fail if we haven't seeded the pool yet.
- return self.generator.pseudo_random_data(bytes)
-
- def _reseed(self, current_time=None):
- if current_time is None:
- current_time = time.time()
- seed = []
- self.reseed_count += 1
- self.last_reseed = current_time
- for i in which_pools(self.reseed_count):
- seed.append(self.pools[i].digest())
- self.pools[i].reset()
-
- seed = b("").join(seed)
- self.generator.reseed(seed)
-
- def add_random_event(self, source_number, pool_number, data):
- assert 1 <= len(data) <= 32
- assert 0 <= source_number <= 255
- assert 0 <= pool_number <= 31
- self.pools[pool_number].append(bchr(source_number))
- self.pools[pool_number].append(bchr(len(data)))
- self.pools[pool_number].append(data)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/Fortuna/FortunaGenerator.py b/frozen_deps/Crypto/Random/Fortuna/FortunaGenerator.py
deleted file mode 100644
index 489c81e..0000000
--- a/frozen_deps/Crypto/Random/Fortuna/FortunaGenerator.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: ascii -*-
-#
-# FortunaGenerator.py : Fortuna's internal PRNG
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-import sys
-if sys.version_info[0] is 2 and sys.version_info[1] is 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-
-import struct
-
-from Crypto.Util.number import ceil_shift, exact_log2, exact_div
-from Crypto.Util import Counter
-from Crypto.Cipher import AES
-
-from . import SHAd256
-
-class AESGenerator(object):
- """The Fortuna "generator"
-
- This is used internally by the Fortuna PRNG to generate arbitrary amounts
- of pseudorandom data from a smaller amount of seed data.
-
- The output is generated by running AES-256 in counter mode and re-keying
- after every mebibyte (2**16 blocks) of output.
- """
-
- block_size = AES.block_size # output block size in octets (128 bits)
- key_size = 32 # key size in octets (256 bits)
-
- # Because of the birthday paradox, we expect to find approximately one
- # collision for every 2**64 blocks of output from a real random source.
- # However, this code generates pseudorandom data by running AES in
- # counter mode, so there will be no collisions until the counter
- # (theoretically) wraps around at 2**128 blocks. Thus, in order to prevent
- # Fortuna's pseudorandom output from deviating perceptibly from a true
- # random source, Ferguson and Schneier specify a limit of 2**16 blocks
- # without rekeying.
- max_blocks_per_request = 2**16 # Allow no more than this number of blocks per _pseudo_random_data request
-
- _four_kiblocks_of_zeros = b("\0") * block_size * 4096
-
- def __init__(self):
- self.counter = Counter.new(nbits=self.block_size*8, initial_value=0, little_endian=True)
- self.key = None
-
- # Set some helper constants
- self.block_size_shift = exact_log2(self.block_size)
- assert (1 << self.block_size_shift) == self.block_size
-
- self.blocks_per_key = exact_div(self.key_size, self.block_size)
- assert self.key_size == self.blocks_per_key * self.block_size
-
- self.max_bytes_per_request = self.max_blocks_per_request * self.block_size
-
- def reseed(self, seed):
- if self.key is None:
- self.key = b("\0") * self.key_size
-
- self._set_key(SHAd256.new(self.key + seed).digest())
- self.counter() # increment counter
- assert len(self.key) == self.key_size
-
- def pseudo_random_data(self, bytes):
- assert bytes >= 0
-
- num_full_blocks = bytes >> 20
- remainder = bytes & ((1<<20)-1)
-
- retval = []
- for i in range(num_full_blocks):
- retval.append(self._pseudo_random_data(1<<20))
- retval.append(self._pseudo_random_data(remainder))
-
- return b("").join(retval)
-
- def _set_key(self, key):
- self.key = key
- self._cipher = AES.new(key, AES.MODE_CTR, counter=self.counter)
-
- def _pseudo_random_data(self, bytes):
- if not (0 <= bytes <= self.max_bytes_per_request):
- raise AssertionError("You cannot ask for more than 1 MiB of data per request")
-
- num_blocks = ceil_shift(bytes, self.block_size_shift) # num_blocks = ceil(bytes / self.block_size)
-
- # Compute the output
- retval = self._generate_blocks(num_blocks)[:bytes]
-
- # Switch to a new key to avoid later compromises of this output (i.e.
- # state compromise extension attacks)
- self._set_key(self._generate_blocks(self.blocks_per_key))
-
- assert len(retval) == bytes
- assert len(self.key) == self.key_size
-
- return retval
-
- def _generate_blocks(self, num_blocks):
- if self.key is None:
- raise AssertionError("generator must be seeded before use")
- assert 0 <= num_blocks <= self.max_blocks_per_request
- retval = []
- for i in range(num_blocks >> 12): # xrange(num_blocks / 4096)
- retval.append(self._cipher.encrypt(self._four_kiblocks_of_zeros))
- remaining_bytes = (num_blocks & 4095) << self.block_size_shift # (num_blocks % 4095) * self.block_size
- retval.append(self._cipher.encrypt(self._four_kiblocks_of_zeros[:remaining_bytes]))
- return b("").join(retval)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/Fortuna/SHAd256.py b/frozen_deps/Crypto/Random/Fortuna/SHAd256.py
deleted file mode 100644
index 2e135c9..0000000
--- a/frozen_deps/Crypto/Random/Fortuna/SHAd256.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*- coding: ascii -*-
-#
-# Random/Fortuna/SHAd256.py : SHA_d-256 hash function implementation
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""\
-SHA_d-256 hash function implementation.
-
-This module should comply with PEP 247.
-"""
-
-__revision__ = "$Id$"
-__all__ = ['new', 'digest_size']
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-
-from binascii import b2a_hex
-
-from Crypto.Hash import SHA256
-
-assert SHA256.digest_size == 32
-
-class _SHAd256(object):
- """SHA-256, doubled.
-
- Returns SHA-256(SHA-256(data)).
- """
-
- digest_size = SHA256.digest_size
-
- _internal = object()
-
- def __init__(self, internal_api_check, sha256_hash_obj):
- if internal_api_check is not self._internal:
- raise AssertionError("Do not instantiate this class directly. Use %s.new()" % (__name__,))
- self._h = sha256_hash_obj
-
- # PEP 247 "copy" method
- def copy(self):
- """Return a copy of this hashing object"""
- return _SHAd256(SHAd256._internal, self._h.copy())
-
- # PEP 247 "digest" method
- def digest(self):
- """Return the hash value of this object as a binary string"""
- retval = SHA256.new(self._h.digest()).digest()
- assert len(retval) == 32
- return retval
-
- # PEP 247 "hexdigest" method
- def hexdigest(self):
- """Return the hash value of this object as a (lowercase) hexadecimal string"""
- retval = b2a_hex(self.digest())
- assert len(retval) == 64
- if sys.version_info[0] == 2:
- return retval
- else:
- return retval.decode()
-
- # PEP 247 "update" method
- def update(self, data):
- self._h.update(data)
-
-# PEP 247 module-level "digest_size" variable
-digest_size = _SHAd256.digest_size
-
-# PEP 247 module-level "new" function
-def new(data=None):
- """Return a new SHAd256 hashing object"""
- if not data:
- data=b("")
- sha = _SHAd256(_SHAd256._internal, SHA256.new(data))
- sha.new = globals()['new']
- return sha
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/Fortuna/__init__.py b/frozen_deps/Crypto/Random/Fortuna/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/frozen_deps/Crypto/Random/Fortuna/__init__.py
+++ /dev/null
diff --git a/frozen_deps/Crypto/Random/OSRNG/__init__.py b/frozen_deps/Crypto/Random/OSRNG/__init__.py
deleted file mode 100644
index 2fbbecb..0000000
--- a/frozen_deps/Crypto/Random/OSRNG/__init__.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# Random/OSRNG/__init__.py : Platform-independent OS RNG API
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Provides a platform-independent interface to the random number generators
-supplied by various operating systems."""
-
-__revision__ = "$Id$"
-
-import os
-
-if os.name == 'posix':
- from Crypto.Random.OSRNG.posix import new
-elif os.name == 'nt':
- from Crypto.Random.OSRNG.nt import new
-elif hasattr(os, 'urandom'):
- from Crypto.Random.OSRNG.fallback import new
-else:
- raise ImportError("Not implemented")
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/OSRNG/fallback.py b/frozen_deps/Crypto/Random/OSRNG/fallback.py
deleted file mode 100644
index 6d4130d..0000000
--- a/frozen_deps/Crypto/Random/OSRNG/fallback.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Random/OSRNG/fallback.py : Fallback entropy source for systems with os.urandom
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-
-__revision__ = "$Id$"
-__all__ = ['PythonOSURandomRNG']
-
-import os
-
-from .rng_base import BaseRNG
-
-class PythonOSURandomRNG(BaseRNG):
-
- name = "<os.urandom>"
-
- def __init__(self):
- self._read = os.urandom
- BaseRNG.__init__(self)
-
- def _close(self):
- self._read = None
-
-def new(*args, **kwargs):
- return PythonOSURandomRNG(*args, **kwargs)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/OSRNG/posix.py b/frozen_deps/Crypto/Random/OSRNG/posix.py
deleted file mode 100644
index ceea7b7..0000000
--- a/frozen_deps/Crypto/Random/OSRNG/posix.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#
-# Random/OSRNG/posix.py : OS entropy source for POSIX systems
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-
-__revision__ = "$Id$"
-__all__ = ['DevURandomRNG']
-
-import errno
-import os
-import stat
-
-from .rng_base import BaseRNG
-from Crypto.Util.py3compat import b
-
-class DevURandomRNG(BaseRNG):
-
- def __init__(self, devname=None):
- if devname is None:
- self.name = "/dev/urandom"
- else:
- self.name = devname
-
- # Test that /dev/urandom is a character special device
- f = open(self.name, "rb", 0)
- fmode = os.fstat(f.fileno())[stat.ST_MODE]
- if not stat.S_ISCHR(fmode):
- f.close()
- raise TypeError("%r is not a character special device" % (self.name,))
-
- self.__file = f
-
- BaseRNG.__init__(self)
-
- def _close(self):
- self.__file.close()
-
- def _read(self, N):
- # Starting with Python 3 open with buffering=0 returns a FileIO object.
- # FileIO.read behaves like read(2) and not like fread(3) and thus we
- # have to handle the case that read returns less data as requested here
- # more carefully.
- data = b("")
- while len(data) < N:
- try:
- d = self.__file.read(N - len(data))
- except IOError as e:
- # read(2) has been interrupted by a signal; redo the read
- if e.errno == errno.EINTR:
- continue
- raise
-
- if d is None:
- # __file is in non-blocking mode and no data is available
- return data
- if len(d) == 0:
- # __file is in blocking mode and arrived at EOF
- return data
-
- data += d
- return data
-
-def new(*args, **kwargs):
- return DevURandomRNG(*args, **kwargs)
-
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/OSRNG/rng_base.py b/frozen_deps/Crypto/Random/OSRNG/rng_base.py
deleted file mode 100644
index 546f2e9..0000000
--- a/frozen_deps/Crypto/Random/OSRNG/rng_base.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#
-# Random/OSRNG/rng_base.py : Base class for OSRNG
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-
-class BaseRNG(object):
-
- def __init__(self):
- self.closed = False
- self._selftest()
-
- def __del__(self):
- self.close()
-
- def _selftest(self):
- # Test that urandom can return data
- data = self.read(16)
- if len(data) != 16:
- raise AssertionError("read truncated")
-
- # Test that we get different data every time (if we don't, the RNG is
- # probably malfunctioning)
- data2 = self.read(16)
- if data == data2:
- raise AssertionError("OS RNG returned duplicate data")
-
- # PEP 343: Support for the "with" statement
- def __enter__(self):
- pass
- def __exit__(self):
- """PEP 343 support"""
- self.close()
-
- def close(self):
- if not self.closed:
- self._close()
- self.closed = True
-
- def flush(self):
- pass
-
- def read(self, N=-1):
- """Return N bytes from the RNG."""
- if self.closed:
- raise ValueError("I/O operation on closed file")
- if not isinstance(N, int):
- raise TypeError("an integer is required")
- if N < 0:
- raise ValueError("cannot read to end of infinite stream")
- elif N == 0:
- return ""
- data = self._read(N)
- if len(data) != N:
- raise AssertionError("%s produced truncated output (requested %d, got %d)" % (self.name, N, len(data)))
- return data
-
- def _close(self):
- raise NotImplementedError("child class must implement this")
-
- def _read(self, N):
- raise NotImplementedError("child class must implement this")
-
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/_UserFriendlyRNG.py b/frozen_deps/Crypto/Random/_UserFriendlyRNG.py
deleted file mode 100644
index 937c17d..0000000
--- a/frozen_deps/Crypto/Random/_UserFriendlyRNG.py
+++ /dev/null
@@ -1,230 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Random/_UserFriendlyRNG.py : A user-friendly random number generator
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-
-import os
-import threading
-import struct
-import time
-from math import floor
-
-from Crypto.Random import OSRNG
-from Crypto.Random.Fortuna import FortunaAccumulator
-
-class _EntropySource(object):
- def __init__(self, accumulator, src_num):
- self._fortuna = accumulator
- self._src_num = src_num
- self._pool_num = 0
-
- def feed(self, data):
- self._fortuna.add_random_event(self._src_num, self._pool_num, data)
- self._pool_num = (self._pool_num + 1) & 31
-
-class _EntropyCollector(object):
-
- def __init__(self, accumulator):
- self._osrng = OSRNG.new()
- self._osrng_es = _EntropySource(accumulator, 255)
- self._time_es = _EntropySource(accumulator, 254)
- self._clock_es = _EntropySource(accumulator, 253)
-
- def reinit(self):
- # Add 256 bits to each of the 32 pools, twice. (For a total of 16384
- # bits collected from the operating system.)
- for i in range(2):
- block = self._osrng.read(32*32)
- for p in range(32):
- self._osrng_es.feed(block[p*32:(p+1)*32])
- block = None
- self._osrng.flush()
-
- def collect(self):
- # Collect 64 bits of entropy from the operating system and feed it to Fortuna.
- self._osrng_es.feed(self._osrng.read(8))
-
- # Add the fractional part of time.time()
- t = time.time()
- self._time_es.feed(struct.pack("@I", int(2**30 * (t - floor(t)))))
-
- # Add the fractional part of time.clock()
- t = time.clock()
- self._clock_es.feed(struct.pack("@I", int(2**30 * (t - floor(t)))))
-
-
-class _UserFriendlyRNG(object):
-
- def __init__(self):
- self.closed = False
- self._fa = FortunaAccumulator.FortunaAccumulator()
- self._ec = _EntropyCollector(self._fa)
- self.reinit()
-
- def reinit(self):
- """Initialize the random number generator and seed it with entropy from
- the operating system.
- """
-
- # Save the pid (helps ensure that Crypto.Random.atfork() gets called)
- self._pid = os.getpid()
-
- # Collect entropy from the operating system and feed it to
- # FortunaAccumulator
- self._ec.reinit()
-
- # Override FortunaAccumulator's 100ms minimum re-seed interval. This
- # is necessary to avoid a race condition between this function and
- # self.read(), which that can otherwise cause forked child processes to
- # produce identical output. (e.g. CVE-2013-1445)
- #
- # Note that if this function can be called frequently by an attacker,
- # (and if the bits from OSRNG are insufficiently random) it will weaken
- # Fortuna's ability to resist a state compromise extension attack.
- self._fa._forget_last_reseed()
-
- def close(self):
- self.closed = True
- self._osrng = None
- self._fa = None
-
- def flush(self):
- pass
-
- def read(self, N):
- """Return N bytes from the RNG."""
- if self.closed:
- raise ValueError("I/O operation on closed file")
- if not isinstance(N, int):
- raise TypeError("an integer is required")
- if N < 0:
- raise ValueError("cannot read to end of infinite stream")
-
- # Collect some entropy and feed it to Fortuna
- self._ec.collect()
-
- # Ask Fortuna to generate some bytes
- retval = self._fa.random_data(N)
-
- # Check that we haven't forked in the meantime. (If we have, we don't
- # want to use the data, because it might have been duplicated in the
- # parent process.
- self._check_pid()
-
- # Return the random data.
- return retval
-
- def _check_pid(self):
- # Lame fork detection to remind developers to invoke Random.atfork()
- # after every call to os.fork(). Note that this check is not reliable,
- # since process IDs can be reused on most operating systems.
- #
- # You need to do Random.atfork() in the child process after every call
- # to os.fork() to avoid reusing PRNG state. If you want to avoid
- # leaking PRNG state to child processes (for example, if you are using
- # os.setuid()) then you should also invoke Random.atfork() in the
- # *parent* process.
- if os.getpid() != self._pid:
- raise AssertionError("PID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()")
-
-
-class _LockingUserFriendlyRNG(_UserFriendlyRNG):
- def __init__(self):
- self._lock = threading.Lock()
- _UserFriendlyRNG.__init__(self)
-
- def close(self):
- self._lock.acquire()
- try:
- return _UserFriendlyRNG.close(self)
- finally:
- self._lock.release()
-
- def reinit(self):
- self._lock.acquire()
- try:
- return _UserFriendlyRNG.reinit(self)
- finally:
- self._lock.release()
-
- def read(self, bytes):
- self._lock.acquire()
- try:
- return _UserFriendlyRNG.read(self, bytes)
- finally:
- self._lock.release()
-
-class RNGFile(object):
- def __init__(self, singleton):
- self.closed = False
- self._singleton = singleton
-
- # PEP 343: Support for the "with" statement
- def __enter__(self):
- """PEP 343 support"""
- def __exit__(self):
- """PEP 343 support"""
- self.close()
-
- def close(self):
- # Don't actually close the singleton, just close this RNGFile instance.
- self.closed = True
- self._singleton = None
-
- def read(self, bytes):
- if self.closed:
- raise ValueError("I/O operation on closed file")
- return self._singleton.read(bytes)
-
- def flush(self):
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
-_singleton_lock = threading.Lock()
-_singleton = None
-def _get_singleton():
- global _singleton
- _singleton_lock.acquire()
- try:
- if _singleton is None:
- _singleton = _LockingUserFriendlyRNG()
- return _singleton
- finally:
- _singleton_lock.release()
-
-def new():
- return RNGFile(_get_singleton())
-
-def reinit():
- _get_singleton().reinit()
-
-def get_random_bytes(n):
- """Return the specified number of cryptographically-strong random bytes."""
- return _get_singleton().read(n)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/__init__.py b/frozen_deps/Crypto/Random/__init__.py
deleted file mode 100644
index 659ffee..0000000
--- a/frozen_deps/Crypto/Random/__init__.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Random/__init__.py : PyCrypto random number generation
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-__all__ = ['new']
-
-from Crypto.Random import OSRNG
-from Crypto.Random import _UserFriendlyRNG
-
-def new(*args, **kwargs):
- """Return a file-like object that outputs cryptographically random bytes."""
- return _UserFriendlyRNG.new(*args, **kwargs)
-
-def atfork():
- """Call this whenever you call os.fork()"""
- _UserFriendlyRNG.reinit()
-
-def get_random_bytes(n):
- """Return the specified number of cryptographically-strong random bytes."""
- return _UserFriendlyRNG.get_random_bytes(n)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Random/random.py b/frozen_deps/Crypto/Random/random.py
deleted file mode 100644
index cd9a221..0000000
--- a/frozen_deps/Crypto/Random/random.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Random/random.py : Strong alternative for the standard 'random' module
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""A cryptographically strong version of Python's standard "random" module."""
-
-__revision__ = "$Id$"
-__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample']
-
-from Crypto import Random
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-
-class StrongRandom(object):
- def __init__(self, rng=None, randfunc=None):
- if randfunc is None and rng is None:
- self._randfunc = None
- elif randfunc is not None and rng is None:
- self._randfunc = randfunc
- elif randfunc is None and rng is not None:
- self._randfunc = rng.read
- else:
- raise ValueError("Cannot specify both 'rng' and 'randfunc'")
-
- def getrandbits(self, k):
- """Return a python long integer with k random bits."""
- if self._randfunc is None:
- self._randfunc = Random.new().read
- mask = (1 << k) - 1
- return mask & bytes_to_long(self._randfunc(ceil_div(k, 8)))
-
- def randrange(self, *args):
- """randrange([start,] stop[, step]):
- Return a randomly-selected element from range(start, stop, step)."""
- if len(args) == 3:
- (start, stop, step) = args
- elif len(args) == 2:
- (start, stop) = args
- step = 1
- elif len(args) == 1:
- (stop,) = args
- start = 0
- step = 1
- else:
- raise TypeError("randrange expected at most 3 arguments, got %d" % (len(args),))
- if (not isinstance(start, int)
- or not isinstance(stop, int)
- or not isinstance(step, int)):
- raise TypeError("randrange requires integer arguments")
- if step == 0:
- raise ValueError("randrange step argument must not be zero")
-
- num_choices = ceil_div(stop - start, step)
- if num_choices < 0:
- num_choices = 0
- if num_choices < 1:
- raise ValueError("empty range for randrange(%r, %r, %r)" % (start, stop, step))
-
- # Pick a random number in the range of possible numbers
- r = num_choices
- while r >= num_choices:
- r = self.getrandbits(size(num_choices))
-
- return start + (step * r)
-
- def randint(self, a, b):
- """Return a random integer N such that a <= N <= b."""
- if not isinstance(a, int) or not isinstance(b, int):
- raise TypeError("randint requires integer arguments")
- N = self.randrange(a, b+1)
- assert a <= N <= b
- return N
-
- def choice(self, seq):
- """Return a random element from a (non-empty) sequence.
-
- If the seqence is empty, raises IndexError.
- """
- if len(seq) == 0:
- raise IndexError("empty sequence")
- return seq[self.randrange(len(seq))]
-
- def shuffle(self, x):
- """Shuffle the sequence in place."""
- # Make a (copy) of the list of objects we want to shuffle
- items = list(x)
-
- # Choose a random item (without replacement) until all the items have been
- # chosen.
- for i in range(len(x)):
- x[i] = items.pop(self.randrange(len(items)))
-
- def sample(self, population, k):
- """Return a k-length list of unique elements chosen from the population sequence."""
-
- num_choices = len(population)
- if k > num_choices:
- raise ValueError("sample larger than population")
-
- retval = []
- selected = {} # we emulate a set using a dict here
- for i in range(k):
- r = None
- while r is None or r in selected:
- r = self.randrange(num_choices)
- retval.append(population[r])
- selected[r] = 1
- return retval
-
-_r = StrongRandom()
-getrandbits = _r.getrandbits
-randrange = _r.randrange
-randint = _r.randint
-choice = _r.choice
-shuffle = _r.shuffle
-sample = _r.sample
-
-# These are at the bottom to avoid problems with recursive imports
-from Crypto.Util.number import ceil_div, bytes_to_long, long_to_bytes, size
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Signature/PKCS1_PSS.py b/frozen_deps/Crypto/Signature/PKCS1_PSS.py
deleted file mode 100644
index 319851e..0000000
--- a/frozen_deps/Crypto/Signature/PKCS1_PSS.py
+++ /dev/null
@@ -1,355 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Signature/PKCS1_PSS.py : PKCS#1 PPS
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""RSA digital signature protocol with appendix according to PKCS#1 PSS.
-
-See RFC3447__ or the `original RSA Labs specification`__.
-
-This scheme is more properly called ``RSASSA-PSS``.
-
-For example, a sender may authenticate a message using SHA-1 and PSS like
-this:
-
- >>> from Crypto.Signature import PKCS1_PSS
- >>> from Crypto.Hash import SHA
- >>> from Crypto.PublicKey import RSA
- >>> from Crypto import Random
- >>>
- >>> message = 'To be signed'
- >>> key = RSA.importKey(open('privkey.der').read())
- >>> h = SHA.new()
- >>> h.update(message)
- >>> signer = PKCS1_PSS.new(key)
- >>> signature = PKCS1_PSS.sign(key)
-
-At the receiver side, verification can be done like using the public part of
-the RSA key:
-
- >>> key = RSA.importKey(open('pubkey.der').read())
- >>> h = SHA.new()
- >>> h.update(message)
- >>> verifier = PKCS1_PSS.new(key)
- >>> if verifier.verify(h, signature):
- >>> print "The signature is authentic."
- >>> else:
- >>> print "The signature is not authentic."
-
-:undocumented: __revision__, __package__
-
-.. __: http://www.ietf.org/rfc/rfc3447.txt
-.. __: http://www.rsa.com/rsalabs/node.asp?id=2125
-"""
-
-# Allow nested scopes in Python 2.1
-# See http://oreilly.com/pub/a/python/2001/04/19/pythonnews.html
-
-
-__revision__ = "$Id$"
-__all__ = [ 'new', 'PSS_SigScheme' ]
-
-from Crypto.Util.py3compat import *
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-import Crypto.Util.number
-from Crypto.Util.number import ceil_shift, ceil_div, long_to_bytes
-from Crypto.Util.strxor import strxor
-
-class PSS_SigScheme:
- """This signature scheme can perform PKCS#1 PSS RSA signature or verification."""
-
- def __init__(self, key, mgfunc, saltLen):
- """Initialize this PKCS#1 PSS signature scheme object.
-
- :Parameters:
- key : an RSA key object
- If a private half is given, both signature and verification are possible.
- If a public half is given, only verification is possible.
- mgfunc : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- saltLen : int
- Length of the salt, in bytes.
- """
- self._key = key
- self._saltLen = saltLen
- self._mgfunc = mgfunc
-
- def can_sign(self):
- """Return True if this cipher object can be used for signing messages."""
- return self._key.has_private()
-
- def sign(self, mhash):
- """Produce the PKCS#1 PSS signature of a message.
-
- This function is named ``RSASSA-PSS-SIGN``, and is specified in
- section 8.1.1 of RFC3447.
-
- :Parameters:
- mhash : hash object
- The hash that was carried out over the message. This is an object
- belonging to the `Crypto.Hash` module.
-
- :Return: The PSS signature encoded as a string.
- :Raise ValueError:
- If the RSA key length is not sufficiently long to deal with the given
- hash algorithm.
- :Raise TypeError:
- If the RSA key has no private half.
-
- :attention: Modify the salt length and the mask generation function only
- if you know what you are doing.
- The receiver must use the same parameters too.
- """
- # TODO: Verify the key is RSA
-
- randfunc = self._key._randfunc
-
- # Set defaults for salt length and mask generation function
- if self._saltLen == None:
- sLen = mhash.digest_size
- else:
- sLen = self._saltLen
- if self._mgfunc:
- mgf = self._mgfunc
- else:
- mgf = lambda x,y: MGF1(x,y,mhash)
-
- modBits = Crypto.Util.number.size(self._key.n)
-
- # See 8.1.1 in RFC3447
- k = ceil_div(modBits,8) # Convert from bits to bytes
- # Step 1
- em = EMSA_PSS_ENCODE(mhash, modBits-1, randfunc, mgf, sLen)
- # Step 2a (OS2IP) and 2b (RSASP1)
- m = self._key.decrypt(em)
- # Step 2c (I2OSP)
- S = bchr(0x00)*(k-len(m)) + m
- return S
-
- def verify(self, mhash, S):
- """Verify that a certain PKCS#1 PSS signature is authentic.
-
- This function checks if the party holding the private half of the given
- RSA key has really signed the message.
-
- This function is called ``RSASSA-PSS-VERIFY``, and is specified in section
- 8.1.2 of RFC3447.
-
- :Parameters:
- mhash : hash object
- The hash that was carried out over the message. This is an object
- belonging to the `Crypto.Hash` module.
- S : string
- The signature that needs to be validated.
-
- :Return: True if verification is correct. False otherwise.
- """
- # TODO: Verify the key is RSA
-
- # Set defaults for salt length and mask generation function
- if self._saltLen == None:
- sLen = mhash.digest_size
- else:
- sLen = self._saltLen
- if self._mgfunc:
- mgf = self._mgfunc
- else:
- mgf = lambda x,y: MGF1(x,y,mhash)
-
- modBits = Crypto.Util.number.size(self._key.n)
-
- # See 8.1.2 in RFC3447
- k = ceil_div(modBits,8) # Convert from bits to bytes
- # Step 1
- if len(S) != k:
- return False
- # Step 2a (O2SIP), 2b (RSAVP1), and partially 2c (I2OSP)
- # Note that signature must be smaller than the module
- # but RSA.py won't complain about it.
- # TODO: Fix RSA object; don't do it here.
- em = self._key.encrypt(S, 0)[0]
- # Step 2c
- emLen = ceil_div(modBits-1,8)
- em = bchr(0x00)*(emLen-len(em)) + em
- # Step 3
- try:
- result = EMSA_PSS_VERIFY(mhash, em, modBits-1, mgf, sLen)
- except ValueError:
- return False
- # Step 4
- return result
-
-def MGF1(mgfSeed, maskLen, hash):
- """Mask Generation Function, described in B.2.1"""
- T = b("")
- for counter in range(ceil_div(maskLen, hash.digest_size)):
- c = long_to_bytes(counter, 4)
- T = T + hash.new(mgfSeed + c).digest()
- assert(len(T)>=maskLen)
- return T[:maskLen]
-
-def EMSA_PSS_ENCODE(mhash, emBits, randFunc, mgf, sLen):
- """
- Implement the ``EMSA-PSS-ENCODE`` function, as defined
- in PKCS#1 v2.1 (RFC3447, 9.1.1).
-
- The original ``EMSA-PSS-ENCODE`` actually accepts the message ``M`` as input,
- and hash it internally. Here, we expect that the message has already
- been hashed instead.
-
- :Parameters:
- mhash : hash object
- The hash object that holds the digest of the message being signed.
- emBits : int
- Maximum length of the final encoding, in bits.
- randFunc : callable
- An RNG function that accepts as only parameter an int, and returns
- a string of random bytes, to be used as salt.
- mgf : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- sLen : int
- Length of the salt, in bytes.
-
- :Return: An ``emLen`` byte long string that encodes the hash
- (with ``emLen = \ceil(emBits/8)``).
-
- :Raise ValueError:
- When digest or salt length are too big.
- """
-
- emLen = ceil_div(emBits,8)
-
- # Bitmask of digits that fill up
- lmask = 0
- for i in range(8*emLen-emBits):
- lmask = lmask>>1 | 0x80
-
- # Step 1 and 2 have been already done
- # Step 3
- if emLen < mhash.digest_size+sLen+2:
- raise ValueError("Digest or salt length are too long for given key size.")
- # Step 4
- salt = b("")
- if randFunc and sLen>0:
- salt = randFunc(sLen)
- # Step 5 and 6
- h = mhash.new(bchr(0x00)*8 + mhash.digest() + salt)
- # Step 7 and 8
- db = bchr(0x00)*(emLen-sLen-mhash.digest_size-2) + bchr(0x01) + salt
- # Step 9
- dbMask = mgf(h.digest(), emLen-mhash.digest_size-1)
- # Step 10
- maskedDB = strxor(db,dbMask)
- # Step 11
- maskedDB = bchr(bord(maskedDB[0]) & ~lmask) + maskedDB[1:]
- # Step 12
- em = maskedDB + h.digest() + bchr(0xBC)
- return em
-
-def EMSA_PSS_VERIFY(mhash, em, emBits, mgf, sLen):
- """
- Implement the ``EMSA-PSS-VERIFY`` function, as defined
- in PKCS#1 v2.1 (RFC3447, 9.1.2).
-
- ``EMSA-PSS-VERIFY`` actually accepts the message ``M`` as input,
- and hash it internally. Here, we expect that the message has already
- been hashed instead.
-
- :Parameters:
- mhash : hash object
- The hash object that holds the digest of the message to be verified.
- em : string
- The signature to verify, therefore proving that the sender really signed
- the message that was received.
- emBits : int
- Length of the final encoding (em), in bits.
- mgf : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- sLen : int
- Length of the salt, in bytes.
-
- :Return: 0 if the encoding is consistent, 1 if it is inconsistent.
-
- :Raise ValueError:
- When digest or salt length are too big.
- """
-
- emLen = ceil_div(emBits,8)
-
- # Bitmask of digits that fill up
- lmask = 0
- for i in range(8*emLen-emBits):
- lmask = lmask>>1 | 0x80
-
- # Step 1 and 2 have been already done
- # Step 3
- if emLen < mhash.digest_size+sLen+2:
- return False
- # Step 4
- if ord(em[-1:])!=0xBC:
- return False
- # Step 5
- maskedDB = em[:emLen-mhash.digest_size-1]
- h = em[emLen-mhash.digest_size-1:-1]
- # Step 6
- if lmask & bord(em[0]):
- return False
- # Step 7
- dbMask = mgf(h, emLen-mhash.digest_size-1)
- # Step 8
- db = strxor(maskedDB, dbMask)
- # Step 9
- db = bchr(bord(db[0]) & ~lmask) + db[1:]
- # Step 10
- if not db.startswith(bchr(0x00)*(emLen-mhash.digest_size-sLen-2) + bchr(0x01)):
- return False
- # Step 11
- salt = b("")
- if sLen: salt = db[-sLen:]
- # Step 12 and 13
- hp = mhash.new(bchr(0x00)*8 + mhash.digest() + salt).digest()
- # Step 14
- if h!=hp:
- return False
- return True
-
-def new(key, mgfunc=None, saltLen=None):
- """Return a signature scheme object `PSS_SigScheme` that
- can be used to perform PKCS#1 PSS signature or verification.
-
- :Parameters:
- key : RSA key object
- The key to use to sign or verify the message. This is a `Crypto.PublicKey.RSA` object.
- Signing is only possible if *key* is a private RSA key.
- mgfunc : callable
- A mask generation function that accepts two parameters: a string to
- use as seed, and the lenth of the mask to generate, in bytes.
- If not specified, the standard MGF1 is used.
- saltLen : int
- Length of the salt, in bytes. If not specified, it matches the output
- size of the hash function.
-
- """
- return PSS_SigScheme(key, mgfunc, saltLen)
-
diff --git a/frozen_deps/Crypto/Signature/PKCS1_v1_5.py b/frozen_deps/Crypto/Signature/PKCS1_v1_5.py
deleted file mode 100644
index 73ac251..0000000
--- a/frozen_deps/Crypto/Signature/PKCS1_v1_5.py
+++ /dev/null
@@ -1,236 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Signature/PKCS1-v1_5.py : PKCS#1 v1.5
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""
-RSA digital signature protocol according to PKCS#1 v1.5
-
-See RFC3447__ or the `original RSA Labs specification`__.
-
-This scheme is more properly called ``RSASSA-PKCS1-v1_5``.
-
-For example, a sender may authenticate a message using SHA-1 like
-this:
-
- >>> from Crypto.Signature import PKCS1_v1_5
- >>> from Crypto.Hash import SHA
- >>> from Crypto.PublicKey import RSA
- >>>
- >>> message = 'To be signed'
- >>> key = RSA.importKey(open('privkey.der').read())
- >>> h = SHA.new(message)
- >>> signer = PKCS1_v1_5.new(key)
- >>> signature = signer.sign(h)
-
-At the receiver side, verification can be done using the public part of
-the RSA key:
-
- >>> key = RSA.importKey(open('pubkey.der').read())
- >>> h = SHA.new(message)
- >>> verifier = PKCS1_v1_5.new(key)
- >>> if verifier.verify(h, signature):
- >>> print "The signature is authentic."
- >>> else:
- >>> print "The signature is not authentic."
-
-:undocumented: __revision__, __package__
-
-.. __: http://www.ietf.org/rfc/rfc3447.txt
-.. __: http://www.rsa.com/rsalabs/node.asp?id=2125
-"""
-
-__revision__ = "$Id$"
-__all__ = [ 'new', 'PKCS115_SigScheme' ]
-
-import Crypto.Util.number
-from Crypto.Util.number import ceil_div
-from Crypto.Util.asn1 import DerSequence, DerNull, DerOctetString
-from Crypto.Util.py3compat import *
-
-class PKCS115_SigScheme:
- """This signature scheme can perform PKCS#1 v1.5 RSA signature or verification."""
-
- def __init__(self, key):
- """Initialize this PKCS#1 v1.5 signature scheme object.
-
- :Parameters:
- key : an RSA key object
- If a private half is given, both signature and verification are possible.
- If a public half is given, only verification is possible.
- """
- self._key = key
-
- def can_sign(self):
- """Return True if this cipher object can be used for signing messages."""
- return self._key.has_private()
-
- def sign(self, mhash):
- """Produce the PKCS#1 v1.5 signature of a message.
-
- This function is named ``RSASSA-PKCS1-V1_5-SIGN``, and is specified in
- section 8.2.1 of RFC3447.
-
- :Parameters:
- mhash : hash object
- The hash that was carried out over the message. This is an object
- belonging to the `Crypto.Hash` module.
-
- :Return: The signature encoded as a string.
- :Raise ValueError:
- If the RSA key length is not sufficiently long to deal with the given
- hash algorithm.
- :Raise TypeError:
- If the RSA key has no private half.
- """
- # TODO: Verify the key is RSA
-
- # See 8.2.1 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
-
- # Step 1
- em = EMSA_PKCS1_V1_5_ENCODE(mhash, k)
- # Step 2a (OS2IP) and 2b (RSASP1)
- m = self._key.decrypt(em)
- # Step 2c (I2OSP)
- S = bchr(0x00)*(k-len(m)) + m
- return S
-
- def verify(self, mhash, S):
- """Verify that a certain PKCS#1 v1.5 signature is authentic.
-
- This function checks if the party holding the private half of the key
- really signed the message.
-
- This function is named ``RSASSA-PKCS1-V1_5-VERIFY``, and is specified in
- section 8.2.2 of RFC3447.
-
- :Parameters:
- mhash : hash object
- The hash that was carried out over the message. This is an object
- belonging to the `Crypto.Hash` module.
- S : string
- The signature that needs to be validated.
-
- :Return: True if verification is correct. False otherwise.
- """
- # TODO: Verify the key is RSA
-
- # See 8.2.2 in RFC3447
- modBits = Crypto.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
-
- # Step 1
- if len(S) != k:
- return 0
- # Step 2a (O2SIP) and 2b (RSAVP1)
- # Note that signature must be smaller than the module
- # but RSA.py won't complain about it.
- # TODO: Fix RSA object; don't do it here.
- m = self._key.encrypt(S, 0)[0]
- # Step 2c (I2OSP)
- em1 = bchr(0x00)*(k-len(m)) + m
- # Step 3
- try:
- em2 = EMSA_PKCS1_V1_5_ENCODE(mhash, k)
- except ValueError:
- return 0
- # Step 4
- # By comparing the full encodings (as opposed to checking each
- # of its components one at a time) we avoid attacks to the padding
- # scheme like Bleichenbacher's (see http://www.mail-archive.com/[email protected]/msg06537).
- #
- return em1==em2
-
-def EMSA_PKCS1_V1_5_ENCODE(hash, emLen):
- """
- Implement the ``EMSA-PKCS1-V1_5-ENCODE`` function, as defined
- in PKCS#1 v2.1 (RFC3447, 9.2).
-
- ``EMSA-PKCS1-V1_5-ENCODE`` actually accepts the message ``M`` as input,
- and hash it internally. Here, we expect that the message has already
- been hashed instead.
-
- :Parameters:
- hash : hash object
- The hash object that holds the digest of the message being signed.
- emLen : int
- The length the final encoding must have, in bytes.
-
- :attention: the early standard (RFC2313) stated that ``DigestInfo``
- had to be BER-encoded. This means that old signatures
- might have length tags in indefinite form, which
- is not supported in DER. Such encoding cannot be
- reproduced by this function.
-
- :attention: the same standard defined ``DigestAlgorithm`` to be
- of ``AlgorithmIdentifier`` type, where the PARAMETERS
- item is optional. Encodings for ``MD2/4/5`` without
- ``PARAMETERS`` cannot be reproduced by this function.
-
- :Return: An ``emLen`` byte long string that encodes the hash.
- """
-
- # First, build the ASN.1 DER object DigestInfo:
- #
- # DigestInfo ::= SEQUENCE {
- # digestAlgorithm AlgorithmIdentifier,
- # digest OCTET STRING
- # }
- #
- # where digestAlgorithm identifies the hash function and shall be an
- # algorithm ID with an OID in the set PKCS1-v1-5DigestAlgorithms.
- #
- # PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= {
- # { OID id-md2 PARAMETERS NULL }|
- # { OID id-md5 PARAMETERS NULL }|
- # { OID id-sha1 PARAMETERS NULL }|
- # { OID id-sha256 PARAMETERS NULL }|
- # { OID id-sha384 PARAMETERS NULL }|
- # { OID id-sha512 PARAMETERS NULL }
- # }
- #
- digestAlgo = DerSequence([hash.oid, DerNull().encode()])
- digest = DerOctetString(hash.digest())
- digestInfo = DerSequence([
- digestAlgo.encode(),
- digest.encode()
- ]).encode()
-
- # We need at least 11 bytes for the remaining data: 3 fixed bytes and
- # at least 8 bytes of padding).
- if emLen<len(digestInfo)+11:
- raise ValueError("Selected hash algorith has a too long digest (%d bytes)." % len(digest))
- PS = bchr(0xFF) * (emLen - len(digestInfo) - 3)
- return b("\x00\x01") + PS + bchr(0x00) + digestInfo
-
-def new(key):
- """Return a signature scheme object `PKCS115_SigScheme` that
- can be used to perform PKCS#1 v1.5 signature or verification.
-
- :Parameters:
- key : RSA key object
- The key to use to sign or verify the message. This is a `Crypto.PublicKey.RSA` object.
- Signing is only possible if *key* is a private RSA key.
-
- """
- return PKCS115_SigScheme(key)
-
diff --git a/frozen_deps/Crypto/Signature/__init__.py b/frozen_deps/Crypto/Signature/__init__.py
deleted file mode 100644
index ed523b4..0000000
--- a/frozen_deps/Crypto/Signature/__init__.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Digital signature protocols
-
-A collection of standardized protocols to carry out digital signatures.
-
-:undocumented: __revision__, __package__
-"""
-
-__all__ = [ 'PKCS1_v1_5', 'PKCS1_PSS' ]
-__revision__ = "$Id$"
-
-
diff --git a/frozen_deps/Crypto/Util/Counter.py b/frozen_deps/Crypto/Util/Counter.py
deleted file mode 100644
index f0460e5..0000000
--- a/frozen_deps/Crypto/Util/Counter.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# -*- coding: ascii -*-
-#
-# Util/Counter.py : Fast counter for use with CTR-mode ciphers
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-"""Fast counter functions for CTR cipher modes.
-
-CTR is a chaining mode for symmetric block encryption or decryption.
-Messages are divideded into blocks, and the cipher operation takes
-place on each block using the secret key and a unique *counter block*.
-
-The most straightforward way to fulfil the uniqueness property is
-to start with an initial, random *counter block* value, and increment it as
-the next block is processed.
-
-The block ciphers from `Crypto.Cipher` (when configured in *MODE_CTR* mode)
-invoke a callable object (the *counter* parameter) to get the next *counter block*.
-Unfortunately, the Python calling protocol leads to major performance degradations.
-
-The counter functions instantiated by this module will be invoked directly
-by the ciphers in `Crypto.Cipher`. The fact that the Python layer is bypassed
-lead to more efficient (and faster) execution of CTR cipher modes.
-
-An example of usage is the following:
-
- >>> from Crypto.Cipher import AES
- >>> from Crypto.Util import Counter
- >>>
- >>> pt = b'\x00'*1000000
- >>> ctr = Counter.new(128)
- >>> cipher = AES.new(b'\x00'*16, AES.MODE_CTR, counter=ctr)
- >>> ct = cipher.encrypt(pt)
-
-:undocumented: __package__
-"""
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-from Crypto.Util.py3compat import *
-
-from Crypto.Util import _counter
-import struct
-
-# Factory function
-def new(nbits, prefix=b(""), suffix=b(""), initial_value=1, overflow=0, little_endian=False, allow_wraparound=False, disable_shortcut=False):
- """Create a stateful counter block function suitable for CTR encryption modes.
-
- Each call to the function returns the next counter block.
- Each counter block is made up by three parts::
-
- prefix || counter value || postfix
-
- The counter value is incremented by one at each call.
-
- :Parameters:
- nbits : integer
- Length of the desired counter, in bits. It must be a multiple of 8.
- prefix : byte string
- The constant prefix of the counter block. By default, no prefix is
- used.
- suffix : byte string
- The constant postfix of the counter block. By default, no suffix is
- used.
- initial_value : integer
- The initial value of the counter. Default value is 1.
- little_endian : boolean
- If True, the counter number will be encoded in little endian format.
- If False (default), in big endian format.
- allow_wraparound : boolean
- If True, the function will raise an *OverflowError* exception as soon
- as the counter wraps around. If False (default), the counter will
- simply restart from zero.
- disable_shortcut : boolean
- If True, do not make ciphers from `Crypto.Cipher` bypass the Python
- layer when invoking the counter block function.
- If False (default), bypass the Python layer.
- :Returns:
- The counter block function.
- """
-
- # Sanity-check the message size
- (nbytes, remainder) = divmod(nbits, 8)
- if remainder != 0:
- # In the future, we might support arbitrary bit lengths, but for now we don't.
- raise ValueError("nbits must be a multiple of 8; got %d" % (nbits,))
- if nbytes < 1:
- raise ValueError("nbits too small")
- elif nbytes > 0xffff:
- raise ValueError("nbits too large")
-
- initval = _encode(initial_value, nbytes, little_endian)
-
- if little_endian:
- return _counter._newLE(bstr(prefix), bstr(suffix), initval, allow_wraparound=allow_wraparound, disable_shortcut=disable_shortcut)
- else:
- return _counter._newBE(bstr(prefix), bstr(suffix), initval, allow_wraparound=allow_wraparound, disable_shortcut=disable_shortcut)
-
-def _encode(n, nbytes, little_endian=False):
- retval = []
- n = int(n)
- for i in range(nbytes):
- if little_endian:
- retval.append(bchr(n & 0xff))
- else:
- retval.insert(0, bchr(n & 0xff))
- n >>= 8
- return b("").join(retval)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Util/RFC1751.py b/frozen_deps/Crypto/Util/RFC1751.py
deleted file mode 100644
index 1c10c4a..0000000
--- a/frozen_deps/Crypto/Util/RFC1751.py
+++ /dev/null
@@ -1,365 +0,0 @@
-# rfc1751.py : Converts between 128-bit strings and a human-readable
-# sequence of words, as defined in RFC1751: "A Convention for
-# Human-Readable 128-bit Keys", by Daniel L. McDonald.
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew M. Kuchling and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-
-import binascii
-from Crypto.Util.py3compat import *
-from functools import reduce
-
-binary={0:'0000', 1:'0001', 2:'0010', 3:'0011', 4:'0100', 5:'0101',
- 6:'0110', 7:'0111', 8:'1000', 9:'1001', 10:'1010', 11:'1011',
- 12:'1100', 13:'1101', 14:'1110', 15:'1111'}
-
-def _key2bin(s):
- "Convert a key into a string of binary digits"
- kl=[bord(x) for x in s]
- kl=[binary[x>>4]+binary[x&15] for x in kl]
- return ''.join(kl)
-
-def _extract(key, start, length):
- """Extract a bitstring(2.x)/bytestring(2.x) from a string of binary digits, and return its
- numeric value."""
- k=key[start:start+length]
- return reduce(lambda x,y: x*2+ord(y)-48, k, 0)
-
-def key_to_english (key):
- """key_to_english(key:string(2.x)/bytes(3.x)) : string
- Transform an arbitrary key into a string containing English words.
- The key length must be a multiple of 8.
- """
- english=''
- for index in range(0, len(key), 8): # Loop over 8-byte subkeys
- subkey=key[index:index+8]
- # Compute the parity of the key
- skbin=_key2bin(subkey) ; p=0
- for i in range(0, 64, 2): p=p+_extract(skbin, i, 2)
- # Append parity bits to the subkey
- skbin=_key2bin(subkey+bchr((p<<6) & 255))
- for i in range(0, 64, 11):
- english=english+wordlist[_extract(skbin, i, 11)]+' '
-
- return english[:-1] # Remove the trailing space
-
-def english_to_key (s):
- """english_to_key(string):string(2.x)/bytes(2.x)
- Transform a string into a corresponding key.
- The string must contain words separated by whitespace; the number
- of words must be a multiple of 6.
- """
-
- L=s.upper().split() ; key=b('')
- for index in range(0, len(L), 6):
- sublist=L[index:index+6] ; char=9*[0] ; bits=0
- for i in sublist:
- index = wordlist.index(i)
- shift = (8-(bits+11)%8) %8
- y = index << shift
- cl, cc, cr = (y>>16), (y>>8)&0xff, y & 0xff
- if (shift>5):
- char[bits>>3] = char[bits>>3] | cl
- char[(bits>>3)+1] = char[(bits>>3)+1] | cc
- char[(bits>>3)+2] = char[(bits>>3)+2] | cr
- elif shift>-3:
- char[bits>>3] = char[bits>>3] | cc
- char[(bits>>3)+1] = char[(bits>>3)+1] | cr
- else: char[bits>>3] = char[bits>>3] | cr
- bits=bits+11
- subkey=reduce(lambda x,y:x+bchr(y), char, b(''))
-
- # Check the parity of the resulting key
- skbin=_key2bin(subkey)
- p=0
- for i in range(0, 64, 2): p=p+_extract(skbin, i, 2)
- if (p&3) != _extract(skbin, 64, 2):
- raise ValueError("Parity error in resulting key")
- key=key+subkey[0:8]
- return key
-
-wordlist=[ "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD",
- "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA",
- "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK",
- "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE",
- "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM",
- "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET",
- "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO",
- "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT",
- "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT",
- "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY",
- "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN",
- "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG",
- "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB",
- "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO",
- "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE",
- "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW",
- "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR",
- "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP",
- "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO",
- "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD",
- "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM",
- "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT",
- "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE",
- "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL",
- "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT",
- "ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET",
- "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT",
- "KAY", "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB",
- "LAC", "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE",
- "LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT",
- "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG",
- "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW",
- "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT",
- "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG",
- "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED",
- "NEE", "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD",
- "NON", "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF",
- "OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL",
- "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT",
- "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD",
- "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG",
- "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT",
- "PLY", "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB",
- "PUG", "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT",
- "RAW", "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM",
- "RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB",
- "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM",
- "SAN", "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET",
- "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY",
- "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY",
- "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN",
- "TAP", "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE",
- "TIM", "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP",
- "TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP",
- "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS",
- "WAY", "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT",
- "WOK", "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE",
- "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT",
- "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS",
- "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE",
- "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA",
- "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", "AMEN",
- "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW",
- "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA",
- "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", "ATOM",
- "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW",
- "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL",
- "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM",
- "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK",
- "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH",
- "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT",
- "BEAU", "BECK", "BEEF", "BEEN", "BEER",
- "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN",
- "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE",
- "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE",
- "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT",
- "BLOW", "BLUE", "BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK",
- "BODE", "BODY", "BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT",
- "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN", "BONY", "BOOK",
- "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS",
- "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN",
- "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD",
- "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG",
- "BURL", "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST",
- "BUSY", "BYTE", "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF",
- "CALL", "CALM", "CAME", "CANE", "CANT", "CARD", "CARE", "CARL",
- "CARR", "CART", "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL",
- "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF",
- "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG",
- "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY",
- "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA",
- "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN",
- "COKE", "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK",
- "COOL", "COON", "COOT", "CORD", "CORE", "CORK", "CORN", "COST",
- "COVE", "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB",
- "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY",
- "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS", "DADE", "DALE",
- "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK", "DARN",
- "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS",
- "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED",
- "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK",
- "DIAL", "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT",
- "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES",
- "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA",
- "DOSE", "DOTE", "DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG",
- "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK",
- "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK",
- "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST",
- "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT",
- "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT",
- "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED",
- "FACE", "FACT", "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL",
- "FAME", "FANG", "FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT",
- "FEED", "FEEL", "FEET", "FELL", "FELT", "FEND", "FERN", "FEST",
- "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE",
- "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE",
- "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW",
- "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM",
- "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL",
- "FOOT", "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL",
- "FOUR", "FOWL", "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY",
- "FROG", "FROM", "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY",
- "FUSE", "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA",
- "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY", "GASH",
- "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE",
- "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT",
- "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN",
- "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD",
- "GOAL", "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG",
- "GOOD", "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB",
- "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN",
- "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH",
- "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR",
- "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG", "HANK",
- "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE",
- "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR",
- "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL",
- "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN",
- "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT",
- "HIRE", "HISS", "HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE",
- "HOLM", "HOLT", "HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK",
- "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL",
- "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK",
- "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE",
- "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH",
- "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE",
- "ITCH", "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE",
- "JAVA", "JEAN", "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL",
- "JILT", "JIVE", "JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN",
- "JOIN", "JOKE", "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY",
- "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST",
- "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE", "KEEL",
- "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL",
- "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW",
- "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD",
- "KURT", "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN",
- "LAIR", "LAKE", "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD",
- "LARK", "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS",
- "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER",
- "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK", "LESS", "LEST",
- "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU",
- "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB",
- "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST",
- "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE",
- "LOIS", "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD",
- "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK",
- "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE",
- "LURK", "LUSH", "LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE",
- "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI",
- "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE", "MARK",
- "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE",
- "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK",
- "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH",
- "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT",
- "MIMI", "MIND", "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS",
- "MIST", "MITE", "MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD",
- "MOLE", "MOLL", "MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON",
- "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH",
- "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK",
- "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL",
- "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR",
- "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS",
- "NEST", "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA",
- "NINE", "NOAH", "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON",
- "NORM", "NOSE", "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB",
- "OATH", "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY",
- "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE",
- "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS",
- "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY",
- "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT",
- "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE",
- "RASH", "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR",
- "RECK", "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA",
- "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE", "RIFT",
- "RILL", "RIME", "RING", "RINK", "RISE", "RISK", "RITE", "ROAD",
- "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME",
- "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS",
- "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY",
- "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE",
- "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE",
- "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE",
- "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR",
- "SCAT", "SCOT", "SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK",
- "SEEM", "SEEN", "SEES", "SELF", "SELL", "SEND", "SENT", "SETS",
- "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN",
- "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE",
- "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE",
- "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW",
- "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY",
- "SLED", "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT",
- "SLOW", "SLUG", "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB",
- "SNOW", "SNUB", "SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA",
- "SOFT", "SOIL", "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE",
- "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR",
- "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN", "SUCH",
- "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF",
- "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM",
- "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK",
- "TASK", "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM",
- "TEEN", "TEET", "TELL", "TEND", "TENT", "TERM", "TERN", "TESS",
- "TEST", "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN",
- "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER",
- "TILE", "TILL", "TILT", "TIME", "TINA", "TINE", "TINT", "TINY",
- "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG",
- "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR",
- "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG",
- "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE",
- "TUCK", "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK",
- "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER",
- "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST",
- "VEAL", "VEDA", "VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY",
- "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE",
- "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK",
- "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM",
- "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY",
- "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR",
- "WELD", "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM",
- "WHAT", "WHEE", "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE",
- "WILD", "WILL", "WIND", "WINE", "WING", "WINK", "WINO", "WIRE",
- "WISE", "WISH", "WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD",
- "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE",
- "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR",
- "YELL", "YOGA", "YOKE" ]
-
-if __name__=='__main__':
- data = [('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'),
- ('CCAC2AED591056BE4F90FD441C534766',
- 'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'),
- ('EFF81F9BFBC65350920CDD7416DE8009',
- 'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL')
- ]
-
- for key, words in data:
- print('Trying key', key)
- key=binascii.a2b_hex(key)
- w2=key_to_english(key)
- if w2!=words:
- print('key_to_english fails on key', repr(key), ', producing', str(w2))
- k2=english_to_key(words)
- if k2!=key:
- print('english_to_key fails on key', repr(key), ', producing', repr(k2))
-
-
diff --git a/frozen_deps/Crypto/Util/__init__.py b/frozen_deps/Crypto/Util/__init__.py
deleted file mode 100644
index a3bef8a..0000000
--- a/frozen_deps/Crypto/Util/__init__.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Miscellaneous modules
-
-Contains useful modules that don't belong into any of the
-other Crypto.* subpackages.
-
-Crypto.Util.number Number-theoretic functions (primality testing, etc.)
-Crypto.Util.randpool Random number generation
-Crypto.Util.RFC1751 Converts between 128-bit keys and human-readable
- strings of words.
-Crypto.Util.asn1 Minimal support for ASN.1 DER encoding
-
-"""
-
-__all__ = ['randpool', 'RFC1751', 'number', 'strxor', 'asn1' ]
-
-__revision__ = "$Id$"
-
diff --git a/frozen_deps/Crypto/Util/_counter.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Util/_counter.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 77cd132..0000000
--- a/frozen_deps/Crypto/Util/_counter.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Util/_number_new.py b/frozen_deps/Crypto/Util/_number_new.py
deleted file mode 100644
index 5f29176..0000000
--- a/frozen_deps/Crypto/Util/_number_new.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*- coding: ascii -*-
-#
-# Util/_number_new.py : utility functions
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-## NOTE: Do not import this module directly. Import these functions from Crypto.Util.number.
-
-__revision__ = "$Id$"
-__all__ = ['ceil_shift', 'ceil_div', 'floor_div', 'exact_log2', 'exact_div']
-
-import sys
-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
- from Crypto.Util.py21compat import *
-
-def ceil_shift(n, b):
- """Return ceil(n / 2**b) without performing any floating-point or division operations.
-
- This is done by right-shifting n by b bits and incrementing the result by 1
- if any '1' bits were shifted out.
- """
- if not isinstance(n, int) or not isinstance(b, int):
- raise TypeError("unsupported operand type(s): %r and %r" % (type(n).__name__, type(b).__name__))
-
- assert n >= 0 and b >= 0 # I haven't tested or even thought about negative values
- mask = (1 << b) - 1
- if n & mask:
- return (n >> b) + 1
- else:
- return n >> b
-
-def ceil_div(a, b):
- """Return ceil(a / b) without performing any floating-point operations."""
-
- if not isinstance(a, int) or not isinstance(b, int):
- raise TypeError("unsupported operand type(s): %r and %r" % (type(a).__name__, type(b).__name__))
-
- (q, r) = divmod(a, b)
- if r:
- return q + 1
- else:
- return q
-
-def floor_div(a, b):
- if not isinstance(a, int) or not isinstance(b, int):
- raise TypeError("unsupported operand type(s): %r and %r" % (type(a).__name__, type(b).__name__))
-
- (q, r) = divmod(a, b)
- return q
-
-def exact_log2(num):
- """Find and return an integer i >= 0 such that num == 2**i.
-
- If no such integer exists, this function raises ValueError.
- """
-
- if not isinstance(num, int):
- raise TypeError("unsupported operand type: %r" % (type(num).__name__,))
-
- n = int(num)
- if n <= 0:
- raise ValueError("cannot compute logarithm of non-positive number")
-
- i = 0
- while n != 0:
- if (n & 1) and n != 1:
- raise ValueError("No solution could be found")
- i += 1
- n >>= 1
- i -= 1
-
- assert num == (1 << i)
- return i
-
-def exact_div(p, d, allow_divzero=False):
- """Find and return an integer n such that p == n * d
-
- If no such integer exists, this function raises ValueError.
-
- Both operands must be integers.
-
- If the second operand is zero, this function will raise ZeroDivisionError
- unless allow_divzero is true (default: False).
- """
-
- if not isinstance(p, int) or not isinstance(d, int):
- raise TypeError("unsupported operand type(s): %r and %r" % (type(p).__name__, type(d).__name__))
-
- if d == 0 and allow_divzero:
- n = 0
- if p != n * d:
- raise ValueError("No solution could be found")
- else:
- (n, r) = divmod(p, d)
- if r != 0:
- raise ValueError("No solution could be found")
-
- assert p == n * d
- return n
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Util/asn1.py b/frozen_deps/Crypto/Util/asn1.py
deleted file mode 100644
index 9a97d97..0000000
--- a/frozen_deps/Crypto/Util/asn1.py
+++ /dev/null
@@ -1,286 +0,0 @@
-# -*- coding: ascii -*-
-#
-# Util/asn1.py : Minimal support for ASN.1 DER binary encoding.
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-from Crypto.Util.number import long_to_bytes, bytes_to_long
-import sys
-from Crypto.Util.py3compat import *
-
-__all__ = [ 'DerObject', 'DerInteger', 'DerOctetString', 'DerNull', 'DerSequence', 'DerObjectId' ]
-
-class DerObject:
- """Base class for defining a single DER object.
-
- Instantiate this class ONLY when you have to decode a DER element.
- """
-
- # Known TAG types
- typeTags = { 'SEQUENCE': 0x30, 'BIT STRING': 0x03, 'INTEGER': 0x02,
- 'OCTET STRING': 0x04, 'NULL': 0x05, 'OBJECT IDENTIFIER': 0x06 }
-
- def __init__(self, ASN1Type=None, payload=b('')):
- """Initialize the DER object according to a specific type.
-
- The ASN.1 type is either specified as the ASN.1 string (e.g.
- 'SEQUENCE'), directly with its numerical tag or with no tag
- at all (None)."""
- if isInt(ASN1Type) or ASN1Type is None:
- self.typeTag = ASN1Type
- else:
- if len(ASN1Type)==1:
- self.typeTag = ord(ASN1Type)
- else:
- self.typeTag = self.typeTags.get(ASN1Type)
- self.payload = payload
-
- def isType(self, ASN1Type):
- return self.typeTags[ASN1Type]==self.typeTag
-
- def _lengthOctets(self, payloadLen):
- """Return a byte string that encodes the given payload length (in
- bytes) in a format suitable for a DER length tag (L).
- """
- if payloadLen>127:
- encoding = long_to_bytes(payloadLen)
- return bchr(len(encoding)+128) + encoding
- return bchr(payloadLen)
-
- def encode(self):
- """Return a complete DER element, fully encoded as a TLV."""
- return bchr(self.typeTag) + self._lengthOctets(len(self.payload)) + self.payload
-
- def _decodeLen(self, idx, der):
- """Given a (part of a) DER element, and an index to the first byte of
- a DER length tag (L), return a tuple with the payload size,
- and the index of the first byte of the such payload (V).
-
- Raises a ValueError exception if the DER length is invalid.
- Raises an IndexError exception if the DER element is too short.
- """
- length = bord(der[idx])
- if length<=127:
- return (length,idx+1)
- payloadLength = bytes_to_long(der[idx+1:idx+1+(length & 0x7F)])
- if payloadLength<=127:
- raise ValueError("Not a DER length tag.")
- return (payloadLength, idx+1+(length & 0x7F))
-
- def decode(self, derEle, noLeftOvers=0):
- """Decode a complete DER element, and re-initializes this
- object with it.
-
- @param derEle A complete DER element. It must start with a DER T
- tag.
- @param noLeftOvers Indicate whether it is acceptable to complete the
- parsing of the DER element and find that not all
- bytes in derEle have been used.
- @return Index of the first unused byte in the given DER element.
-
- Raises a ValueError exception in case of parsing errors.
- Raises an IndexError exception if the DER element is too short.
- """
- try:
- self.typeTag = bord(derEle[0])
- if (self.typeTag & 0x1F)==0x1F:
- raise ValueError("Unsupported DER tag")
- (length,idx) = self._decodeLen(1, derEle)
- if noLeftOvers and len(derEle) != (idx+length):
- raise ValueError("Not a DER structure")
- self.payload = derEle[idx:idx+length]
- except IndexError:
- raise ValueError("Not a valid DER SEQUENCE.")
- return idx+length
-
-class DerInteger(DerObject):
- def __init__(self, value = 0):
- """Class to model an INTEGER DER element.
-
- Limitation: only non-negative values are supported.
- """
- DerObject.__init__(self, 'INTEGER')
- self.value = value
-
- def encode(self):
- """Return a complete INTEGER DER element, fully encoded as a TLV."""
- self.payload = long_to_bytes(self.value)
- if bord(self.payload[0])>127:
- self.payload = bchr(0x00) + self.payload
- return DerObject.encode(self)
-
- def decode(self, derEle, noLeftOvers=0):
- """Decode a complete INTEGER DER element, and re-initializes this
- object with it.
-
- @param derEle A complete INTEGER DER element. It must start with a DER
- INTEGER tag.
- @param noLeftOvers Indicate whether it is acceptable to complete the
- parsing of the DER element and find that not all
- bytes in derEle have been used.
- @return Index of the first unused byte in the given DER element.
-
- Raises a ValueError exception if the DER element is not a
- valid non-negative INTEGER.
- Raises an IndexError exception if the DER element is too short.
- """
- tlvLength = DerObject.decode(self, derEle, noLeftOvers)
- if self.typeTag!=self.typeTags['INTEGER']:
- raise ValueError ("Not a DER INTEGER.")
- if bord(self.payload[0])>127:
- raise ValueError ("Negative INTEGER.")
- self.value = bytes_to_long(self.payload)
- return tlvLength
-
-class DerSequence(DerObject):
- """Class to model a SEQUENCE DER element.
-
- This object behave like a dynamic Python sequence.
- Sub-elements that are INTEGERs, look like Python integers.
- Any other sub-element is a binary string encoded as the complete DER
- sub-element (TLV).
- """
-
- def __init__(self, startSeq=None):
- """Initialize the SEQUENCE DER object. Always empty
- initially."""
- DerObject.__init__(self, 'SEQUENCE')
- if startSeq==None:
- self._seq = []
- else:
- self._seq = startSeq
-
- ## A few methods to make it behave like a python sequence
-
- def __delitem__(self, n):
- del self._seq[n]
- def __getitem__(self, n):
- return self._seq[n]
- def __setitem__(self, key, value):
- self._seq[key] = value
- def __setslice__(self,i,j,sequence):
- self._seq[i:j] = sequence
- def __delslice__(self,i,j):
- del self._seq[i:j]
- def __getslice__(self, i, j):
- return self._seq[max(0, i):max(0, j)]
- def __len__(self):
- return len(self._seq)
- def append(self, item):
- return self._seq.append(item)
-
- def hasInts(self):
- """Return the number of items in this sequence that are numbers."""
- return len(list(filter(isInt, self._seq)))
-
- def hasOnlyInts(self):
- """Return True if all items in this sequence are numbers."""
- return self._seq and self.hasInts()==len(self._seq)
-
- def encode(self):
- """Return the DER encoding for the ASN.1 SEQUENCE, containing
- the non-negative integers and longs added to this object.
-
- Limitation: Raises a ValueError exception if it some elements
- in the sequence are neither Python integers nor complete DER INTEGERs.
- """
- self.payload = b('')
- for item in self._seq:
- try:
- self.payload += item
- except:
- try:
- self.payload += DerInteger(item).encode()
- except:
- raise ValueError("Trying to DER encode an unknown object")
- return DerObject.encode(self)
-
- def decode(self, derEle, noLeftOvers=0):
- """Decode a complete SEQUENCE DER element, and re-initializes this
- object with it.
-
- @param derEle A complete SEQUENCE DER element. It must start with a DER
- SEQUENCE tag.
- @param noLeftOvers Indicate whether it is acceptable to complete the
- parsing of the DER element and find that not all
- bytes in derEle have been used.
- @return Index of the first unused byte in the given DER element.
-
- DER INTEGERs are decoded into Python integers. Any other DER
- element is not decoded. Its validity is not checked.
-
- Raises a ValueError exception if the DER element is not a
- valid DER SEQUENCE.
- Raises an IndexError exception if the DER element is too short.
- """
-
- self._seq = []
- try:
- tlvLength = DerObject.decode(self, derEle, noLeftOvers)
- if self.typeTag!=self.typeTags['SEQUENCE']:
- raise ValueError("Not a DER SEQUENCE.")
- # Scan one TLV at once
- idx = 0
- while idx<len(self.payload):
- typeTag = bord(self.payload[idx])
- if typeTag==self.typeTags['INTEGER']:
- newInteger = DerInteger()
- idx += newInteger.decode(self.payload[idx:])
- self._seq.append(newInteger.value)
- else:
- itemLen,itemIdx = self._decodeLen(idx+1,self.payload)
- self._seq.append(self.payload[idx:itemIdx+itemLen])
- idx = itemIdx + itemLen
- except IndexError:
- raise ValueError("Not a valid DER SEQUENCE.")
- return tlvLength
-
-class DerOctetString(DerObject):
- def __init__(self, value = b('')):
- DerObject.__init__(self, 'OCTET STRING')
- self.payload = value
-
- def decode(self, derEle, noLeftOvers=0):
- p = DerObject.decode(derEle, noLeftOvers)
- if not self.isType("OCTET STRING"):
- raise ValueError("Not a valid OCTET STRING.")
- return p
-
-class DerNull(DerObject):
- def __init__(self):
- DerObject.__init__(self, 'NULL')
-
-class DerObjectId(DerObject):
- def __init__(self):
- DerObject.__init__(self, 'OBJECT IDENTIFIER')
-
- def decode(self, derEle, noLeftOvers=0):
- p = DerObject.decode(derEle, noLeftOvers)
- if not self.isType("OBJECT IDENTIFIER"):
- raise ValueError("Not a valid OBJECT IDENTIFIER.")
- return p
-
-def isInt(x):
- test = 0
- try:
- test += x
- except TypeError:
- return 0
- return 1
-
diff --git a/frozen_deps/Crypto/Util/number.py b/frozen_deps/Crypto/Util/number.py
deleted file mode 100644
index 0e1baa0..0000000
--- a/frozen_deps/Crypto/Util/number.py
+++ /dev/null
@@ -1,1456 +0,0 @@
-#
-# number.py : Number-theoretic functions
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew M. Kuchling, Barry A. Warsaw, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-
-__revision__ = "$Id$"
-
-from Crypto.pct_warnings import GetRandomNumber_DeprecationWarning, PowmInsecureWarning
-from warnings import warn as _warn
-import math
-import sys
-from Crypto.Util.py3compat import *
-
-bignum = int
-try:
- from Crypto.PublicKey import _fastmath
-except ImportError:
- # For production, we are going to let import issues due to gmp/mpir shared
- # libraries not loading slide silently and use slowmath. If you'd rather
- # see an exception raised if _fastmath exists but cannot be imported,
- # uncomment the below
- #
- # from distutils.sysconfig import get_config_var
- # import inspect, os
- # _fm_path = os.path.normpath(os.path.dirname(os.path.abspath(
- # inspect.getfile(inspect.currentframe())))
- # +"/../../PublicKey/_fastmath"+get_config_var("SO"))
- # if os.path.exists(_fm_path):
- # raise ImportError("While the _fastmath module exists, importing "+
- # "it failed. This may point to the gmp or mpir shared library "+
- # "not being in the path. _fastmath was found at "+_fm_path)
- _fastmath = None
-
-# You need libgmp v5 or later to get mpz_powm_sec. Warn if it's not available.
-if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
- _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)
-
-# New functions
-from ._number_new import *
-
-# Commented out and replaced with faster versions below
-## def long2str(n):
-## s=''
-## while n>0:
-## s=chr(n & 255)+s
-## n=n>>8
-## return s
-
-## import types
-## def str2long(s):
-## if type(s)!=types.StringType: return s # Integers will be left alone
-## return reduce(lambda x,y : x*256+ord(y), s, 0L)
-
-def size (N):
- """size(N:long) : int
- Returns the size of the number N in bits.
- """
- bits = 0
- while N >> bits:
- bits += 1
- return bits
-
-def getRandomNumber(N, randfunc=None):
- """Deprecated. Use getRandomInteger or getRandomNBitInteger instead."""
- warnings.warn("Crypto.Util.number.getRandomNumber has confusing semantics"+
- "and has been deprecated. Use getRandomInteger or getRandomNBitInteger instead.",
- GetRandomNumber_DeprecationWarning)
- return getRandomNBitInteger(N, randfunc)
-
-def getRandomInteger(N, randfunc=None):
- """getRandomInteger(N:int, randfunc:callable):long
- Return a random number with at most N bits.
-
- If randfunc is omitted, then Random.new().read is used.
-
- This function is for internal use only and may be renamed or removed in
- the future.
- """
- if randfunc is None:
- _import_Random()
- randfunc = Random.new().read
-
- S = randfunc(N>>3)
- odd_bits = N % 8
- if odd_bits != 0:
- char = ord(randfunc(1)) >> (8-odd_bits)
- S = bchr(char) + S
- value = bytes_to_long(S)
- return value
-
-def getRandomRange(a, b, randfunc=None):
- """getRandomRange(a:int, b:int, randfunc:callable):long
- Return a random number n so that a <= n < b.
-
- If randfunc is omitted, then Random.new().read is used.
-
- This function is for internal use only and may be renamed or removed in
- the future.
- """
- range_ = b - a - 1
- bits = size(range_)
- value = getRandomInteger(bits, randfunc)
- while value > range_:
- value = getRandomInteger(bits, randfunc)
- return a + value
-
-def getRandomNBitInteger(N, randfunc=None):
- """getRandomInteger(N:int, randfunc:callable):long
- Return a random number with exactly N-bits, i.e. a random number
- between 2**(N-1) and (2**N)-1.
-
- If randfunc is omitted, then Random.new().read is used.
-
- This function is for internal use only and may be renamed or removed in
- the future.
- """
- value = getRandomInteger (N-1, randfunc)
- value |= 2 ** (N-1) # Ensure high bit is set
- assert size(value) >= N
- return value
-
-def GCD(x,y):
- """GCD(x:long, y:long): long
- Return the GCD of x and y.
- """
- x = abs(x) ; y = abs(y)
- while x > 0:
- x, y = y % x, x
- return y
-
-def inverse(u, v):
- """inverse(u:long, v:long):long
- Return the inverse of u mod v.
- """
- u3, v3 = int(u), int(v)
- u1, v1 = 1, 0
- while v3 > 0:
- q=divmod(u3, v3)[0]
- u1, v1 = v1, u1 - v1*q
- u3, v3 = v3, u3 - v3*q
- while u1<0:
- u1 = u1 + v
- return u1
-
-# Given a number of bits to generate and a random generation function,
-# find a prime number of the appropriate size.
-
-def getPrime(N, randfunc=None):
- """getPrime(N:int, randfunc:callable):long
- Return a random N-bit prime number.
-
- If randfunc is omitted, then Random.new().read is used.
- """
- if randfunc is None:
- _import_Random()
- randfunc = Random.new().read
-
- number=getRandomNBitInteger(N, randfunc) | 1
- while (not isPrime(number, randfunc=randfunc)):
- number=number+2
- return number
-
-
-def _rabinMillerTest(n, rounds, randfunc=None):
- """_rabinMillerTest(n:long, rounds:int, randfunc:callable):int
- Tests if n is prime.
- Returns 0 when n is definitly composite.
- Returns 1 when n is probably prime.
- Returns 2 when n is definitly prime.
-
- If randfunc is omitted, then Random.new().read is used.
-
- This function is for internal use only and may be renamed or removed in
- the future.
- """
- # check special cases (n==2, n even, n < 2)
- if n < 3 or (n & 1) == 0:
- return n == 2
- # n might be very large so it might be beneficial to precalculate n-1
- n_1 = n - 1
- # determine m and b so that 2**b * m = n - 1 and b maximal
- b = 0
- m = n_1
- while (m & 1) == 0:
- b += 1
- m >>= 1
-
- tested = []
- # we need to do at most n-2 rounds.
- for i in range (min (rounds, n-2)):
- # randomly choose a < n and make sure it hasn't been tested yet
- a = getRandomRange (2, n, randfunc)
- while a in tested:
- a = getRandomRange (2, n, randfunc)
- tested.append (a)
- # do the rabin-miller test
- z = pow (a, m, n) # (a**m) % n
- if z == 1 or z == n_1:
- continue
- composite = 1
- for r in range (b):
- z = (z * z) % n
- if z == 1:
- return 0
- elif z == n_1:
- composite = 0
- break
- if composite:
- return 0
- return 1
-
-def getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None):
- """getStrongPrime(N:int, e:int, false_positive_prob:float, randfunc:callable):long
- Return a random strong N-bit prime number.
- In this context p is a strong prime if p-1 and p+1 have at
- least one large prime factor.
- N should be a multiple of 128 and > 512.
-
- If e is provided the returned prime p-1 will be coprime to e
- and thus suitable for RSA where e is the public exponent.
-
- The optional false_positive_prob is the statistical probability
- that true is returned even though it is not (pseudo-prime).
- It defaults to 1e-6 (less than 1:1000000).
- Note that the real probability of a false-positive is far less. This is
- just the mathematically provable limit.
-
- randfunc should take a single int parameter and return that
- many random bytes as a string.
- If randfunc is omitted, then Random.new().read is used.
- """
- # This function was implemented following the
- # instructions found in the paper:
- # "FAST GENERATION OF RANDOM, STRONG RSA PRIMES"
- # by Robert D. Silverman
- # RSA Laboratories
- # May 17, 1997
- # which by the time of writing could be freely downloaded here:
- # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf
-
- # Use the accelerator if available
- if _fastmath is not None:
- return _fastmath.getStrongPrime(int(N), int(e), false_positive_prob,
- randfunc)
-
- if (N < 512) or ((N % 128) != 0):
- raise ValueError ("bits must be multiple of 128 and > 512")
-
- rabin_miller_rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4)))
-
- # calculate range for X
- # lower_bound = sqrt(2) * 2^{511 + 128*x}
- # upper_bound = 2^{512 + 128*x} - 1
- x = (N - 512) >> 7;
- # We need to approximate the sqrt(2) in the lower_bound by an integer
- # expression because floating point math overflows with these numbers
- lower_bound = divmod(14142135623730950489 * (2 ** (511 + 128*x)),
- 10000000000000000000)[0]
- upper_bound = (1 << (512 + 128*x)) - 1
- # Randomly choose X in calculated range
- X = getRandomRange (lower_bound, upper_bound, randfunc)
-
- # generate p1 and p2
- p = [0, 0]
- for i in (0, 1):
- # randomly choose 101-bit y
- y = getRandomNBitInteger (101, randfunc)
- # initialize the field for sieving
- field = [0] * 5 * len (sieve_base)
- # sieve the field
- for prime in sieve_base:
- offset = y % prime
- for j in range ((prime - offset) % prime, len (field), prime):
- field[j] = 1
-
- # look for suitable p[i] starting at y
- result = 0
- for j in range(len(field)):
- composite = field[j]
- # look for next canidate
- if composite:
- continue
- tmp = y + j
- result = _rabinMillerTest (tmp, rabin_miller_rounds)
- if result > 0:
- p[i] = tmp
- break
- if result == 0:
- raise RuntimeError ("Couln't find prime in field. "
- "Developer: Increase field_size")
-
- # Calculate R
- # R = (p2^{-1} mod p1) * p2 - (p1^{-1} mod p2) * p1
- tmp1 = inverse (p[1], p[0]) * p[1] # (p2^-1 mod p1)*p2
- tmp2 = inverse (p[0], p[1]) * p[0] # (p1^-1 mod p2)*p1
- R = tmp1 - tmp2 # (p2^-1 mod p1)*p2 - (p1^-1 mod p2)*p1
-
- # search for final prime number starting by Y0
- # Y0 = X + (R - X mod p1p2)
- increment = p[0] * p[1]
- X = X + (R - (X % increment))
- while 1:
- is_possible_prime = 1
- # first check candidate against sieve_base
- for prime in sieve_base:
- if (X % prime) == 0:
- is_possible_prime = 0
- break
- # if e is given make sure that e and X-1 are coprime
- # this is not necessarily a strong prime criterion but useful when
- # creating them for RSA where the p-1 and q-1 should be coprime to
- # the public exponent e
- if e and is_possible_prime:
- if e & 1:
- if GCD (e, X-1) != 1:
- is_possible_prime = 0
- else:
- if GCD (e, divmod((X-1),2)[0]) != 1:
- is_possible_prime = 0
-
- # do some Rabin-Miller-Tests
- if is_possible_prime:
- result = _rabinMillerTest (X, rabin_miller_rounds)
- if result > 0:
- break
- X += increment
- # abort when X has more bits than requested
- # TODO: maybe we shouldn't abort but rather start over.
- if X >= 1 << N:
- raise RuntimeError ("Couln't find prime in field. "
- "Developer: Increase field_size")
- return X
-
-def isPrime(N, false_positive_prob=1e-6, randfunc=None):
- """isPrime(N:long, false_positive_prob:float, randfunc:callable):bool
- Return true if N is prime.
-
- The optional false_positive_prob is the statistical probability
- that true is returned even though it is not (pseudo-prime).
- It defaults to 1e-6 (less than 1:1000000).
- Note that the real probability of a false-positive is far less. This is
- just the mathematically provable limit.
-
- If randfunc is omitted, then Random.new().read is used.
- """
- if _fastmath is not None:
- return _fastmath.isPrime(int(N), false_positive_prob, randfunc)
-
- if N < 3 or N & 1 == 0:
- return N == 2
- for p in sieve_base:
- if N == p:
- return 1
- if N % p == 0:
- return 0
-
- rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4)))
- return _rabinMillerTest(N, rounds, randfunc)
-
-
-# Improved conversion functions contributed by Barry Warsaw, after
-# careful benchmarking
-
-import struct
-
-def long_to_bytes(n, blocksize=0):
- """long_to_bytes(n:long, blocksize:int) : string
- Convert a long integer to a byte string.
-
- If optional blocksize is given and greater than zero, pad the front of the
- byte string with binary zeros so that the length is a multiple of
- blocksize.
- """
- # after much testing, this algorithm was deemed to be the fastest
- s = b('')
- n = int(n)
- pack = struct.pack
- while n > 0:
- s = pack('>I', n & 0xffffffff) + s
- n = n >> 32
- # strip off leading zeros
- for i in range(len(s)):
- if s[i] != b('\000')[0]:
- break
- else:
- # only happens when n == 0
- s = b('\000')
- i = 0
- s = s[i:]
- # add back some pad bytes. this could be done more efficiently w.r.t. the
- # de-padding being done above, but sigh...
- if blocksize > 0 and len(s) % blocksize:
- s = (blocksize - len(s) % blocksize) * b('\000') + s
- return s
-
-def bytes_to_long(s):
- """bytes_to_long(string) : long
- Convert a byte string to a long integer.
-
- This is (essentially) the inverse of long_to_bytes().
- """
- acc = 0
- unpack = struct.unpack
- length = len(s)
- if length % 4:
- extra = (4 - length % 4)
- s = b('\000') * extra + s
- length = length + extra
- for i in range(0, length, 4):
- acc = (acc << 32) + unpack('>I', s[i:i+4])[0]
- return acc
-
-# For backwards compatibility...
-import warnings
-def long2str(n, blocksize=0):
- warnings.warn("long2str() has been replaced by long_to_bytes()")
- return long_to_bytes(n, blocksize)
-def str2long(s):
- warnings.warn("str2long() has been replaced by bytes_to_long()")
- return bytes_to_long(s)
-
-def _import_Random():
- # This is called in a function instead of at the module level in order to
- # avoid problems with recursive imports
- global Random, StrongRandom
- from Crypto import Random
- from Crypto.Random.random import StrongRandom
-
-
-
-# The first 10000 primes used for checking primality.
-# This should be enough to eliminate most of the odd
-# numbers before needing to do a Rabin-Miller test at all.
-sieve_base = (
- 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
- 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
- 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
- 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
- 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
- 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
- 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
- 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
- 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
- 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
- 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
- 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
- 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
- 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
- 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
- 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
- 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013,
- 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069,
- 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
- 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
- 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291,
- 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373,
- 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
- 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,
- 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583,
- 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657,
- 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
- 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811,
- 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889,
- 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987,
- 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
- 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
- 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213,
- 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
- 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
- 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
- 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531,
- 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617,
- 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
- 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
- 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819,
- 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903,
- 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
- 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
- 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181,
- 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257,
- 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
- 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
- 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
- 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571,
- 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
- 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
- 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
- 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907,
- 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
- 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
- 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139,
- 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231,
- 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
- 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
- 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493,
- 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583,
- 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
- 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751,
- 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831,
- 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937,
- 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003,
- 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
- 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179,
- 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,
- 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387,
- 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
- 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,
- 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639,
- 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693,
- 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
- 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
- 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939,
- 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053,
- 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
- 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221,
- 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301,
- 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367,
- 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
- 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571,
- 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
- 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761,
- 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
- 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917,
- 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997,
- 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
- 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
- 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297,
- 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411,
- 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499,
- 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561,
- 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643,
- 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
- 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
- 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,
- 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017,
- 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111,
- 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219,
- 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291,
- 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387,
- 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501,
- 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597,
- 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677,
- 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741,
- 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
- 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929,
- 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011,
- 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109,
- 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199,
- 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283,
- 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377,
- 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439,
- 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533,
- 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631,
- 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733,
- 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811,
- 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887,
- 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007,
- 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099,
- 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177,
- 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271,
- 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343,
- 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459,
- 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567,
- 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657,
- 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739,
- 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859,
- 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949,
- 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059,
- 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149,
- 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251,
- 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329,
- 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443,
- 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527,
- 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657,
- 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777,
- 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833,
- 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933,
- 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011,
- 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109,
- 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211,
- 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289,
- 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401,
- 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487,
- 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553,
- 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641,
- 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739,
- 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829,
- 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923,
- 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007,
- 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109,
- 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187,
- 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309,
- 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411,
- 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499,
- 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619,
- 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697,
- 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781,
- 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879,
- 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967,
- 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081,
- 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197,
- 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323,
- 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419,
- 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519,
- 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593,
- 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699,
- 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767,
- 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851,
- 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947,
- 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073,
- 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149,
- 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259,
- 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319,
- 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401,
- 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497,
- 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607,
- 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679,
- 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773,
- 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881,
- 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971,
- 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069,
- 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183,
- 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267,
- 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381,
- 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481,
- 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603,
- 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691,
- 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811,
- 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903,
- 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993,
- 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093,
- 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191,
- 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317,
- 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389,
- 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477,
- 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573,
- 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669,
- 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783,
- 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891,
- 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971,
- 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059,
- 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143,
- 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233,
- 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313,
- 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427,
- 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517,
- 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637,
- 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749,
- 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899,
- 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009,
- 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121,
- 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219,
- 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319,
- 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423,
- 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477,
- 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571,
- 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699,
- 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793,
- 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891,
- 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991,
- 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071,
- 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149,
- 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261,
- 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357,
- 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443,
- 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551,
- 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693,
- 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771,
- 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897,
- 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983,
- 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067,
- 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169,
- 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277,
- 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383,
- 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491,
- 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563,
- 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647,
- 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751,
- 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841,
- 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943,
- 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039,
- 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123,
- 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229,
- 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307,
- 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441,
- 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543,
- 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643,
- 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727,
- 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817,
- 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943,
- 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029,
- 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099,
- 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203,
- 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321,
- 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447,
- 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561,
- 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629,
- 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743,
- 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827,
- 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909,
- 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007,
- 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091,
- 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169,
- 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281,
- 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413,
- 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517,
- 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659,
- 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767,
- 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877,
- 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977,
- 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097,
- 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183,
- 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303,
- 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391,
- 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471,
- 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603,
- 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693,
- 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799,
- 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913,
- 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999,
- 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111,
- 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203,
- 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297,
- 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399,
- 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497,
- 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633,
- 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711,
- 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801,
- 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891,
- 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987,
- 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077,
- 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211,
- 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329,
- 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449,
- 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551,
- 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691,
- 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767,
- 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827,
- 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947,
- 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051,
- 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151,
- 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283,
- 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403,
- 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499,
- 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579,
- 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649,
- 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729,
- 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837,
- 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933,
- 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059,
- 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167,
- 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251,
- 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363,
- 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443,
- 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573,
- 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671,
- 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819,
- 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921,
- 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059,
- 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137,
- 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241,
- 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341,
- 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469,
- 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559,
- 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689,
- 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803,
- 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871,
- 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983,
- 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091,
- 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183,
- 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259,
- 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357,
- 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511,
- 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601,
- 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721,
- 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817,
- 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973,
- 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063,
- 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159,
- 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257,
- 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353,
- 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423,
- 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531,
- 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609,
- 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717,
- 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831,
- 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939,
- 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023,
- 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113,
- 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211,
- 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343,
- 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427,
- 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533,
- 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613,
- 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713,
- 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797,
- 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893,
- 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031,
- 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157,
- 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261,
- 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337,
- 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457,
- 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537,
- 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649,
- 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739,
- 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847,
- 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961,
- 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083,
- 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159,
- 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291,
- 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401,
- 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509,
- 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593,
- 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759,
- 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863,
- 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969,
- 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061,
- 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161,
- 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277,
- 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383,
- 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497,
- 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587,
- 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691,
- 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781,
- 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877,
- 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947,
- 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057,
- 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189,
- 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309,
- 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397,
- 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507,
- 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573,
- 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663,
- 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813,
- 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951,
- 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047,
- 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183,
- 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281,
- 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371,
- 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543,
- 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639,
- 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713,
- 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821,
- 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921,
- 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041,
- 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133,
- 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227,
- 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323,
- 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419,
- 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541,
- 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667,
- 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769,
- 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857,
- 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971,
- 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087,
- 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169,
- 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283,
- 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433,
- 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531,
- 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639,
- 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787,
- 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867,
- 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973,
- 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081,
- 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183,
- 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257,
- 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387,
- 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507,
- 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603,
- 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669,
- 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801,
- 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897,
- 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981,
- 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073,
- 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187,
- 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283,
- 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379,
- 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457,
- 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557,
- 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677,
- 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743,
- 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841,
- 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953,
- 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051,
- 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189,
- 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319,
- 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451,
- 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579,
- 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661,
- 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783,
- 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933,
- 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017,
- 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101,
- 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201,
- 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279,
- 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449,
- 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537,
- 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641,
- 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741,
- 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843,
- 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953,
- 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077,
- 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181,
- 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307,
- 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403,
- 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533,
- 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641,
- 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757,
- 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853,
- 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979,
- 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099,
- 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199,
- 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309,
- 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447,
- 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549,
- 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643,
- 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747,
- 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831,
- 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993,
- 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119,
- 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221,
- 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317,
- 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419,
- 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527,
- 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629,
- 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717,
- 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819,
- 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939,
- 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049,
- 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179,
- 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299,
- 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409,
- 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497,
- 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611,
- 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733,
- 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817,
- 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907,
- 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033,
- 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123,
- 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211,
- 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339,
- 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433,
- 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537,
- 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663,
- 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757,
- 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853,
- 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957,
- 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069,
- 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147,
- 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273,
- 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377,
- 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503,
- 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593,
- 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753,
- 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867,
- 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971,
- 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109,
- 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203,
- 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329,
- 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421,
- 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487,
- 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593,
- 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683,
- 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803,
- 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899,
- 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009,
- 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127,
- 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237,
- 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361,
- 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501,
- 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579,
- 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709,
- 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813,
- 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919,
- 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017,
- 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117,
- 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231,
- 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327,
- 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441,
- 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593,
- 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657,
- 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783,
- 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891,
- 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993,
- 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121,
- 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269,
- 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367,
- 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443,
- 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541,
- 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629,
- 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751,
- 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877,
- 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983,
- 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103,
- 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217,
- 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337,
- 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457,
- 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603,
- 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673,
- 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793,
- 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849,
- 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949,
- 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087,
- 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179,
- 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299,
- 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431,
- 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503,
- 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599,
- 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711,
- 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809,
- 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909,
- 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989,
- 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097,
- 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191,
- 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283,
- 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389,
- 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529,
- 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653,
- 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737,
- 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839,
- 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947,
- 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061,
- 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169,
- 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237,
- 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379,
- 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453,
- 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601,
- 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711,
- 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889,
- 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967,
- 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053,
- 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141,
- 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233,
- 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359,
- 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443,
- 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557,
- 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659,
- 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747,
- 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887,
- 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029,
- 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127,
- 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251,
- 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353,
- 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497,
- 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623,
- 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719,
- 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811,
- 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919,
- 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043,
- 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169,
- 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333,
- 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441,
- 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543,
- 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631,
- 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717,
- 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861,
- 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981,
- 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071,
- 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189,
- 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303,
- 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459,
- 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549,
- 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653,
- 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773,
- 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903,
- 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989,
- 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127,
- 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281,
- 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367,
- 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463,
- 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559,
- 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647,
- 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719,
- 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809,
- 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929,
- 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067,
- 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189,
- 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319,
- 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453,
- 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601,
- 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693,
- 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849,
- 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937,
- 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063,
- 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147,
- 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267,
- 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381,
- 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497,
- 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581,
- 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677,
- 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761,
- 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867,
- 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983,
- 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103,
- 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239,
- 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377,
- 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499,
- 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593,
- 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721,
- 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841,
- 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943,
- 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049,
- 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153,
- 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231,
- 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369,
- 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453,
- 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547,
- 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651,
- 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763,
- 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867,
- 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961,
- 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087,
- 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213,
- 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371,
- 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489,
- 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597,
- 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713,
- 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819,
- 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917,
- 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061,
- 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191,
- 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263,
- 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403,
- 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493,
- 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691,
- 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821,
- 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929,
- 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039,
- 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139,
- 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223,
- 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321,
- 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451,
- 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549,
- 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657,
- 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793,
- 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901,
- 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981,
- 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089,
- 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209,
- 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327,
- 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389,
- 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473,
- 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593,
- 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713,
- 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843,
- 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933,
- 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031,
- 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109,
- 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229,
- 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341,
- 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481,
- 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617,
- 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701,
- 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823,
- 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923,
- 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013,
- 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127,
- 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303,
- 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417,
- 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529,
- 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613,
- 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721,
- 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859,
- 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973,
- 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099,
- 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197,
- 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297,
- 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411,
- 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521,
- 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611,
- 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731,
- 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843,
- 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929,
- 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079,
- 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209,
- 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307,
- 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401,
- 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533,
- 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619,
- 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709,
- 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821,
- 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979,
- 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081,
- 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207,
- 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303,
- 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441,
- 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541,
- 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667,
- 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781,
- 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907,
- 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023,
- 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153,
- 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261,
- 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351,
- 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477,
- 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551,
- 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641,
- 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723,
- 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839,
- 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977,
- 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101,
- 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193,
- 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311,
- 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479,
- 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571,
- 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697,
- 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803,
- 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901,
- 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063,
- 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181,
- 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283,
- 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393,
- 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531,
- 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621,
- 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699,
- 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841,
- 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939,
- 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051,
- 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173,
- 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263,
- 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369,
- 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513,
- 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629,
- 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713,
- 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809,
- 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923,
- 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023,
- 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101,
- 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223,
- 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349,
- 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463,
- 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569,
- 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689,
- 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799,
- 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929,
- 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009,
- 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139,
- 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219,
- 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339,
- 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469,
- 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559,
- 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651,
- 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781,
- 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891,
- 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047,
- 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177,
- 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267,
- 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399,
- 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471,
- 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609,
- 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719,
- 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869,
- 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987,
- 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127,
- 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221,
- 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319,
- 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437,
- 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521,
- 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659,
- 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761,
- 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913,
- 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027,
- 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121,
- 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237,
- 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363,
- 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469,
- 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601,
- 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691,
- 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829,
- 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933,
- 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111,
- 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197,
- 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291,
- 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371,
- 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477,
- 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587,
- 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743,
- 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861,
- 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993,
- 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119,
- 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223,
- 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323,
- 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473,
- 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553,
- 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641,
- 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721,
- 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853,
- 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961,
- 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079,
- 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259,
- 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411,
- 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547,
- 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667,
- 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801,
- 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873,
- 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003,
- 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087,
- 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209,
- 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317,
- 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431,
- 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527,
- 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627,
- 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759,
- 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849,
- 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963,
- 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031,
- 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149,
- 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239,
- 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373,
- 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481,
- 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617,
- 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709,
- 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847,
- 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977,
- 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121,
- 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193,
- 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303,
- 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411,
- 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529,
- 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673,
- 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807,
- 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939,
- 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033,
- 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173,
- 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243,
- 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363,
- 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431,
- 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567,
- 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669,
- 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753,
- 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849,
- 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951,
- 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083,
- 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179,
- 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281,
- 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383,
- 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497,
- 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607,
- 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787,
- 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911,
- 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997,
- 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111,
- 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253,
- 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349,
- 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447,
- 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559,
- 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687,
- 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793,
- 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903,
- 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021,
- 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111,
- 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231,
- 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317,
- 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441,
- 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539,
- 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633,
- 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773,
- 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873,
- 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971,
- 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097,
- 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223,
- 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331,
- 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461,
- 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581,
- 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731,
- 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799,
- 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931,
- 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021,
- 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169,
- 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303,
- 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429,
- 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549,
- 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649,
- 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813,
- 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883,
- 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011,
- 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179,
- 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317,
- 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411,
- 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507,
- 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639,
- 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737,
- 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873,
- 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947,
- 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053,
- 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139,
- 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259,
- 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397,
- 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529,
- 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643,
- 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733,
- 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839,
- 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971,
- 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109,
-100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237,
-100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361,
-100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469,
-100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549,
-100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699,
-100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823,
-100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957,
-100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089,
-101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173,
-101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281,
-101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383,
-101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501,
-101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599,
-101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719,
-101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833,
-101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929,
-101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023,
-102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107,
-102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217,
-102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317,
-102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451,
-102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551,
-102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667,
-102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811,
-102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931,
-102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079,
-103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217,
-103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387,
-103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483,
-103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591,
-103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703,
-103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867,
-103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981,
-103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059,
-104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173,
-104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297,
-104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399,
-104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543,
-104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659,
-104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
-)
diff --git a/frozen_deps/Crypto/Util/py3compat.py b/frozen_deps/Crypto/Util/py3compat.py
deleted file mode 100644
index f8367c9..0000000
--- a/frozen_deps/Crypto/Util/py3compat.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Util/py3compat.py : Compatibility code for handling Py3k / Python 2.x
-#
-# Written in 2010 by Thorsten Behrens
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Compatibility code for handling string/bytes changes from Python 2.x to Py3k
-
-In Python 2.x, strings (of type ''str'') contain binary data, including encoded
-Unicode text (e.g. UTF-8). The separate type ''unicode'' holds Unicode text.
-Unicode literals are specified via the u'...' prefix. Indexing or slicing
-either type always produces a string of the same type as the original.
-Data read from a file is always of '''str'' type.
-
-In Python 3.x, strings (type ''str'') may only contain Unicode text. The u'...'
-prefix and the ''unicode'' type are now redundant. A new type (called
-''bytes'') has to be used for binary data (including any particular
-''encoding'' of a string). The b'...' prefix allows one to specify a binary
-literal. Indexing or slicing a string produces another string. Slicing a byte
-string produces another byte string, but the indexing operation produces an
-integer. Data read from a file is of '''str'' type if the file was opened in
-text mode, or of ''bytes'' type otherwise.
-
-Since PyCrypto aims at supporting both Python 2.x and 3.x, the following helper
-functions are used to keep the rest of the library as independent as possible
-from the actual Python version.
-
-In general, the code should always deal with binary strings, and use integers
-instead of 1-byte character strings.
-
-b(s)
- Take a text string literal (with no prefix or with u'...' prefix) and
- make a byte string.
-bchr(c)
- Take an integer and make a 1-character byte string.
-bord(c)
- Take the result of indexing on a byte string and make an integer.
-tobytes(s)
- Take a text string, a byte string, or a sequence of character taken from
- a byte string and make a byte string.
-"""
-
-__revision__ = "$Id$"
-
-import sys
-
-if sys.version_info[0] == 2:
- def b(s):
- return s
- def bchr(s):
- return chr(s)
- def bstr(s):
- return str(s)
- def bord(s):
- return ord(s)
- if sys.version_info[1] == 1:
- def tobytes(s):
- try:
- return s.encode('latin-1')
- except:
- return ''.join(s)
- else:
- def tobytes(s):
- if isinstance(s, str):
- return s.encode("latin-1")
- else:
- return ''.join(s)
-else:
- def b(s):
- return s.encode("latin-1") # utf-8 would cause some side-effects we don't want
- def bchr(s):
- return bytes([s])
- def bstr(s):
- if isinstance(s,str):
- return bytes(s,"latin-1")
- else:
- return bytes(s)
- def bord(s):
- return s
- def tobytes(s):
- if isinstance(s,bytes):
- return s
- else:
- if isinstance(s,str):
- return s.encode("latin-1")
- else:
- return bytes(s)
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/Util/randpool.py b/frozen_deps/Crypto/Util/randpool.py
deleted file mode 100644
index 8b5a0b7..0000000
--- a/frozen_deps/Crypto/Util/randpool.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# randpool.py : Cryptographically strong random number generation
-#
-# Part of the Python Cryptography Toolkit
-#
-# Written by Andrew M. Kuchling, Mark Moraes, and others
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-#
-
-__revision__ = "$Id$"
-
-from Crypto.pct_warnings import RandomPool_DeprecationWarning
-import Crypto.Random
-import warnings
-
-class RandomPool:
- """Deprecated. Use Random.new() instead.
-
- See http://www.pycrypto.org/randpool-broken
- """
- def __init__(self, numbytes = 160, cipher=None, hash=None, file=None):
- warnings.warn("This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken",
- RandomPool_DeprecationWarning)
- self.__rng = Crypto.Random.new()
- self.bytes = numbytes
- self.bits = self.bytes * 8
- self.entropy = self.bits
-
- def get_bytes(self, N):
- return self.__rng.read(N)
-
- def _updateEntropyEstimate(self, nbits):
- self.entropy += nbits
- if self.entropy < 0:
- self.entropy = 0
- elif self.entropy > self.bits:
- self.entropy = self.bits
-
- def _randomize(self, N=0, devname="/dev/urandom"):
- """Dummy _randomize() function"""
- self.__rng.flush()
-
- def randomize(self, N=0):
- """Dummy randomize() function"""
- self.__rng.flush()
-
- def stir(self, s=''):
- """Dummy stir() function"""
- self.__rng.flush()
-
- def stir_n(self, N=3):
- """Dummy stir_n() function"""
- self.__rng.flush()
-
- def add_event(self, s=''):
- """Dummy add_event() function"""
- self.__rng.flush()
-
- def getBytes(self, N):
- """Dummy getBytes() function"""
- return self.get_bytes(N)
-
- def addEvent(self, event, s=""):
- """Dummy addEvent() function"""
- return self.add_event()
diff --git a/frozen_deps/Crypto/Util/strxor.cpython-38-x86_64-linux-gnu.so b/frozen_deps/Crypto/Util/strxor.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 8358023..0000000
--- a/frozen_deps/Crypto/Util/strxor.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Crypto/Util/winrandom.py b/frozen_deps/Crypto/Util/winrandom.py
deleted file mode 100644
index 0242815..0000000
--- a/frozen_deps/Crypto/Util/winrandom.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Util/winrandom.py : Stub for Crypto.Random.OSRNG.winrandom
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-__revision__ = "$Id$"
-
-from Crypto.Random.OSRNG.winrandom import *
-
-# vim:set ts=4 sw=4 sts=4 expandtab:
diff --git a/frozen_deps/Crypto/__init__.py b/frozen_deps/Crypto/__init__.py
deleted file mode 100644
index c27402e..0000000
--- a/frozen_deps/Crypto/__init__.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-"""Python Cryptography Toolkit
-
-A collection of cryptographic modules implementing various algorithms
-and protocols.
-
-Subpackages:
-
-Crypto.Cipher
- Secret-key (AES, DES, ARC4) and public-key encryption (RSA PKCS#1) algorithms
-Crypto.Hash
- Hashing algorithms (MD5, SHA, HMAC)
-Crypto.Protocol
- Cryptographic protocols (Chaffing, all-or-nothing transform, key derivation
- functions). This package does not contain any network protocols.
-Crypto.PublicKey
- Public-key encryption and signature algorithms (RSA, DSA)
-Crypto.Signature
- Public-key signature algorithms (RSA PKCS#1)
-Crypto.Util
- Various useful modules and functions (long-to-string conversion, random number
- generation, number theoretic functions)
-"""
-
-__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util', 'Signature']
-
-__version__ = '2.6.1' # See also below and setup.py
-__revision__ = "$Id$"
-
-# New software should look at this instead of at __version__ above.
-version_info = (2, 6, 1, 'final', 0) # See also above and setup.py
-
diff --git a/frozen_deps/Crypto/pct_warnings.py b/frozen_deps/Crypto/pct_warnings.py
deleted file mode 100644
index 9b4361e..0000000
--- a/frozen_deps/Crypto/pct_warnings.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: ascii -*-
-#
-# pct_warnings.py : PyCrypto warnings file
-#
-# Written in 2008 by Dwayne C. Litzenberger <[email protected]>
-#
-# ===================================================================
-# The contents of this file are dedicated to the public domain. To
-# the extent that dedication to the public domain is not available,
-# everyone is granted a worldwide, perpetual, royalty-free,
-# non-exclusive license to exercise all rights associated with the
-# contents of this file for any purpose whatsoever.
-# No rights are reserved.
-#
-# 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.
-# ===================================================================
-
-#
-# Base classes. All our warnings inherit from one of these in order to allow
-# the user to specifically filter them.
-#
-
-class CryptoWarning(Warning):
- """Base class for PyCrypto warnings"""
-
-class CryptoDeprecationWarning(DeprecationWarning, CryptoWarning):
- """Base PyCrypto DeprecationWarning class"""
-
-class CryptoRuntimeWarning(RuntimeWarning, CryptoWarning):
- """Base PyCrypto RuntimeWarning class"""
-
-#
-# Warnings that we might actually use
-#
-
-class RandomPool_DeprecationWarning(CryptoDeprecationWarning):
- """Issued when Crypto.Util.randpool.RandomPool is instantiated."""
-
-class ClockRewindWarning(CryptoRuntimeWarning):
- """Warning for when the system clock moves backwards."""
-
-class GetRandomNumber_DeprecationWarning(CryptoDeprecationWarning):
- """Issued when Crypto.Util.number.getRandomNumber is invoked."""
-
-class PowmInsecureWarning(CryptoRuntimeWarning):
- """Warning for when _fastmath is built without mpz_powm_sec"""
-
-# By default, we want this warning to be shown every time we compensate for
-# clock rewinding.
-import warnings as _warnings
-_warnings.filterwarnings('always', category=ClockRewindWarning, append=1)
-
-# vim:set ts=4 sw=4 sts=4 expandtab: