VirtualBox

Changeset 74657 in vbox for trunk


Ignore:
Timestamp:
Oct 7, 2018 7:23:14 PM (6 years ago)
Author:
vboxsync
Message:

IPRT/asn1: Working on parsing Mach-O code signing structures... bugref:9232

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asn1.h

    r74295 r74657  
    595595 * frequently used values. */
    596596#define RTASN1CORE_F_DECODED_CONTENT    RT_BIT_32(6)
     597/** Indefinite length, still pending. */
     598#define RTASN1CORE_F_INDEFINITE_LENGTH  RT_BIT_32(7)
    597599/** @} */
    598600
     
    16471649    /** The cursor depth. */
    16481650    uint8_t                     cDepth;
     1651    /** Number of pending indefinite length records. */
     1652    uint8_t                     cIndefinedRecs;
    16491653    /** Two bytes reserved for future tricks. */
    1650     uint8_t                     abReserved[2];
     1654    uint8_t                     abReserved[1];
    16511655    /** Pointer to the primary cursor. */
    16521656    struct RTASN1CURSORPRIMARY *pPrimary;
     
    16601664 * @{ */
    16611665/** Enforce DER rules. */
    1662 #define RTASN1CURSOR_FLAGS_DER      RT_BIT(1)
     1666#define RTASN1CURSOR_FLAGS_DER                  RT_BIT(1)
    16631667/** Enforce CER rules. */
    1664 #define RTASN1CURSOR_FLAGS_CER      RT_BIT(2)
     1668#define RTASN1CURSOR_FLAGS_CER                  RT_BIT(2)
     1669/** Pending indefinite length encoding. */
     1670#define RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH    RT_BIT(3)
    16651671/** @} */
    16661672
  • trunk/src/VBox/Runtime/common/asn1/asn1-cursor.cpp

    r74656 r74657  
    3232#include <iprt/asn1.h>
    3333
     34#include <iprt/asm.h>
    3435#include <iprt/alloca.h>
    3536#include <iprt/err.h>
     
    6768    pPrimaryCursor->Cursor.fFlags           = (uint8_t)fFlags; Assert(fFlags <= UINT8_MAX);
    6869    pPrimaryCursor->Cursor.cDepth           = 0;
     70    pPrimaryCursor->Cursor.cIndefinedRecs   = 0;
    6971    pPrimaryCursor->Cursor.abReserved[0]    = 0;
    70     pPrimaryCursor->Cursor.abReserved[1]    = 0;
    7172    pPrimaryCursor->Cursor.pPrimary         = pPrimaryCursor;
    7273    pPrimaryCursor->Cursor.pUp              = NULL;
     
    8586    pChild->pbCur           = pParent->pbCur;
    8687    pChild->cbLeft          = cb;
    87     pChild->fFlags          = pParent->fFlags;
     88    pChild->fFlags          = pParent->fFlags & ~RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH;
    8889    pChild->cDepth          = pParent->cDepth + 1;
    8990    AssertReturn(pChild->cDepth < RTASN1_MAX_NESTING, VERR_ASN1_TOO_DEEPLY_NESTED);
     91    pChild->cIndefinedRecs  = 0;
    9092    pChild->abReserved[0]   = 0;
    91     pChild->abReserved[1]   = 0;
    9293    pChild->pPrimary        = pParent->pPrimary;
    9394    pChild->pUp             = pParent;
     
    110111    pChild->pbCur           = pAsn1Core->uData.pu8;
    111112    pChild->cbLeft          = pAsn1Core->cb;
    112     pChild->fFlags          = pParent->fFlags;
     113    pChild->fFlags          = pParent->fFlags & ~RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH;
    113114    pChild->cDepth          = pParent->cDepth + 1;
    114115    AssertReturn(pChild->cDepth < RTASN1_MAX_NESTING, VERR_ASN1_TOO_DEEPLY_NESTED);
     116    pChild->cIndefinedRecs  = 0;
    115117    pChild->abReserved[0]   = 0;
    116     pChild->abReserved[1]   = 0;
    117118    pChild->pPrimary        = pParent->pPrimary;
    118119    pChild->pUp             = pParent;
     
    189190RTDECL(bool) RTAsn1CursorIsEnd(PRTASN1CURSOR pCursor)
    190191{
    191     return pCursor->cbLeft == 0;
     192    if (pCursor->cbLeft == 0)
     193        return true;
     194    if (!(pCursor->fFlags & RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH))
     195        return false;
     196    /* This isn't quite right. */
     197    if (pCursor->cbLeft > pCursor->cIndefinedRecs * (uint32_t)2)
     198        return false;
     199    return ASMMemIsZero(pCursor->pbCur, pCursor->cbLeft);
    192200}
    193201
     
    196204{
    197205    if (pCursor->cbLeft == 0)
     206        return VINF_SUCCESS;
     207    if (   (pCursor->fFlags & RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH)
     208        && pCursor->cbLeft == pCursor->cIndefinedRecs * (uint32_t)2
     209        && ASMMemIsZero(pCursor->pbCur, pCursor->cbLeft))
    198210        return VINF_SUCCESS;
    199211    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_NOT_AT_END,
     
    316328                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_INDEFINITE_LENGTH,
    317329                                           "%s: Indefinite length form not allowed in DER mode (uTag=%#x).", pszErrorTag, uTag);
     330            else if (!(uTag & ASN1_TAGFLAG_CONSTRUCTED))
     331                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_INDEFINITE_LENGTH,
     332                                           "%s: Indefinite BER/CER encoding is for non-constructed tag (uTag=%#x)", pszErrorTag, uTag);
     333            else if (   uTag != (ASN1_TAG_SEQUENCE | ASN1_TAGFLAG_CONSTRUCTED)
     334                     && uTag != (ASN1_TAG_SET      | ASN1_TAGFLAG_CONSTRUCTED)
     335                     &&    (uTag & (ASN1_TAGFLAG_CONSTRUCTED | ASN1_TAGCLASS_CONTEXT))
     336                        !=         (ASN1_TAGFLAG_CONSTRUCTED | ASN1_TAGCLASS_CONTEXT) )
     337                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_INDEFINITE_LENGTH,
     338                                           "%s: Indefinite BER/CER encoding not supported for this tag (uTag=%#x)", pszErrorTag, uTag);
     339            else if (pCursor->cIndefinedRecs > 8)
     340                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_INDEFINITE_LENGTH,
     341                                           "%s: Too many indefinite BER/CER encodings. (uTag=%#x)", pszErrorTag, uTag);
    318342            else if (pCursor->cbLeft < 2)
    319343                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_INDEFINITE_LENGTH,
     
    321345            else
    322346            {
    323                 /* Search forward till we find the two terminating zero bytes. */
    324                 cb = 0;
    325                 for (;;)
    326                 {
    327                     uint8_t const *pb = (uint8_t const *)memchr(&pCursor->pbCur[cb], 0x00, pCursor->cbLeft - cb - 1);
    328                     if (pb && pb[1] == 0x00)
    329                     {
    330                         cb = &pb[2] - pCursor->pbCur;
    331                         break;
    332                     }
    333                     if (!pb)
    334                         return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_INDEFINITE_LENGTH,
    335                                                    "%s: Could not find end of indefinite BER/CER record (uTag=%#x)", pszErrorTag, uTag);
    336                     cb = &pb[1] - pCursor->pbCur;
    337                 }
     347                pCursor->cIndefinedRecs++;
     348                pCursor->fFlags   |= RTASN1CURSOR_FLAGS_INDEFINITE_LENGTH;
     349                pAsn1Core->fFlags |= RTASN1CORE_F_INDEFINITE_LENGTH;
     350                cb = pCursor->cbLeft - pCursor->cIndefinedRecs * 2; /* tentatively */
    338351            }
    339352        }
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