@@ -372,6 +372,36 @@ PTF_TEST_CASE(Asn1DecodingTest)
372372 }
373373 }
374374
375+ // BitString with 0 unused bytes
376+ {
377+ uint8_t data[20 ];
378+ auto dataLen = pcpp::hexStringToByteArray (" 030300a3b5" , data, 20 );
379+ auto record = pcpp::Asn1Record::decode (data, dataLen);
380+
381+ PTF_ASSERT_EQUAL (record->getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
382+ PTF_ASSERT_FALSE (record->isConstructed ());
383+ PTF_ASSERT_EQUAL (record->getUniversalTagType (), pcpp::Asn1UniversalTagType::BitString, enumclass);
384+ PTF_ASSERT_EQUAL (record->getTotalLength (), 5 );
385+ PTF_ASSERT_EQUAL (record->getValueLength (), 3 );
386+ PTF_ASSERT_EQUAL (record->castAs <pcpp::Asn1BitStringRecord>()->getValue (), " 1010001110110101" );
387+ PTF_ASSERT_EQUAL (record->toString (), " BitString, Length: 2+3, Value: 1010001110110101" );
388+ }
389+
390+ // BitString with unused bytes
391+ {
392+ uint8_t data[20 ];
393+ auto dataLen = pcpp::hexStringToByteArray (" 030306b2c0" , data, 20 );
394+ auto record = pcpp::Asn1Record::decode (data, dataLen);
395+
396+ PTF_ASSERT_EQUAL (record->getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
397+ PTF_ASSERT_FALSE (record->isConstructed ());
398+ PTF_ASSERT_EQUAL (record->getUniversalTagType (), pcpp::Asn1UniversalTagType::BitString, enumclass);
399+ PTF_ASSERT_EQUAL (record->getTotalLength (), 5 );
400+ PTF_ASSERT_EQUAL (record->getValueLength (), 3 );
401+ PTF_ASSERT_EQUAL (record->castAs <pcpp::Asn1BitStringRecord>()->getValue (), " 1011001011" );
402+ PTF_ASSERT_EQUAL (record->toString (), " BitString, Length: 2+3, Value: 1011001011" );
403+ }
404+
375405 // Sequence
376406 {
377407 uint8_t data[20 ];
@@ -979,6 +1009,35 @@ PTF_TEST_CASE(Asn1EncodingTest)
9791009 " Invalid timezone format. Use 'Z' or '+/-HHMM'." );
9801010 }
9811011
1012+ // BitString with 0 unused bytes
1013+ {
1014+ pcpp::Asn1BitStringRecord record (" 1010001110110101" );
1015+
1016+ uint8_t data[20 ];
1017+ auto dataLen = pcpp::hexStringToByteArray (" 030300a3b5" , data, 20 );
1018+
1019+ auto encodedValue = record.encode ();
1020+ PTF_ASSERT_EQUAL (encodedValue.size (), dataLen);
1021+ PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
1022+ }
1023+
1024+ // BitString with unused bytes
1025+ {
1026+ pcpp::Asn1BitStringRecord record (" 1011001011" );
1027+
1028+ uint8_t data[20 ];
1029+ auto dataLen = pcpp::hexStringToByteArray (" 030306b2c0" , data, 20 );
1030+
1031+ auto encodedValue = record.encode ();
1032+ PTF_ASSERT_EQUAL (encodedValue.size (), dataLen);
1033+ PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
1034+ }
1035+
1036+ // BitString invalid value
1037+ {
1038+ PTF_ASSERT_RAISES (pcpp::Asn1BitStringRecord record (" 0011invalid" ), std::invalid_argument, " Invalid bit string" );
1039+ }
1040+
9821041 // Sequence
9831042 {
9841043 pcpp::Asn1OctetStringRecord octestStringRecord (" abcd" );
0 commit comments