1
2
3
4 """Classes for reading/writing binary data (such as TLS records)."""
5
6 from .compat import *
7
10 self.bytes = bytearray(0)
11
12 - def add(self, x, length):
13 self.bytes += bytearray(length)
14 newIndex = len(self.bytes) - 1
15 for count in range(length):
16 self.bytes[newIndex] = x & 0xFF
17 x >>= 8
18 newIndex -= 1
19 if x != 0:
20 raise ValueError("Can't represent value in specified length")
21
23 for e in seq:
24 self.add(e, length)
25
26 - def addVarSeq(self, seq, length, lengthLength):
27 self.add(len(seq)*length, lengthLength)
28 for e in seq:
29 self.add(e, length)
30
32 """
33 Add a variable length list of same-sized element tuples.
34
35 Note that all tuples must have the same size.
36
37 Inverse of Parser.getVarTupleList()
38
39 @type seq: enumerable
40 @param seq: list of tuples
41
42 @type length: int
43 @param length: length of single element in tuple
44
45 @type lengthLength: int
46 @param lengthLength: length in bytes of overall length field
47 """
48 if len(seq) == 0:
49 self.add(0, lengthLength)
50 else:
51 tupleSize = len(seq[0])
52 tupleLength = tupleSize*length
53 self.add(len(seq)*tupleLength, lengthLength)
54 for elemTuple in seq:
55 if len(elemTuple) != tupleSize:
56 raise ValueError("Tuples of different sizes")
57 for elem in elemTuple:
58 self.add(elem, length)
59
62 self.bytes = bytes
63 self.index = 0
64
65 - def get(self, length):
66 if self.index + length > len(self.bytes):
67 raise SyntaxError()
68 x = 0
69 for count in range(length):
70 x <<= 8
71 x |= self.bytes[self.index]
72 self.index += 1
73 return x
74
76 if self.index + lengthBytes > len(self.bytes):
77 raise SyntaxError()
78 bytes = self.bytes[self.index : self.index+lengthBytes]
79 self.index += lengthBytes
80 return bytes
81
83 lengthBytes = self.get(lengthLength)
84 return self.getFixBytes(lengthBytes)
85
87 l = [0] * lengthList
88 for x in range(lengthList):
89 l[x] = self.get(length)
90 return l
91
93 lengthList = self.get(lengthLength)
94 if lengthList % length != 0:
95 raise SyntaxError()
96 lengthList = lengthList // length
97 l = [0] * lengthList
98 for x in range(lengthList):
99 l[x] = self.get(length)
100 return l
101
103 """Read a variable length list of same sized tuples
104
105 @param elemLength: length in bytes of single tuple element
106 @param elemNum: number of elements in tuple
107 @param lengthLength: length in bytes of the list length variable
108 """
109 lengthList = self.get(lengthLength)
110 if lengthList % (elemLength * elemNum) != 0:
111 raise SyntaxError()
112 tupleCount = lengthList // (elemLength * elemNum)
113 tupleList = []
114 for _ in range(tupleCount):
115 currentTuple = []
116 for _ in range(elemNum):
117 currentTuple.append(self.get(elemLength))
118 tupleList.append(tuple(currentTuple))
119 return tupleList
120
122 self.lengthCheck = self.get(lengthLength)
123 self.indexCheck = self.index
124
126 self.lengthCheck = length
127 self.indexCheck = self.index
128
130 if (self.index - self.indexCheck) != self.lengthCheck:
131 raise SyntaxError()
132
134 if (self.index - self.indexCheck) < self.lengthCheck:
135 return False
136 elif (self.index - self.indexCheck) == self.lengthCheck:
137 return True
138 else:
139 raise SyntaxError()
140
142 return len(self.bytes) - self.index
143