@@ -186,6 +186,51 @@ PTF_TEST_CASE(Asn1DecodingTest)
186186 PTF_ASSERT_EQUAL (record->toString (), " OctetString, Length: 2+8, Value: 3006020201f40400" );
187187 }
188188
189+ // UTF8String
190+ {
191+ uint8_t data[30 ];
192+ auto dataLen = pcpp::hexStringToByteArray (" 0c1ae697a5ed959ce0b8aae0a48541cea9d0afd7a9e4bda0f09f8c8d" , data, 30 );
193+ auto record = pcpp::Asn1Record::decode (data, dataLen);
194+
195+ PTF_ASSERT_EQUAL (record->getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
196+ PTF_ASSERT_FALSE (record->isConstructed ());
197+ PTF_ASSERT_EQUAL (record->getUniversalTagType (), pcpp::Asn1UniversalTagType::UTF8String, enumclass);
198+ PTF_ASSERT_EQUAL (record->getTotalLength (), 28 );
199+ PTF_ASSERT_EQUAL (record->getValueLength (), 26 );
200+ PTF_ASSERT_EQUAL (record->castAs <pcpp::Asn1UTF8StringRecord>()->getValue (), " 日한สअAΩЯש你🌍" );
201+ PTF_ASSERT_EQUAL (record->toString (), " UTF8String, Length: 2+26, Value: 日한สअAΩЯש你🌍" );
202+ }
203+
204+ // PrintableString
205+ {
206+ uint8_t data[20 ];
207+ auto dataLen = pcpp::hexStringToByteArray (" 13027573" , data, 20 );
208+ auto record = pcpp::Asn1Record::decode (data, dataLen);
209+
210+ PTF_ASSERT_EQUAL (record->getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
211+ PTF_ASSERT_FALSE (record->isConstructed ());
212+ PTF_ASSERT_EQUAL (record->getUniversalTagType (), pcpp::Asn1UniversalTagType::PrintableString, enumclass);
213+ PTF_ASSERT_EQUAL (record->getTotalLength (), 4 );
214+ PTF_ASSERT_EQUAL (record->getValueLength (), 2 );
215+ PTF_ASSERT_EQUAL (record->castAs <pcpp::Asn1PrintableStringRecord>()->getValue (), " us" );
216+ PTF_ASSERT_EQUAL (record->toString (), " PrintableString, Length: 2+2, Value: us" );
217+ }
218+
219+ // IA5String
220+ {
221+ uint8_t data[20 ];
222+ auto dataLen = pcpp::hexStringToByteArray (" 1609414243313233402324" , data, 20 );
223+ auto record = pcpp::Asn1Record::decode (data, dataLen);
224+
225+ PTF_ASSERT_EQUAL (record->getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
226+ PTF_ASSERT_FALSE (record->isConstructed ());
227+ PTF_ASSERT_EQUAL (record->getUniversalTagType (), pcpp::Asn1UniversalTagType::IA5String, enumclass);
228+ PTF_ASSERT_EQUAL (record->getTotalLength (), 11 );
229+ PTF_ASSERT_EQUAL (record->getValueLength (), 9 );
230+ PTF_ASSERT_EQUAL (record->castAs <pcpp::Asn1IA5StringRecord>()->getValue (), " ABC123@#$" );
231+ PTF_ASSERT_EQUAL (record->toString (), " IA5String, Length: 2+9, Value: ABC123@#$" );
232+ }
233+
189234 // Null
190235 {
191236 uint8_t data[20 ];
@@ -810,6 +855,63 @@ PTF_TEST_CASE(Asn1EncodingTest)
810855 PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
811856 }
812857
858+ // UTF8String
859+ {
860+ pcpp::Asn1UTF8StringRecord record (" 日한สअAΩЯש你🌍" );
861+
862+ PTF_ASSERT_EQUAL (record.getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
863+ PTF_ASSERT_FALSE (record.isConstructed ());
864+ PTF_ASSERT_EQUAL (record.getUniversalTagType (), pcpp::Asn1UniversalTagType::UTF8String, enumclass);
865+ PTF_ASSERT_EQUAL (record.getTotalLength (), 28 );
866+ PTF_ASSERT_EQUAL (record.getValueLength (), 26 );
867+ PTF_ASSERT_EQUAL (record.getValue (), " 日한สअAΩЯש你🌍" );
868+
869+ uint8_t data[30 ];
870+ auto dataLen = pcpp::hexStringToByteArray (" 0c1ae697a5ed959ce0b8aae0a48541cea9d0afd7a9e4bda0f09f8c8d" , data, 30 );
871+
872+ auto encodedValue = record.encode ();
873+ PTF_ASSERT_EQUAL (encodedValue.size (), dataLen);
874+ PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
875+ }
876+
877+ // PrintableString
878+ {
879+ pcpp::Asn1PrintableStringRecord record (" us" );
880+
881+ PTF_ASSERT_EQUAL (record.getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
882+ PTF_ASSERT_FALSE (record.isConstructed ());
883+ PTF_ASSERT_EQUAL (record.getUniversalTagType (), pcpp::Asn1UniversalTagType::PrintableString, enumclass);
884+ PTF_ASSERT_EQUAL (record.getTotalLength (), 4 );
885+ PTF_ASSERT_EQUAL (record.getValueLength (), 2 );
886+ PTF_ASSERT_EQUAL (record.getValue (), " us" );
887+
888+ uint8_t data[20 ];
889+ auto dataLen = pcpp::hexStringToByteArray (" 13027573" , data, 20 );
890+
891+ auto encodedValue = record.encode ();
892+ PTF_ASSERT_EQUAL (encodedValue.size (), dataLen);
893+ PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
894+ }
895+
896+ // IA5String
897+ {
898+ pcpp::Asn1IA5StringRecord record (" ABC123@#$" );
899+
900+ PTF_ASSERT_EQUAL (record.getTagClass (), pcpp::Asn1TagClass::Universal, enumclass);
901+ PTF_ASSERT_FALSE (record.isConstructed ());
902+ PTF_ASSERT_EQUAL (record.getUniversalTagType (), pcpp::Asn1UniversalTagType::IA5String, enumclass);
903+ PTF_ASSERT_EQUAL (record.getTotalLength (), 11 );
904+ PTF_ASSERT_EQUAL (record.getValueLength (), 9 );
905+ PTF_ASSERT_EQUAL (record.getValue (), " ABC123@#$" );
906+
907+ uint8_t data[20 ];
908+ auto dataLen = pcpp::hexStringToByteArray (" 1609414243313233402324" , data, 20 );
909+
910+ auto encodedValue = record.encode ();
911+ PTF_ASSERT_EQUAL (encodedValue.size (), dataLen);
912+ PTF_ASSERT_BUF_COMPARE (encodedValue.data (), data, dataLen)
913+ }
914+
813915 // Boolean - true
814916 {
815917 pcpp::Asn1BooleanRecord record (true );
0 commit comments