コード例 #1
0
ファイル: BER.py プロジェクト: kbdancer/libmich
 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)
コード例 #2
0
 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)
コード例 #3
0
ファイル: BER.py プロジェクト: kbdancer/libmich
 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
コード例 #4
0
 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