Package tlslite :: Package utils :: Module codec
[hide private]
[frames] | no frames]

Source Code for Module tlslite.utils.codec

  1  # Author: Trevor Perrin 
  2  # See the LICENSE file for legal information regarding use of this file. 
  3   
  4  """Classes for reading/writing binary data (such as TLS records).""" 
  5   
  6  from .compat import * 
  7   
8 -class Writer(object):
9 - def __init__(self):
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
22 - def addFixSeq(self, seq, length):
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
31 - def addVarTupleSeq(self, seq, length, lengthLength):
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
60 -class Parser(object):
61 - def __init__(self, bytes):
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
75 - def getFixBytes(self, lengthBytes):
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
82 - def getVarBytes(self, lengthLength):
83 lengthBytes = self.get(lengthLength) 84 return self.getFixBytes(lengthBytes)
85
86 - def getFixList(self, length, lengthList):
87 l = [0] * lengthList 88 for x in range(lengthList): 89 l[x] = self.get(length) 90 return l
91
92 - def getVarList(self, length, lengthLength):
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
102 - def getVarTupleList(self, elemLength, elemNum, lengthLength):
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
121 - def startLengthCheck(self, lengthLength):
122 self.lengthCheck = self.get(lengthLength) 123 self.indexCheck = self.index
124
125 - def setLengthCheck(self, length):
126 self.lengthCheck = length 127 self.indexCheck = self.index
128
129 - def stopLengthCheck(self):
130 if (self.index - self.indexCheck) != self.lengthCheck: 131 raise SyntaxError()
132
133 - def atLengthCheck(self):
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
141 - def getRemainingLength(self):
142 return len(self.bytes) - self.index
143