summaryrefslogtreecommitdiffstats
path: root/src/lib/tlslite/utils/ASN1Parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/tlslite/utils/ASN1Parser.py')
-rwxr-xr-xsrc/lib/tlslite/utils/ASN1Parser.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/lib/tlslite/utils/ASN1Parser.py b/src/lib/tlslite/utils/ASN1Parser.py
new file mode 100755
index 000000000..16b50f29c
--- /dev/null
+++ b/src/lib/tlslite/utils/ASN1Parser.py
@@ -0,0 +1,34 @@
+"""Class for parsing ASN.1"""
+from compat import *
+from codec import *
+
+#Takes a byte array which has a DER TLV field at its head
+class ASN1Parser:
+ def __init__(self, bytes):
+ p = Parser(bytes)
+ p.get(1) #skip Type
+
+ #Get Length
+ self.length = self._getASN1Length(p)
+
+ #Get Value
+ self.value = p.getFixBytes(self.length)
+
+ #Assuming this is a sequence...
+ def getChild(self, which):
+ p = Parser(self.value)
+ for x in range(which+1):
+ markIndex = p.index
+ p.get(1) #skip Type
+ length = self._getASN1Length(p)
+ p.getFixBytes(length)
+ return ASN1Parser(p.bytes[markIndex : p.index])
+
+ #Decode the ASN.1 DER length field
+ def _getASN1Length(self, p):
+ firstLength = p.get(1)
+ if firstLength<=127:
+ return firstLength
+ else:
+ lengthLength = firstLength & 0x7F
+ return p.get(lengthLength)