summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/tlslite/tlslite/utils/asn1parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/tlslite/tlslite/utils/asn1parser.py')
-rw-r--r--chromium/third_party/tlslite/tlslite/utils/asn1parser.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/chromium/third_party/tlslite/tlslite/utils/asn1parser.py b/chromium/third_party/tlslite/tlslite/utils/asn1parser.py
new file mode 100644
index 00000000000..618e8559c9b
--- /dev/null
+++ b/chromium/third_party/tlslite/tlslite/utils/asn1parser.py
@@ -0,0 +1,42 @@
+# Author: Trevor Perrin
+# Patch from Google adding getChildBytes()
+#
+# See the LICENSE file for legal information regarding use of this file.
+
+"""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(object):
+ 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):
+ return ASN1Parser(self.getChildBytes(which))
+
+ def getChildBytes(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 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)