Index: third_party/tlslite/tlslite/utils/compat.py |
diff --git a/third_party/tlslite/tlslite/utils/compat.py b/third_party/tlslite/tlslite/utils/compat.py |
index 7d2d9250d844fc9b4e6c4db872906aa75f665911..db95ac17f4ca0556aae87a1b8f19b2acc44b96be 100644 |
--- a/third_party/tlslite/tlslite/utils/compat.py |
+++ b/third_party/tlslite/tlslite/utils/compat.py |
@@ -1,140 +1,96 @@ |
+# Author: Trevor Perrin |
+# See the LICENSE file for legal information regarding use of this file. |
+ |
"""Miscellaneous functions to mask Python version differences.""" |
import sys |
import os |
- |
-if sys.version_info < (2,2): |
- raise AssertionError("Python 2.2 or later required") |
- |
-if sys.version_info < (2,3): |
- |
- def enumerate(collection): |
- return zip(range(len(collection)), collection) |
- |
- class Set: |
- def __init__(self, seq=None): |
- self.values = {} |
- if seq: |
- for e in seq: |
- self.values[e] = None |
- |
- def add(self, e): |
- self.values[e] = None |
- |
- def discard(self, e): |
- if e in self.values.keys(): |
- del(self.values[e]) |
- |
- def union(self, s): |
- ret = Set() |
- for e in self.values.keys(): |
- ret.values[e] = None |
- for e in s.values.keys(): |
- ret.values[e] = None |
- return ret |
- |
- def issubset(self, other): |
- for e in self.values.keys(): |
- if e not in other.values.keys(): |
- return False |
- return True |
- |
- def __nonzero__( self): |
- return len(self.values.keys()) |
- |
- def __contains__(self, e): |
- return e in self.values.keys() |
- |
- def __iter__(self): |
- return iter(set.values.keys()) |
- |
- |
-if os.name != "java": |
- |
- import array |
- def createByteArraySequence(seq): |
- return array.array('B', seq) |
- def createByteArrayZeros(howMany): |
- return array.array('B', [0] * howMany) |
- def concatArrays(a1, a2): |
- return a1+a2 |
- |
- def bytesToString(bytes): |
- return bytes.tostring() |
- def stringToBytes(s): |
- bytes = createByteArrayZeros(0) |
- bytes.fromstring(s) |
- return bytes |
- |
- import math |
- def numBits(n): |
- if n==0: |
- return 0 |
- s = "%x" % n |
- return ((len(s)-1)*4) + \ |
- {'0':0, '1':1, '2':2, '3':2, |
- '4':3, '5':3, '6':3, '7':3, |
- '8':4, '9':4, 'a':4, 'b':4, |
- 'c':4, 'd':4, 'e':4, 'f':4, |
- }[s[0]] |
- return int(math.floor(math.log(n, 2))+1) |
- |
- BaseException = Exception |
- import sys |
- import traceback |
- def formatExceptionTrace(e): |
- newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) |
- return newStr |
+import math |
+import binascii |
+ |
+if sys.version_info >= (3,0): |
+ |
+ def compat26Str(x): return x |
+ |
+ # Python 3 requires bytes instead of bytearrays for HMAC |
+ |
+ # So, python 2.6 requires strings, python 3 requires 'bytes', |
+ # and python 2.7 can handle bytearrays... |
+ def compatHMAC(x): return bytes(x) |
+ |
+ def raw_input(s): |
+ return input(s) |
+ |
+ # So, the python3 binascii module deals with bytearrays, and python2 |
+ # deals with strings... I would rather deal with the "a" part as |
+ # strings, and the "b" part as bytearrays, regardless of python version, |
+ # so... |
+ def a2b_hex(s): |
+ try: |
+ b = bytearray(binascii.a2b_hex(bytearray(s, "ascii"))) |
+ except Exception as e: |
+ raise SyntaxError("base16 error: %s" % e) |
+ return b |
+ |
+ def a2b_base64(s): |
+ try: |
+ b = bytearray(binascii.a2b_base64(bytearray(s, "ascii"))) |
+ except Exception as e: |
+ raise SyntaxError("base64 error: %s" % e) |
+ return b |
+ |
+ def b2a_hex(b): |
+ return binascii.b2a_hex(b).decode("ascii") |
+ |
+ def b2a_base64(b): |
+ return binascii.b2a_base64(b).decode("ascii") |
+ |
+ def b2a_base32(b): |
+ return base64.b32encode(b).decode("ascii") |
+ |
+ def readStdinBinary(): |
+ return sys.stdin.buffer.read() |
+ |
+ def long(n): |
+ return n |
else: |
- #Jython 2.1 is missing lots of python 2.3 stuff, |
- #which we have to emulate here: |
- #NOTE: JYTHON SUPPORT NO LONGER WORKS, DUE TO USE OF GENERATORS. |
- #THIS CODE IS LEFT IN SO THAT ONE JYTHON UPDATES TO 2.2, IT HAS A |
- #CHANCE OF WORKING AGAIN. |
- |
- import java |
- import jarray |
- |
- def createByteArraySequence(seq): |
- if isinstance(seq, type("")): #If it's a string, convert |
- seq = [ord(c) for c in seq] |
- return jarray.array(seq, 'h') #use short instead of bytes, cause bytes are signed |
- def createByteArrayZeros(howMany): |
- return jarray.zeros(howMany, 'h') #use short instead of bytes, cause bytes are signed |
- def concatArrays(a1, a2): |
- l = list(a1)+list(a2) |
- return createByteArraySequence(l) |
- |
- #WAY TOO SLOW - MUST BE REPLACED------------ |
- def bytesToString(bytes): |
- return "".join([chr(b) for b in bytes]) |
- |
- def stringToBytes(s): |
- bytes = createByteArrayZeros(len(s)) |
- for count, c in enumerate(s): |
- bytes[count] = ord(c) |
- return bytes |
- #WAY TOO SLOW - MUST BE REPLACED------------ |
- |
- def numBits(n): |
- if n==0: |
- return 0 |
- n= 1L * n; #convert to long, if it isn't already |
- return n.__tojava__(java.math.BigInteger).bitLength() |
- |
- #Adjust the string to an array of bytes |
- def stringToJavaByteArray(s): |
- bytes = jarray.zeros(len(s), 'b') |
- for count, c in enumerate(s): |
- x = ord(c) |
- if x >= 128: x -= 256 |
- bytes[count] = x |
- return bytes |
+ # Python 2.6 requires strings instead of bytearrays in a couple places, |
+ # so we define this function so it does the conversion if needed. |
+ if sys.version_info < (2,7): |
+ def compat26Str(x): return str(x) |
+ else: |
+ def compat26Str(x): return x |
+ |
+ # So, python 2.6 requires strings, python 3 requires 'bytes', |
+ # and python 2.7 can handle bytearrays... |
+ def compatHMAC(x): return compat26Str(x) |
+ |
+ def a2b_hex(s): |
+ try: |
+ b = bytearray(binascii.a2b_hex(s)) |
+ except Exception as e: |
+ raise SyntaxError("base16 error: %s" % e) |
+ return b |
+ |
+ def a2b_base64(s): |
+ try: |
+ b = bytearray(binascii.a2b_base64(s)) |
+ except Exception as e: |
+ raise SyntaxError("base64 error: %s" % e) |
+ return b |
+ |
+ def b2a_hex(b): |
+ return binascii.b2a_hex(compat26Str(b)) |
+ |
+ def b2a_base64(b): |
+ return binascii.b2a_base64(compat26Str(b)) |
+ |
+ def b2a_base32(b): |
+ return base64.b32encode(str(b)) |
+ |
+import traceback |
+def formatExceptionTrace(e): |
+ newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) |
+ return newStr |
- BaseException = java.lang.Exception |
- import sys |
- import traceback |
- def formatExceptionTrace(e): |
- newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) |
- return newStr |