1# Copyright (c) 2011 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5"""Helper module for ASN.1/DER encoding.""" 6 7import binascii 8import struct 9 10# Tags as defined by ASN.1. 11INTEGER = 2 12BIT_STRING = 3 13NULL = 5 14OBJECT_IDENTIFIER = 6 15SEQUENCE = 0x30 16 17def Data(tag, data): 18 """Generic type-length-value encoder. 19 20 Args: 21 tag: the tag. 22 data: the data for the given tag. 23 Returns: 24 encoded TLV value. 25 """ 26 if len(data) == 0: 27 return struct.pack(">BB", tag, 0); 28 assert len(data) <= 0xffff; 29 return struct.pack(">BBH", tag, 0x82, len(data)) + data; 30 31def Integer(value): 32 """Encodes an integer. 33 34 Args: 35 value: the long value. 36 Returns: 37 encoded TLV value. 38 """ 39 data = '%x' % value 40 return Data(INTEGER, binascii.unhexlify('00' + '0' * (len(data) % 2) + data)) 41 42def Bitstring(value): 43 """Encodes a bit string. 44 45 Args: 46 value: a string holding the binary data. 47 Returns: 48 encoded TLV value. 49 """ 50 return Data(BIT_STRING, '\x00' + value) 51 52def Sequence(values): 53 """Encodes a sequence of other values. 54 55 Args: 56 values: the list of values, must be strings holding already encoded data. 57 Returns: 58 encoded TLV value. 59 """ 60 return Data(SEQUENCE, ''.join(values)) 61