summaryrefslogtreecommitdiffstats
path: root/src/lib/tlslite/utils/compat.py
blob: 7d2d9250d844fc9b4e6c4db872906aa75f665911 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""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

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

    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