def encode_bit_str(self, obj): if isinstance(obj._val, ASN1.ASN1Obj): # obj._val: ASN1Obj, according to CONTAINING constraint V = Layer('V') V.append(Int('pad_len', Pt=0, Type='uint8')) obj._val._encode() V.extend(obj._val._msg) obj._val._msg = None # else: # obj._val: (BE uint value, BE uint bit length) val_len = obj._val[1] // 8 val_ext = obj._val[1] % 8 if val_ext: val_len += 1 V = Layer('V') V.append(Int('pad_len', Pt=(8-val_ext)%8, Type='uint8')) V.append(Bit('val', Pt=obj._val[0], BitLen=obj._val[1], Repr=self._REPR_BIT_STR)) if val_ext > 0: V.append(Bit('pad', Pt=0, BitLen=8-val_ext, Repr=self._REPR_BIT_STR)) # obj._msg = BER_TLV(obj.get_name()) obj._msg.set(V) self.handle_tag_enc(obj)
def encode_bit_str(self, obj): if isinstance(obj._val, ASN1.ASN1Obj): # obj._val: ASN1Obj, according to CONTAINING constraint V = Layer('V') V.append(Int('pad_len', Pt=0, Type='uint8')) obj._val._encode() V.extend(obj._val._msg) obj._val._msg = None # else: # obj._val: (BE uint value, BE uint bit length) val_len = obj._val[1] // 8 val_ext = obj._val[1] % 8 if val_ext: val_len += 1 V = Layer('V') V.append(Int('pad_len', Pt=(8 - val_ext) % 8, Type='uint8')) V.append( Bit('val', Pt=obj._val[0], BitLen=obj._val[1], Repr=self._REPR_BIT_STR)) if val_ext > 0: V.append( Bit('pad', Pt=0, BitLen=8 - val_ext, Repr=self._REPR_BIT_STR)) # obj._msg = BER_TLV(obj.get_name()) obj._msg.set(V) self.handle_tag_enc(obj)
def parse(self, buf=''): self.__init__(self.CallName) self.map(buf) L = len(self) # # parse nested BER_TLV structures within the Value if self[0].PC(): # indefinite form indef = self[1]() == -1 # parsing further internal Value buf = str(self[2]) inner = [] marker = None while buf: tlv = BER_TLV() tlv.parse(buf) buf = buf[len(tlv):] if indef and (tlv[0]() == 0 and tlv[1]() == 0): marker = tlv marker.CallName = '_end_' break else: inner.append(tlv) if inner: self.remove(self[2]) V = Layer('V') V.extend(inner) self.append(V) if marker: self.append(marker) # returns the length parsed return L