VirtualBox

Ignore:
Timestamp:
Jul 3, 2014 7:44:21 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
94710
Message:

Some ASN.1 fixes related to BMP strings. Improved the ASN.1 dumper a little bit.

Location:
trunk/src/VBox/Runtime/common/asn1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/asn1/asn1-dump.cpp

    r51770 r51858  
    101101 * @param   pData               The dump data structure.
    102102 * @param   pAsn1Core           The ASN.1 core object representation.
    103  * @param   pszName             The member name.
    104103 * @param   pszType             The time type name.
    105104 */
    106 static void rtAsn1DumpTime(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszName, const char *pszType)
     105static void rtAsn1DumpTime(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszType)
    107106{
    108107    if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
    109108    {
    110109        PCRTASN1TIME pTime = (PCRTASN1TIME)pAsn1Core;
    111         rtAsn1DumpPrintf(pData, "%-16s %s -- %04u-%02u-%02u %02u:%02u:%02.%09Z\n",
    112                          pszName, pszType,
     110        rtAsn1DumpPrintf(pData, "%s -- %04u-%02u-%02u %02u:%02u:%02.%09Z\n",
     111                         pszType,
    113112                         pTime->Time.i32Year, pTime->Time.u8Month,  pTime->Time.u8MonthDay,
    114113                         pTime->Time.u8Hour, pTime->Time.u8Minute, pTime->Time.u8Second,
     
    116115    }
    117116    else if (pAsn1Core->cb > 0 && pAsn1Core->cb < 32 && pAsn1Core->uData.pch)
    118         rtAsn1DumpPrintf(pData, "%-16s %s '%.*s'\n",
    119                          pszName, pszType, (size_t)pAsn1Core->cb, pAsn1Core->uData.pch);
     117        rtAsn1DumpPrintf(pData, "%s '%.*s'\n", pszType, (size_t)pAsn1Core->cb, pAsn1Core->uData.pch);
    120118    else
    121         rtAsn1DumpPrintf(pData, "%-16s %s -- cb=%u\n", pszName, pszType, pAsn1Core->cb);
     119        rtAsn1DumpPrintf(pData, "%s -- cb=%u\n", pszType, pAsn1Core->cb);
    122120}
    123121
     
    128126 * @param   pData               The dump data structure.
    129127 * @param   pAsn1Core           The ASN.1 core object representation.
    130  * @param   pszName             The member name.
    131128 * @param   pszType             The string type name.
    132129 * @param   uDepth              The current identation level.
    133130 */
    134 static void rtAsn1DumpString(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszName, const char *pszType,
    135                              uint32_t uDepth)
     131static void rtAsn1DumpString(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszType, uint32_t uDepth)
    136132{
    137     rtAsn1DumpPrintf(pData, "%-16s %s", pszName, pszType);
     133    rtAsn1DumpPrintf(pData, "%s", pszType);
    138134
    139135    const char     *pszPostfix  = "'\n";
     
    151147
    152148    if (cch == 0 || !pch)
    153         rtAsn1DumpPrintf(pData, " -- cb=%u\n", pszName, pszType, pAsn1Core->cb);
     149        rtAsn1DumpPrintf(pData, "-- cb=%u\n", pszType, pAsn1Core->cb);
    154150    else
    155151    {
     
    178174                       || (uint8_t)*pch == '\'') )
    179175            {
    180                 rtAsn1DumpPrintf(pData, "\\x%02", *pch);
     176                rtAsn1DumpPrintf(pData, "\\x%02x", *pch);
    181177                cch--;
    182178                pch++;
     
    572568
    573569
     570/**
     571 * Dumps the type and value of an universal ASN.1 type.
     572 *
     573 * @returns True if it opens a child, false if not.
     574 * @param   pData               The dumper data.
     575 * @param   pAsn1Core           The ASN.1 object to dump.
     576 * @param   uDepth              The current depth (for indentation).
     577 */
     578static bool rtAsn1DumpUniversalTypeAndValue(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, uint32_t uDepth)
     579{
     580    const char *pszValuePrefix = "-- value:";
     581    const char *pszDefault = "";
     582    if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
     583    {
     584        pszValuePrefix = "DEFAULT";
     585        pszDefault = "DEFAULT ";
     586    }
     587
     588    bool fOpen = false;
     589    switch (pAsn1Core->uRealTag)
     590    {
     591        case ASN1_TAG_BOOLEAN:
     592            if (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
     593                rtAsn1DumpPrintf(pData, "BOOLEAN %s %RTbool\n", pszValuePrefix, ((PCRTASN1BOOLEAN)pAsn1Core)->fValue);
     594            else if (pAsn1Core->cb == 1 && pAsn1Core->uData.pu8)
     595                rtAsn1DumpPrintf(pData, "BOOLEAN %s %u\n", pszValuePrefix, *pAsn1Core->uData.pu8);
     596            else
     597                rtAsn1DumpPrintf(pData, "BOOLEAN -- cb=%u\n", pAsn1Core->cb);
     598            break;
     599
     600        case ASN1_TAG_INTEGER:
     601            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT) && pAsn1Core->cb <= 8)
     602                rtAsn1DumpPrintf(pData, "INTEGER %s %llu / %#llx\n", pszValuePrefix,
     603                                 ((PCRTASN1INTEGER)pAsn1Core)->uValue, ((PCRTASN1INTEGER)pAsn1Core)->uValue);
     604            else if (pAsn1Core->cb == 0 || pAsn1Core->cb >= 512 || !pAsn1Core->uData.pu8)
     605                rtAsn1DumpPrintf(pData, "INTEGER -- cb=%u\n", pAsn1Core->cb);
     606            else if (pAsn1Core->cb <= 32)
     607                rtAsn1DumpPrintf(pData, "INTEGER %s %.*Rhxs\n", pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
     608            else
     609                rtAsn1DumpPrintf(pData, "INTEGER %s\n%.*Rhxd\n", pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
     610            break;
     611
     612        case ASN1_TAG_BIT_STRING:
     613            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
     614            {
     615                PCRTASN1BITSTRING pBitString = (PCRTASN1BITSTRING)pAsn1Core;
     616                rtAsn1DumpPrintf(pData, "BIT STRING %s-- cb=%u cBits=%#x cMaxBits=%#x",
     617                                 pszDefault, pBitString->Asn1Core.cb, pBitString->cBits, pBitString->cMaxBits);
     618                if (pBitString->cBits <= 64)
     619                    rtAsn1DumpPrintf(pData, " value=%#llx\n", RTAsn1BitString_GetAsUInt64(pBitString));
     620                else
     621                    rtAsn1DumpPrintf(pData, "\n");
     622            }
     623            else
     624                rtAsn1DumpPrintf(pData, "BIT STRING %s-- cb=%u\n", pszDefault, pAsn1Core->cb);
     625            fOpen = pAsn1Core->pOps != NULL;
     626            break;
     627
     628        case ASN1_TAG_OCTET_STRING:
     629            rtAsn1DumpPrintf(pData, "OCTET STRING %s-- cb=%u\n", pszDefault, pAsn1Core->cb);
     630            fOpen = pAsn1Core->pOps != NULL;
     631            break;
     632
     633        case ASN1_TAG_NULL:
     634            rtAsn1DumpPrintf(pData, "NULL\n");
     635            break;
     636
     637        case ASN1_TAG_OID:
     638            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
     639            {
     640                const char *pszObjIdName = rtAsn1DumpLookupObjIdName(((PCRTASN1OBJID)pAsn1Core)->szObjId);
     641                if (pszObjIdName)
     642                    rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s%s ('%s')\n",
     643                                     pszDefault, pszObjIdName, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
     644                else
     645                    rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s'%s'\n", pszDefault, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
     646            }
     647            else
     648                rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s -- cb=%u\n", pszDefault, pAsn1Core->cb);
     649            break;
     650
     651        case ASN1_TAG_OBJECT_DESCRIPTOR:
     652            rtAsn1DumpPrintf(pData, "OBJECT DESCRIPTOR -- cb=%u TODO\n", pAsn1Core->cb);
     653            break;
     654
     655        case ASN1_TAG_EXTERNAL:
     656            rtAsn1DumpPrintf(pData, "EXTERNAL -- cb=%u TODO\n", pAsn1Core->cb);
     657            break;
     658
     659        case ASN1_TAG_REAL:
     660            rtAsn1DumpPrintf(pData, "REAL -- cb=%u TODO\n", pAsn1Core->cb);
     661            break;
     662
     663        case ASN1_TAG_ENUMERATED:
     664            rtAsn1DumpPrintf(pData, "ENUMERATED -- cb=%u TODO\n", pAsn1Core->cb);
     665            break;
     666
     667        case ASN1_TAG_EMBEDDED_PDV:
     668            rtAsn1DumpPrintf(pData, "EMBEDDED PDV -- cb=%u TODO\n", pAsn1Core->cb);
     669            break;
     670
     671        case ASN1_TAG_UTF8_STRING:
     672            rtAsn1DumpString(pData, pAsn1Core, "UTF8 STRING", uDepth);
     673            break;
     674
     675        case ASN1_TAG_RELATIVE_OID:
     676            rtAsn1DumpPrintf(pData, "RELATIVE OBJECT IDENTIFIER -- cb=%u TODO\n", pAsn1Core->cb);
     677            break;
     678
     679        case ASN1_TAG_SEQUENCE:
     680            rtAsn1DumpPrintf(pData, "SEQUENCE -- cb=%u\n", pAsn1Core->cb);
     681            fOpen = true;
     682            break;
     683        case ASN1_TAG_SET:
     684            rtAsn1DumpPrintf(pData, "SET -- cb=%u\n", pAsn1Core->cb);
     685            fOpen = true;
     686            break;
     687
     688        case ASN1_TAG_NUMERIC_STRING:
     689            rtAsn1DumpString(pData, pAsn1Core, "NUMERIC STRING", uDepth);
     690            break;
     691
     692        case ASN1_TAG_PRINTABLE_STRING:
     693            rtAsn1DumpString(pData, pAsn1Core, "PRINTABLE STRING", uDepth);
     694            break;
     695
     696        case ASN1_TAG_T61_STRING:
     697            rtAsn1DumpString(pData, pAsn1Core, "T61 STRING", uDepth);
     698            break;
     699
     700        case ASN1_TAG_VIDEOTEX_STRING:
     701            rtAsn1DumpString(pData, pAsn1Core, "VIDEOTEX STRING", uDepth);
     702            break;
     703
     704        case ASN1_TAG_IA5_STRING:
     705            rtAsn1DumpString(pData, pAsn1Core, "IA5 STRING", uDepth);
     706            break;
     707
     708        case ASN1_TAG_GRAPHIC_STRING:
     709            rtAsn1DumpString(pData, pAsn1Core, "GRAPHIC STRING", uDepth);
     710            break;
     711
     712        case ASN1_TAG_VISIBLE_STRING:
     713            rtAsn1DumpString(pData, pAsn1Core, "VISIBLE STRING", uDepth);
     714            break;
     715
     716        case ASN1_TAG_GENERAL_STRING:
     717            rtAsn1DumpString(pData, pAsn1Core, "GENERAL STRING", uDepth);
     718            break;
     719
     720        case ASN1_TAG_UNIVERSAL_STRING:
     721            rtAsn1DumpString(pData, pAsn1Core, "UNIVERSAL STRING", uDepth);
     722            break;
     723
     724        case ASN1_TAG_BMP_STRING:
     725            rtAsn1DumpString(pData, pAsn1Core, "BMP STRING", uDepth);
     726            break;
     727
     728        case ASN1_TAG_UTC_TIME:
     729            rtAsn1DumpTime(pData, pAsn1Core, "UTC TIME");
     730            break;
     731
     732        case ASN1_TAG_GENERALIZED_TIME:
     733            rtAsn1DumpTime(pData, pAsn1Core, "GENERALIZED TIME");
     734            break;
     735
     736        case ASN1_TAG_CHARACTER_STRING:
     737            rtAsn1DumpPrintf(pData, "CHARACTER STRING -- cb=%u TODO\n", pAsn1Core->cb);
     738            break;
     739
     740        default:
     741            rtAsn1DumpPrintf(pData, "[UNIVERSAL %u]\n", pAsn1Core->uTag);
     742            break;
     743    }
     744    return fOpen;
     745}
     746
     747
    574748/** @callback_method_impl{FNRTASN1ENUMCALLBACK}  */
    575749static DECLCALLBACK(int) rtAsn1DumpEnumCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
     
    579753        return VINF_SUCCESS;
    580754
     755    bool fOpen = false;
    581756    rtAsn1DumpPrintIdent(pData, uDepth);
    582 
    583     const char *pszValuePrefix = "-- value:";
    584     const char *pszDefault = "";
    585     if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
    586     {
    587         pszValuePrefix = "DEFAULT";
    588         pszDefault = "DEFAULT ";
    589     }
    590 
    591     bool fOpen = false;
    592757    switch (pAsn1Core->fClass & ASN1_TAGCLASS_MASK)
    593758    {
    594759        case ASN1_TAGCLASS_UNIVERSAL:
    595             switch (pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT ? pAsn1Core->uRealTag : pAsn1Core->uTag)
    596             {
    597                 case ASN1_TAG_BOOLEAN:
    598                     if (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
    599                         rtAsn1DumpPrintf(pData, "%-16s BOOLEAN %s %RTbool\n",
    600                                          pszName, pszValuePrefix, ((PCRTASN1BOOLEAN)pAsn1Core)->fValue);
    601                     else if (pAsn1Core->cb == 1 && pAsn1Core->uData.pu8)
    602                         rtAsn1DumpPrintf(pData, "%-16s BOOLEAN %s %u\n",
    603                                          pszName, pszValuePrefix, *pAsn1Core->uData.pu8);
    604                     else
    605                         rtAsn1DumpPrintf(pData, "%-16s BOOLEAN -- cb=%u\n", pszName, pAsn1Core->cb);
    606                     break;
    607 
    608                 case ASN1_TAG_INTEGER:
    609                     if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT) && pAsn1Core->cb <= 8)
    610                         rtAsn1DumpPrintf(pData, "%-16s INTEGER %s %llu / %#llx\n", pszName, pszValuePrefix,
    611                                          ((PCRTASN1INTEGER)pAsn1Core)->uValue, ((PCRTASN1INTEGER)pAsn1Core)->uValue);
    612                     else if (pAsn1Core->cb == 0 || pAsn1Core->cb >= 512 || !pAsn1Core->uData.pu8)
    613                         rtAsn1DumpPrintf(pData, "%-16s INTEGER -- cb=%u\n", pszName, pAsn1Core->cb);
    614                     else if (pAsn1Core->cb <= 32)
    615                         rtAsn1DumpPrintf(pData, "%-16s INTEGER %s %.*Rhxs\n",
    616                                          pszName, pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
    617                     else
    618                         rtAsn1DumpPrintf(pData, "%-16s INTEGER %s\n%.*Rhxd\n",
    619                                          pszName, pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
    620                     break;
    621 
    622                 case ASN1_TAG_BIT_STRING:
    623                     if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
    624                     {
    625                         PCRTASN1BITSTRING pBitString = (PCRTASN1BITSTRING)pAsn1Core;
    626                         rtAsn1DumpPrintf(pData, "%-16s BIT STRING %s-- cb=%u cBits=%#x cMaxBits=%#x",
    627                                          pszName, pszDefault, pBitString->Asn1Core.cb, pBitString->cBits, pBitString->cMaxBits);
    628                         if (pBitString->cBits <= 64)
    629                             rtAsn1DumpPrintf(pData, " value=%#llx\n", RTAsn1BitString_GetAsUInt64(pBitString));
    630                         else
    631                             rtAsn1DumpPrintf(pData, "\n");
    632                     }
    633                     else
    634                         rtAsn1DumpPrintf(pData, "%-16s BIT STRING %s-- cb=%u\n", pszName, pszDefault, pAsn1Core->cb);
    635                     fOpen = pAsn1Core->pOps != NULL;
    636                     break;
    637 
    638                 case ASN1_TAG_OCTET_STRING:
    639                     rtAsn1DumpPrintf(pData, "%-16s OCTET STRING %s-- cb=%u\n", pszName, pszDefault, pAsn1Core->cb);
    640                     fOpen = pAsn1Core->pOps != NULL;
    641                     break;
    642 
    643                 case ASN1_TAG_NULL:
    644                     rtAsn1DumpPrintf(pData, "%-16s NULL\n", pszName);
    645                     break;
    646 
    647                 case ASN1_TAG_OID:
    648                     if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
    649                     {
    650                         const char *pszObjIdName = rtAsn1DumpLookupObjIdName(((PCRTASN1OBJID)pAsn1Core)->szObjId);
    651                         if (pszObjIdName)
    652                             rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s%s ('%s')\n",
    653                                              pszName, pszDefault, pszObjIdName, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
    654                         else
    655                             rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s'%s'\n",
    656                                              pszName, pszDefault, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
    657                     }
    658                     else
    659                         rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s -- cb=%u\n",
    660                                          pszName, pszDefault, pAsn1Core->cb);
    661                     break;
    662 
    663                 case ASN1_TAG_OBJECT_DESCRIPTOR:
    664                     rtAsn1DumpPrintf(pData, "%-16s OBJECT DESCRIPTOR -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    665                     break;
    666 
    667                 case ASN1_TAG_EXTERNAL:
    668                     rtAsn1DumpPrintf(pData, "%-16s EXTERNAL -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    669                     break;
    670 
    671                 case ASN1_TAG_REAL:
    672                     rtAsn1DumpPrintf(pData, "%-16s REAL -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    673                     break;
    674 
    675                 case ASN1_TAG_ENUMERATED:
    676                     rtAsn1DumpPrintf(pData, "%-16s ENUMERATED -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    677                     break;
    678 
    679                 case ASN1_TAG_EMBEDDED_PDV:
    680                     rtAsn1DumpPrintf(pData, "%-16s EMBEDDED PDV -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    681                     break;
    682 
    683                 case ASN1_TAG_UTF8_STRING:
    684                     rtAsn1DumpString(pData, pAsn1Core, pszName, "UTF8 STRING", uDepth);
    685                     break;
    686 
    687                 case ASN1_TAG_RELATIVE_OID:
    688                     rtAsn1DumpPrintf(pData, "%-16s RELATIVE OBJECT IDENTIFIER -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    689                     break;
    690 
    691                 case ASN1_TAG_SEQUENCE:
    692                     rtAsn1DumpPrintf(pData, "%-16s SEQUENCE -- cb=%u\n", pszName, pAsn1Core->cb);
    693                     fOpen = true;
    694                     break;
    695                 case ASN1_TAG_SET:
    696                     rtAsn1DumpPrintf(pData, "%-16s SET -- cb=%u\n", pszName, pAsn1Core->cb);
    697                     fOpen = true;
    698                     break;
    699 
    700                 case ASN1_TAG_NUMERIC_STRING:
    701                     rtAsn1DumpString(pData, pAsn1Core, pszName, "NUMERIC STRING", uDepth);
    702                     break;
    703 
    704                 case ASN1_TAG_PRINTABLE_STRING:
    705                     rtAsn1DumpString(pData, pAsn1Core, pszName, "PRINTABLE STRING", uDepth);
    706                     break;
    707 
    708                 case ASN1_TAG_T61_STRING:
    709                     rtAsn1DumpString(pData, pAsn1Core, pszName, "T61 STRING", uDepth);
    710                     break;
    711 
    712                 case ASN1_TAG_VIDEOTEX_STRING:
    713                     rtAsn1DumpString(pData, pAsn1Core, pszName, "VIDEOTEX STRING", uDepth);
    714                     break;
    715 
    716                 case ASN1_TAG_IA5_STRING:
    717                     rtAsn1DumpString(pData, pAsn1Core, pszName, "IA5 STRING", uDepth);
    718                     break;
    719 
    720                 case ASN1_TAG_GRAPHIC_STRING:
    721                     rtAsn1DumpString(pData, pAsn1Core, pszName, "GRAPHIC STRING", uDepth);
    722                     break;
    723 
    724                 case ASN1_TAG_VISIBLE_STRING:
    725                     rtAsn1DumpString(pData, pAsn1Core, pszName, "VISIBLE STRING", uDepth);
    726                     break;
    727 
    728                 case ASN1_TAG_GENERAL_STRING:
    729                     rtAsn1DumpString(pData, pAsn1Core, pszName, "GENERAL STRING", uDepth);
    730                     break;
    731 
    732                 case ASN1_TAG_UNIVERSAL_STRING:
    733                     rtAsn1DumpString(pData, pAsn1Core, pszName, "UNIVERSAL STRING", uDepth);
    734                     break;
    735 
    736                 case ASN1_TAG_BMP_STRING:
    737                     rtAsn1DumpString(pData, pAsn1Core, pszName, "BMP STRING", uDepth);
    738                     break;
    739 
    740                 case ASN1_TAG_UTC_TIME:
    741                     rtAsn1DumpTime(pData, pAsn1Core, pszName, "UTC TIME");
    742                     break;
    743 
    744                 case ASN1_TAG_GENERALIZED_TIME:
    745                     rtAsn1DumpTime(pData, pAsn1Core, pszName, "GENERALIZED TIME");
    746                     break;
    747 
    748                 case ASN1_TAG_CHARACTER_STRING:
    749                     rtAsn1DumpPrintf(pData, "%-16s CHARACTER STRING -- cb=%u TODO\n", pszName, pAsn1Core->cb);
    750                     break;
    751 
    752                 default:
    753                     rtAsn1DumpPrintf(pData, "[UNIVERSAL %u]\n", pAsn1Core->uTag);
    754                     break;
    755             }
    756             break;
     760            rtAsn1DumpPrintf(pData, "%-16s ", pszName);
     761            fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
     762            break;
     763
    757764        case ASN1_TAGCLASS_CONTEXT:
    758             rtAsn1DumpPrintf(pData, "%-16s [%u]\n", pszName, pAsn1Core->uTag);
    759             fOpen = true;
    760             break;
     765            if ((pAsn1Core->fRealClass & ASN1_TAGCLASS_MASK) == ASN1_TAGCLASS_UNIVERSAL)
     766            {
     767                rtAsn1DumpPrintf(pData, "%-16s [%u] ", pszName, pAsn1Core->uTag);
     768                fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
     769            }
     770            else
     771            {
     772                rtAsn1DumpPrintf(pData, "%-16s [%u]\n", pszName, pAsn1Core->uTag);
     773                fOpen = true;
     774            }
     775            break;
     776
    761777        case ASN1_TAGCLASS_APPLICATION:
    762             rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u]\n", pszName, pAsn1Core->uTag);
    763             fOpen = true;
    764             break;
     778            if ((pAsn1Core->fRealClass & ASN1_TAGCLASS_MASK) == ASN1_TAGCLASS_UNIVERSAL)
     779            {
     780                rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u] ", pszName, pAsn1Core->uTag);
     781                fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
     782            }
     783            else
     784            {
     785                rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u]\n", pszName, pAsn1Core->uTag);
     786                fOpen = true;
     787            }
     788            break;
     789
    765790        case ASN1_TAGCLASS_PRIVATE:
    766             rtAsn1DumpPrintf(pData, "%-16s [PRIVATE %u]\n", pszName, pAsn1Core->uTag);
    767             fOpen = true;
     791            if (RTASN1CORE_IS_DUMMY(pAsn1Core))
     792                rtAsn1DumpPrintf(pData, "%-16s DUMMY\n", pszName);
     793            else
     794            {
     795                rtAsn1DumpPrintf(pData, "%-16s [PRIVATE %u]\n", pszName, pAsn1Core->uTag);
     796                fOpen = true;
     797            }
    768798            break;
    769799    }
  • trunk/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp

    r51770 r51858  
    13461346                while (cch > 0)
    13471347                {
    1348                     RTUNICP uc = RT_MAKE_U32_FROM_U8(0, 0, pb[1], pb[0]); /* big endian */
     1348                    RTUNICP uc = RT_MAKE_U32_FROM_U8(pb[1], pb[0], 0, 0); /* big endian */
    13491349                    if (!RTUniCpIsValid(uc))
    13501350                        return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_BMP_STRING_ENCODING,
     
    15441544
    15451545                    case ASN1_TAG_BMP_STRING:
    1546                         rc = RTUtf16ToUtf8Ex(pThis->Asn1Core.uData.pwc, pThis->Asn1Core.cb / sizeof(RTUTF16),
    1547                                              (char **)&pThis->pszUtf8, cch + 1, NULL);
    1548                         AssertReturnStmt(RT_SUCCESS(rc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_3);
     1546                    {
     1547                        char           *pszDst = psz;
     1548                        size_t          cchSrc = pThis->Asn1Core.cb;
     1549                        uint8_t const  *pbSrc  = (uint8_t const *)psz;
     1550                        while (cchSrc > 0)
     1551                        {
     1552                            RTUNICP uc = RT_MAKE_U32_FROM_U8(pbSrc[1], pbSrc[0], 0, 0); /* big endian */
     1553                            AssertReturnStmt(RTUniCpIsValid(uc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_2);
     1554                            pszDst = RTStrPutCp(pszDst, uc);
     1555
     1556                            /* next */
     1557                            pbSrc  += 2;
     1558                            cchSrc -= 2;
     1559                        }
     1560                        Assert((size_t)(pszDst - psz) == cch);
    15491561                        break;
     1562                    }
    15501563
    15511564                    default:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette