def test_skip_constructed(self): buf = '\x30\x06\x02\x01\x01\x02\x01\x02\x02\x01\x03' dec = asn1.Decoder() dec.start(buf) dec.read() tag, val = dec.read() assert val == 3 assert dec.eof()
def test_error_missing_tag_bytes(self): buf = '\x3f' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.peek) buf = '\x3f\x83' dec.start(buf) assert_raises(asn1.Error, dec.peek)
def test_error_stack(self): buf = '\x30\x08\x02\x01\x01\x04\x03foo' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.leave) dec.enter() dec.leave() assert_raises(asn1.Error, dec.leave)
def test_null(self): buf = '\x05\x00' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.Null, asn1.TypePrimitive, asn1.ClassUniversal) tag, val = dec.read() assert val is None
def test_skip_primitive(self): buf = '\x02\x01\x01\x02\x01\x02' dec = asn1.Decoder() dec.start(buf) dec.read() tag, val = dec.read() assert val == 2 assert dec.eof()
def test_long_tag_id(self): buf = '\x3f\x83\xff\x7f\x03\x02\x01\x01' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (0xffff, asn1.TypeConstructed, asn1.ClassUniversal) dec.enter() tag, val = dec.read() assert val == 1
def test_private(self): buf = '\xe1\x03\x02\x01\x01' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (1, asn1.TypeConstructed, asn1.ClassPrivate) dec.enter() tag, val = dec.read() assert val == 1
def test_application(self): buf = '\x61\x03\x02\x01\x01' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (1, asn1.TypeConstructed, asn1.ClassApplication) dec.enter() tag, val = dec.read() assert val == 1
def test_enumerated(self): buf = '\x0a\x01\x01' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.Enumerated, asn1.TypePrimitive, asn1.ClassUniversal) tag, val = dec.read() assert isinstance(val, int) assert val == 1
def test_object_identifier(self): dec = asn1.Decoder() buf = '\x06\x02\x2a\x03' dec.start(buf) tag = dec.peek() assert tag == (asn1.ObjectIdentifier, asn1.TypePrimitive, asn1.ClassUniversal) tag, val = dec.read() assert val == '1.2.3'
def test_octet_string(self): buf = '\x04\x03foo' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.OctetString, asn1.TypePrimitive, asn1.ClassUniversal) tag, val = dec.read() assert isinstance(val, str) assert val == 'foo'
def test_read_multiple(self): buf = '\x02\x01\x01\x02\x01\x02' dec = asn1.Decoder() dec.start(buf) tag, val = dec.read() assert val == 1 tag, val = dec.read() assert val == 2 assert dec.eof()
def test_set_of(self): buf = '\x31\x06\x02\x01\x01\x02\x01\x02' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.Set, asn1.TypeConstructed, asn1.ClassUniversal) dec.enter() tag, val = dec.read() assert val == 1 tag, val = dec.read() assert val == 2
def test_sequence(self): buf = '\x30\x08\x02\x01\x01\x04\x03foo' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.Sequence, asn1.TypeConstructed, asn1.ClassUniversal) dec.enter() tag, val = dec.read() assert val == 1 tag, val = dec.read() assert val == 'foo'
def parse_search_result(self, buffer): """Parse an LDAP search result. This function returns a list of search result. Each entry in the list is a (msgid, dn, attrs) tuple. attrs is a dictionary with LDAP types as keys and a list of attribute values as its values. """ decoder = asn1.Decoder() decoder.start(buffer) messages = [] while True: tag = decoder.peek() if tag is None: break self._check_tag(tag, asn1.Sequence) decoder.enter() # enter LDAPMessage self._check_tag(decoder.peek(), asn1.Integer) msgid = decoder.read()[1] # messageID tag = decoder.peek() self._check_tag(tag, (4, 5), asn1.TypeConstructed, asn1.ClassApplication) if tag[0] == 5: break decoder.enter() # SearchResultEntry self._check_tag(decoder.peek(), asn1.OctetString) dn = decoder.read()[1] # objectName self._check_tag(decoder.peek(), asn1.Sequence) decoder.enter() # enter attributes attrs = {} while True: tag = decoder.peek() if tag is None: break self._check_tag(tag, asn1.Sequence) decoder.enter() # one attribute self._check_tag(decoder.peek(), asn1.OctetString) name = decoder.read()[1] # type self._check_tag(decoder.peek(), asn1.Set) decoder.enter() # vals values = [] while True: tag = decoder.peek() if tag is None: break self._check_tag(tag, asn1.OctetString) values.append(decoder.read()[1]) attrs[name] = values decoder.leave() # leave vals decoder.leave() # leave attribute decoder.leave() # leave attributes messages.append((msgid, dn, attrs)) return messages
def parse_message_header(self, buffer): """Parse an LDAP header and return the tuple (messageid, protocolOp).""" decoder = asn1.Decoder() decoder.start(buffer) self._check_tag(decoder.peek(), asn1.Sequence) decoder.enter() self._check_tag(decoder.peek(), asn1.Integer) msgid = decoder.read()[1] tag = decoder.peek() self._check_tag(tag, None, asn1.TypeConstructed, asn1.ClassApplication) op = tag[0] return (msgid, op)
def test_long_object_identifier(self): dec = asn1.Decoder() buf = '\x06\x03\x8c\x1a\x03' dec.start(buf) tag, val = dec.read() assert val == '39.2.3' buf = '\x06\x02\x4f\x03' dec.start(buf) tag, val = dec.read() assert val == '1.39.3' buf = '\x06\x04\x2a\x92\xa7\x60' dec.start(buf) tag, val = dec.read() assert val == '1.2.300000'
def test_twos_complement_boundaries(self): buf = '\x02\x01\x7f' dec = asn1.Decoder() dec.start(buf) tag, val = dec.read() assert val == 127 buf = '\x02\x02\x00\x80' dec.start(buf) tag, val = dec.read() assert val == 128 buf = '\x02\x01\x80' dec.start(buf) tag, val = dec.read() assert val == -128 buf = '\x02\x02\xff\x7f' dec.start(buf) tag, val = dec.read() assert val == -129
def test_boolean(self): buf = '\x01\x01\xff' dec = asn1.Decoder() dec.start(buf) tag = dec.peek() assert tag == (asn1.Boolean, asn1.TypePrimitive, asn1.ClassUniversal) tag, val = dec.read() assert isinstance(val, int) assert val == True buf = '\x01\x01\x01' dec.start(buf) tag, val = dec.read() assert isinstance(val, int) assert val == True buf = '\x01\x01\x00' dec.start(buf) tag, val = dec.read() assert isinstance(val, int) assert val == False
def test_error_object_identifier_with_too_large_first_component(self): buf = '\x06\x02\x8c\x40' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_non_normalised_object_identifier(self): buf = '\x06\x02\x80\x01' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_non_normalized_negative_integer(self): buf = '\x02\x02\xff\x80' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_missing_value_bytes(self): buf = '\x02\x02\x01' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_too_many_length_bytes(self): buf = '\x04\xff' + '\xff' * 0x7f dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_missing_length_bytes(self): buf = '\x04\x82\xff' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_error_no_length_bytes(self): buf = '\x02' dec = asn1.Decoder() dec.start(buf) assert_raises(asn1.Error, dec.read)
def test_no_input(self): dec = asn1.Decoder() dec.start('') tag = dec.peek() assert tag is None
def test_real_object_identifier(self): dec = asn1.Decoder() buf = '\x06\x0a\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x01' dec.start(buf) tag, val = dec.read() assert val == '1.2.840.113554.1.2.1.1'
def test_error_init(self): dec = asn1.Decoder() assert_raises(asn1.Error, dec.peek) assert_raises(asn1.Error, dec.read) assert_raises(asn1.Error, dec.enter) assert_raises(asn1.Error, dec.leave)
def test_long_tag_length(self): buf = '\x04\x82\xff\xff' + 'x' * 0xffff dec = asn1.Decoder() dec.start(buf) tag, val = dec.read() assert val == 'x' * 0xffff