Index: third_party/google-endpoints/Crypto/PublicKey/pubkey.py |
diff --git a/third_party/google-endpoints/Crypto/PublicKey/pubkey.py b/third_party/google-endpoints/Crypto/PublicKey/pubkey.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e44de8fca72ab4010f5644dae548f1c19f318372 |
--- /dev/null |
+++ b/third_party/google-endpoints/Crypto/PublicKey/pubkey.py |
@@ -0,0 +1,240 @@ |
+# |
+# 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 d.has_key(key): d[key]=long(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 d.has_key(key): 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, types.StringType): |
+ plaintext=bytes_to_long(plaintext) ; wasString=1 |
+ if isinstance(K, types.StringType): |
+ 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, types.TupleType): |
+ ciphertext=(ciphertext,) |
+ if isinstance(ciphertext[0], types.StringType): |
+ 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, types.StringType): M=bytes_to_long(M) |
+ if isinstance(K, types.StringType): 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, types.StringType): 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, types.StringType): |
+ M=bytes_to_long(M) ; wasString=1 |
+ if isinstance(B, types.StringType): 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, types.StringType): |
+ M=bytes_to_long(M) ; wasString=1 |
+ if isinstance(B, types.StringType): 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) |