/gdata/tlslite/utils/codec.py

http://radioappz.googlecode.com/ · Python · 94 lines · 76 code · 16 blank · 2 comment · 17 complexity · 77ee994fc41b3367dc7d5dc39c4c6648 MD5 · raw file

  1. """Classes for reading/writing binary data (such as TLS records)."""
  2. from compat import *
  3. class Writer:
  4. def __init__(self, length=0):
  5. #If length is zero, then this is just a "trial run" to determine length
  6. self.index = 0
  7. self.bytes = createByteArrayZeros(length)
  8. def add(self, x, length):
  9. if self.bytes:
  10. newIndex = self.index+length-1
  11. while newIndex >= self.index:
  12. self.bytes[newIndex] = x & 0xFF
  13. x >>= 8
  14. newIndex -= 1
  15. self.index += length
  16. def addFixSeq(self, seq, length):
  17. if self.bytes:
  18. for e in seq:
  19. self.add(e, length)
  20. else:
  21. self.index += len(seq)*length
  22. def addVarSeq(self, seq, length, lengthLength):
  23. if self.bytes:
  24. self.add(len(seq)*length, lengthLength)
  25. for e in seq:
  26. self.add(e, length)
  27. else:
  28. self.index += lengthLength + (len(seq)*length)
  29. class Parser:
  30. def __init__(self, bytes):
  31. self.bytes = bytes
  32. self.index = 0
  33. def get(self, length):
  34. if self.index + length > len(self.bytes):
  35. raise SyntaxError()
  36. x = 0
  37. for count in range(length):
  38. x <<= 8
  39. x |= self.bytes[self.index]
  40. self.index += 1
  41. return x
  42. def getFixBytes(self, lengthBytes):
  43. bytes = self.bytes[self.index : self.index+lengthBytes]
  44. self.index += lengthBytes
  45. return bytes
  46. def getVarBytes(self, lengthLength):
  47. lengthBytes = self.get(lengthLength)
  48. return self.getFixBytes(lengthBytes)
  49. def getFixList(self, length, lengthList):
  50. l = [0] * lengthList
  51. for x in range(lengthList):
  52. l[x] = self.get(length)
  53. return l
  54. def getVarList(self, length, lengthLength):
  55. lengthList = self.get(lengthLength)
  56. if lengthList % length != 0:
  57. raise SyntaxError()
  58. lengthList = int(lengthList/length)
  59. l = [0] * lengthList
  60. for x in range(lengthList):
  61. l[x] = self.get(length)
  62. return l
  63. def startLengthCheck(self, lengthLength):
  64. self.lengthCheck = self.get(lengthLength)
  65. self.indexCheck = self.index
  66. def setLengthCheck(self, length):
  67. self.lengthCheck = length
  68. self.indexCheck = self.index
  69. def stopLengthCheck(self):
  70. if (self.index - self.indexCheck) != self.lengthCheck:
  71. raise SyntaxError()
  72. def atLengthCheck(self):
  73. if (self.index - self.indexCheck) < self.lengthCheck:
  74. return False
  75. elif (self.index - self.indexCheck) == self.lengthCheck:
  76. return True
  77. else:
  78. raise SyntaxError()