1# Author: Trevor Perrin 2# See the LICENSE file for legal information regarding use of this file. 3 4"""Miscellaneous functions to mask Python version differences.""" 5 6import sys 7import os 8import math 9import binascii 10 11if sys.version_info >= (3,0): 12 13 def compat26Str(x): return x 14 15 # Python 3 requires bytes instead of bytearrays for HMAC 16 17 # So, python 2.6 requires strings, python 3 requires 'bytes', 18 # and python 2.7 can handle bytearrays... 19 def compatHMAC(x): return bytes(x) 20 21 def raw_input(s): 22 return input(s) 23 24 # So, the python3 binascii module deals with bytearrays, and python2 25 # deals with strings... I would rather deal with the "a" part as 26 # strings, and the "b" part as bytearrays, regardless of python version, 27 # so... 28 def a2b_hex(s): 29 try: 30 b = bytearray(binascii.a2b_hex(bytearray(s, "ascii"))) 31 except Exception as e: 32 raise SyntaxError("base16 error: %s" % e) 33 return b 34 35 def a2b_base64(s): 36 try: 37 b = bytearray(binascii.a2b_base64(bytearray(s, "ascii"))) 38 except Exception as e: 39 raise SyntaxError("base64 error: %s" % e) 40 return b 41 42 def b2a_hex(b): 43 return binascii.b2a_hex(b).decode("ascii") 44 45 def b2a_base64(b): 46 return binascii.b2a_base64(b).decode("ascii") 47 48 def readStdinBinary(): 49 return sys.stdin.buffer.read() 50 51else: 52 # Python 2.6 requires strings instead of bytearrays in a couple places, 53 # so we define this function so it does the conversion if needed. 54 if sys.version_info < (2,7): 55 def compat26Str(x): return str(x) 56 else: 57 def compat26Str(x): return x 58 59 # So, python 2.6 requires strings, python 3 requires 'bytes', 60 # and python 2.7 can handle bytearrays... 61 def compatHMAC(x): return compat26Str(x) 62 63 def a2b_hex(s): 64 try: 65 b = bytearray(binascii.a2b_hex(s)) 66 except Exception as e: 67 raise SyntaxError("base16 error: %s" % e) 68 return b 69 70 def a2b_base64(s): 71 try: 72 b = bytearray(binascii.a2b_base64(s)) 73 except Exception as e: 74 raise SyntaxError("base64 error: %s" % e) 75 return b 76 77 def b2a_hex(b): 78 return binascii.b2a_hex(compat26Str(b)) 79 80 def b2a_base64(b): 81 return binascii.b2a_base64(compat26Str(b)) 82 83import traceback 84def formatExceptionTrace(e): 85 newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) 86 return newStr 87 88