summaryrefslogtreecommitdiffstats
path: root/src/lib/tlslite/utils/jython_compat.py
blob: 1245183a99c0fa29a15ec55d4b8ecf70358f2c11 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
"""Miscellaneous functions to mask Python/Jython differences."""

import os
import sha

if os.name != "java":
    BaseException = Exception

    from sets import Set
    import array
    import math

    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

    def numBits(n):
        if n==0:
            return 0
        return int(math.floor(math.log(n, 2))+1)

    class CertChainBase: pass
    class SelfTestBase: pass
    class ReportFuncBase: pass

    #Helper functions for working with sets (from Python 2.3)
    def iterSet(set):
        return iter(set)

    def getListFromSet(set):
        return list(set)

    #Factory function for getting a SHA1 object
    def getSHA1(s):
        return sha.sha(s)

    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:
    import java
    import jarray

    BaseException = java.lang.Exception

    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()

    #This properly creates static methods for Jython
    class staticmethod:
        def __init__(self, anycallable): self.__call__ = anycallable

    #Properties are not supported for Jython
    class property:
        def __init__(self, anycallable): pass

    #True and False have to be specially defined
    False = 0
    True = 1

    class StopIteration(Exception): pass

    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 iterSet(set):
        return set.values.keys()

    def getListFromSet(set):
        return set.values.keys()

    """
    class JCE_SHA1:
        def __init__(self, s=None):
            self.md = java.security.MessageDigest.getInstance("SHA1")
            if s:
                self.update(s)

        def update(self, s):
            self.md.update(s)

        def copy(self):
            sha1 = JCE_SHA1()
            sha1.md = self.md.clone()
            return sha1

        def digest(self):
            digest = self.md.digest()
            bytes = jarray.zeros(20, 'h')
            for count in xrange(20):
                x = digest[count]
                if x < 0: x += 256
                bytes[count] = x
            return bytes
    """

    #Factory function for getting a SHA1 object
    #The JCE_SHA1 class is way too slow...
    #the sha.sha object we use instead is broken in the jython 2.1
    #release, and needs to be patched
    def getSHA1(s):
        #return JCE_SHA1(s)
        return sha.sha(s)


    #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

    import sys
    import traceback

    def formatExceptionTrace(e):
        newStr = "".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
        return newStr