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 b2a_base32(b):
49        return base64.b32encode(b).decode("ascii")
50
51    def readStdinBinary():
52        return sys.stdin.buffer.read()
53
54    def long(n):
55        return n
56
57else:
58    # Python 2.6 requires strings instead of bytearrays in a couple places,
59    # so we define this function so it does the conversion if needed.
60    if sys.version_info < (2,7):
61        def compat26Str(x): return str(x)
62    else:
63        def compat26Str(x): return x
64
65    # So, python 2.6 requires strings, python 3 requires 'bytes',
66    # and python 2.7 can handle bytearrays...
67    def compatHMAC(x): return compat26Str(x)
68
69    def a2b_hex(s):
70        try:
71            b = bytearray(binascii.a2b_hex(s))
72        except Exception as e:
73            raise SyntaxError("base16 error: %s" % e)
74        return b
75
76    def a2b_base64(s):
77        try:
78            b = bytearray(binascii.a2b_base64(s))
79        except Exception as e:
80            raise SyntaxError("base64 error: %s" % e)
81        return b
82
83    def b2a_hex(b):
84        return binascii.b2a_hex(compat26Str(b))
85
86    def b2a_base64(b):
87        return binascii.b2a_base64(compat26Str(b))
88
89    def b2a_base32(b):
90        return base64.b32encode(str(b))
91
92import traceback
93def formatExceptionTrace(e):
94    newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
95    return newStr
96
97