Ejemplo n.º 1
0
def _encode_octet(obj: univ.OctetString) -> str:
    """ Encodes a STRING OCTET type
    Args:
        obj: A PyASN1 STRING_OCTET type

    Returns:
        A string containing the encoded binary

    """
    dec_constraint = _extract_value_size_constraint(str(obj.getSubtypeSpec()))
    oct_str = str(obj)
    if dec_constraint == -1:
        # No constraint
        length = len(str(obj))
        len_det = _bit_str_pad(bin(length)[2:], 8, '0')
        return len_det + ''.join([_bit_str_pad(bin(ord(oct_str[x]))[2:], 8, '0')
                                  for x in range(len(oct_str))])
    if dec_constraint[1] == 0:
        return None
    elif dec_constraint[0] == dec_constraint[1]:
        if len(obj) == dec_constraint[0]:
            return ''.join([_bit_str_pad(bin(ord(oct_str[x]))[2:], 8, '0') for x in range(
                len(oct_str))])
        else:
            raise ValueError('[PyASN1PEREncoder][ERROR]: Octet string does not fit the '
                             'constraints - cannot encode [len != const_len]')
    elif len(oct_str) < dec_constraint[0] or len(oct_str) > dec_constraint[1]:
        raise ValueError('[PyASN1PEREncoder][ERROR]: Octet string does not fit the '
                         'constraints - cannot encode ![lb < x < ub]')
    else:
        offset_bitfield_range = len(str(bin(dec_constraint[1]-dec_constraint[0])[2:]))
        len_det = _bit_str_pad(bin(len(oct_str)-dec_constraint[0])[2:], offset_bitfield_range, '0')
        return len_det + ''.join([_bit_str_pad(bin(ord(oct_str[x]))[2:], 8, '0')
                                  for x in range(len(oct_str))])
Ejemplo n.º 2
0
def _decode_octet_string(item: univ.OctetString,
                         data: str) -> Tuple[int, base.Asn1Item]:
    """ Decodes an ASN.1 PER Encoded octet-string object

    Args:
        item: The enumerated base object that defines the encoded data
        data: The PER unaligned encoded binary string

    Returns:
        A tuple containing the PyASN.1 object populated with the decoded data and the
        length of the data processed (used for error checking)

    """
    dec_constraint = _extract_value_size_constraint(str(item.getSubtypeSpec()))

    if dec_constraint == -1:
        # No constraint
        length = int(data[:8], 2)
        decoded_str = ''
        for i in range(0, length):
            decoded_str += chr(int(data[(8 + i * 8):(16 + i * 8)], 2))
        return 8 * (length + 1), item.clone(decoded_str)
    elif dec_constraint[1] == 0:
        return 0, item.clone()
    elif dec_constraint[0] == dec_constraint[1]:
        decoded_str = ''
        for i in range(0, dec_constraint[0]):
            decoded_str += chr(int(data[(8 + i * 8):(16 + i * 8)], 2))
        return 8 * dec_constraint[0], item.clone(decoded_str)
    else:
        offset_bitfield_range = len(
            str(bin(dec_constraint[1] - dec_constraint[0])[2:]))
        length = int(data[:offset_bitfield_range], 2) + dec_constraint[0]
        decoded_str = ''
        for i in range(0, length):
            decoded_str += chr(
                int(
                    data[(offset_bitfield_range +
                          (i * 8)):((offset_bitfield_range + 8) + i * 8)], 2))
        return offset_bitfield_range + (8 * length), item.clone(decoded_str)
Ejemplo n.º 3
0
def _decode_octet_string(item: univ.OctetString, data: str) -> Tuple[int, base.Asn1Item]:
    """ Decodes an ASN.1 PER Encoded octet-string object

    Args:
        item: The enumerated base object that defines the encoded data
        data: The PER unaligned encoded binary string

    Returns:
        A tuple containing the PyASN.1 object populated with the decoded data and the
        length of the data processed (used for error checking)

    """
    dec_constraint = _extract_value_size_constraint(str(item.getSubtypeSpec()))

    if dec_constraint == -1:
        # No constraint
        length = int(data[:8], 2)
        decoded_str = ''
        for i in range(0, length):
            decoded_str += chr(int(data[(8+i*8):(16+i*8)], 2))
        return 8*(length+1), item.clone(decoded_str)
    elif dec_constraint[1] == 0:
        return 0, item.clone()
    elif dec_constraint[0] == dec_constraint[1]:
        decoded_str = ''
        for i in range(0, dec_constraint[0]):
            decoded_str += chr(int(data[(8+i*8):(16+i*8)], 2))
        return 8*dec_constraint[0], item.clone(decoded_str)
    else:
        offset_bitfield_range = len(str(bin(dec_constraint[1]-dec_constraint[0])[2:]))
        length = int(data[:offset_bitfield_range], 2) + dec_constraint[0]
        decoded_str = ''
        for i in range(0, length):
            decoded_str += chr(int(data[(offset_bitfield_range+(i*8)):(
                (offset_bitfield_range+8)+i*8)], 2))
        return offset_bitfield_range+(8*length), item.clone(decoded_str)