@@ -544,6 +544,8 @@ def _read_value(self, cls, nr, length):  # type: (int, int, int) -> any
544544            value  =  self ._decode_object_identifier (bytes_data )
545545        elif  nr  in  (Numbers .PrintableString , Numbers .IA5String , Numbers .UTCTime ):
546546            value  =  self ._decode_printable_string (bytes_data )
547+         elif  nr  ==  Numbers .BitString :
548+             value  =  self ._decode_bitstring (bytes_data )
547549        else :
548550            value  =  bytes_data 
549551        return  value 
@@ -647,3 +649,28 @@ def _decode_object_identifier(bytes_data):  # type: (bytes) -> str
647649    def  _decode_printable_string (bytes_data ):  # type: (bytes) -> str 
648650        """Decode a printable string.""" 
649651        return  bytes_data .decode ('utf-8' )
652+ 
653+     @staticmethod  
654+     def  _decode_bitstring (bytes_data ):  # type: (bytes) -> str 
655+         """Decode a bitstring.""" 
656+         if  len (bytes_data ) ==  0 :
657+             raise  Error ('ASN1 syntax error' )
658+ 
659+         num_unused_bits  =  bytes_data [0 ]
660+         if  not  (0  <=  num_unused_bits  <=  7 ):
661+             raise  Error ('ASN1 syntax error' )
662+ 
663+         if  num_unused_bits  ==  0 :
664+             return  bytes_data [1 :]
665+ 
666+         # Shift off unused bits 
667+         remaining  =  bytearray (bytes_data [1 :])
668+         bitmask  =  (1  <<  num_unused_bits ) -  1 
669+         removed_bits  =  0 
670+ 
671+         for  i  in  range (len (remaining )):
672+             byte  =  int (remaining [i ])
673+             remaining [i ] =  (byte  >>  num_unused_bits ) |  (removed_bits  <<  num_unused_bits )
674+             removed_bits  =  byte  &  bitmask 
675+ 
676+         return  bytes (remaining )
0 commit comments