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))])
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)
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)