VirtualBox

Ignore:
Timestamp:
Jul 16, 2022 1:51:17 PM (2 years ago)
Author:
vboxsync
Message:

RTSignTool: A few conveniences. bugref:8691

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/tools/RTSignTool.cpp

    r95670 r95671  
    134134#define OPT_NO_HASH_PAGES                   1041
    135135#define OPT_ADD_CERT                        1042
    136 
    137136#define OPT_TIMESTAMP_TYPE                  1043
    138137#define OPT_TIMESTAMP_OVERRIDE              1044
     138#define OPT_NO_SIGNING_TIME                 1045
    139139
    140140
     
    13401340        if (pfnMapFileAndCheckSumW)
    13411341        {
    1342             DWORD uHeaderSum = UINT32_MAX;
    1343             DWORD uCheckSum  = UINT32_MAX;
    1344             DWORD dwRc = pfnMapFileAndCheckSumW(pwszPath, &uHeaderSum, &uCheckSum);
     1342            DWORD uOldSum  = UINT32_MAX;
     1343            DWORD uCheckSum = UINT32_MAX;
     1344            DWORD dwRc = pfnMapFileAndCheckSumW(pwszPath, &uOldSum, &uCheckSum);
    13451345            if (dwRc == CHECKSUM_SUCCESS)
    13461346            {
     
    17021702
    17031703static RTEXITCODE SignToolPkcs7_AddAuthAttribsForImageOrCatSignature(PRTCRPKCS7ATTRIBUTES pAuthAttribs, RTTIMESPEC SigningTime,
    1704                                                                      const char *pszContentTypeId)
     1704                                                                     bool fNoSigningTime, const char *pszContentTypeId)
    17051705{
    17061706    /*
     
    17421742     * Add signing time. We add this, even if signtool.exe, since OpenSSL will always do it otherwise.
    17431743     */
    1744     rcExit = SignToolPkcs7_AuthAttribsAddSigningTime(pAuthAttribs, SigningTime);
    1745     if (rcExit != RTEXITCODE_SUCCESS)
    1746         return rcExit;
     1744    if (!fNoSigningTime) /** @todo requires disabling the code in do_pkcs7_signed_attrib that adds it when absent */
     1745    {
     1746        rcExit = SignToolPkcs7_AuthAttribsAddSigningTime(pAuthAttribs, SigningTime);
     1747        if (rcExit != RTEXITCODE_SUCCESS)
     1748            return rcExit;
     1749    }
    17471750
    17481751    /** @todo more? Some certificate stuff?   */
     
    21712174static RTEXITCODE SignToolPkcs7_SignData(SIGNTOOLPKCS7 *pThis, PRTASN1CORE pToSignRoot, bool fIsRootsParent,
    21722175                                         const char *pszContentTypeId, unsigned cVerbosity,  RTDIGESTTYPE enmSigType,
    2173                                          bool fReplaceExisting, SignToolKeyPair *pSigningCertKey, RTCRSTORE hAddCerts,
     2176                                         bool fReplaceExisting, bool fNoSigningTime,
     2177                                         SignToolKeyPair *pSigningCertKey, RTCRSTORE hAddCerts,
    21742178                                         bool fTimestampTypeOld, RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey)
    21752179{
     
    22052209        if (RT_SUCCESS(rc))
    22062210        {
    2207             rcExit = SignToolPkcs7_AddAuthAttribsForImageOrCatSignature(&AuthAttribs, SigningTime, pszContentTypeId);
     2211            rcExit = SignToolPkcs7_AddAuthAttribsForImageOrCatSignature(&AuthAttribs, SigningTime, fNoSigningTime,
     2212                                                                        pszContentTypeId);
    22082213            if (rcExit == RTEXITCODE_SUCCESS)
    22092214            {
     
    24742479
    24752480static RTEXITCODE SignToolPkcs7_AddOrReplaceSignature(SIGNTOOLPKCS7EXE *pThis, unsigned cVerbosity, RTDIGESTTYPE enmSigType,
    2476                                                       bool fReplaceExisting,  bool fHashPages, SignToolKeyPair *pSigningCertKey,
     2481                                                      bool fReplaceExisting,  bool fHashPages, bool fNoSigningTime,
     2482                                                      SignToolKeyPair *pSigningCertKey,
    24772483                                                      RTCRSTORE hAddCerts,  bool fTimestampTypeOld,
    24782484                                                      RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey)
     
    25412547                        rcExit = SignToolPkcs7_SignData(pThis, RTCrSpcIndirectDataContent_GetAsn1Core(&SpcIndData), false,
    25422548                                                        RTCRSPCINDIRECTDATACONTENT_OID, cVerbosity,
    2543                                                         enmSigType, fReplaceExisting, pSigningCertKey, hAddCerts,
     2549                                                        enmSigType, fReplaceExisting, fNoSigningTime, pSigningCertKey, hAddCerts,
    25442550                                                        fTimestampTypeOld, SigningTime, pTimestampCertKey);
    25452551                }
     
    25602566
    25612567static RTEXITCODE SignToolPkcs7_AddOrReplaceCatSignature(SIGNTOOLPKCS7 *pThis, unsigned cVerbosity, RTDIGESTTYPE enmSigType,
    2562                                                          bool fReplaceExisting, SignToolKeyPair *pSigningCertKey,
     2568                                                         bool fReplaceExisting, bool fNoSigningTime,
     2569                                                         SignToolKeyPair *pSigningCertKey,
    25632570                                                         RTCRSTORE hAddCerts, bool fTimestampTypeOld,
    25642571                                                         RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey)
     
    25902597     */
    25912598    RTEXITCODE rcExit = SignToolPkcs7_SignData(pThis, pToSign, true, pszType, cVerbosity, enmSigType, fReplaceExisting,
    2592                                                pSigningCertKey, hAddCerts, fTimestampTypeOld, SigningTime, pTimestampCertKey);
     2599                                               fNoSigningTime, pSigningCertKey, hAddCerts,
     2600                                               fTimestampTypeOld, SigningTime, pTimestampCertKey);
    25932601
    25942602    /* probably need to clean up stuff related to nested signatures here later... */
     
    26242632        { "--output",           'o', RTGETOPT_REQ_STRING  },
    26252633        { "--signature-index",  'i', RTGETOPT_REQ_UINT32  },
     2634        { "--force",            'f', RTGETOPT_REQ_NOTHING },
    26262635    };
    26272636
     
    26322641    uint32_t    fCursorFlags = RTASN1CURSOR_FLAGS_DER;
    26332642    uint32_t    iSignature   = 0;
     2643    bool        fForce       = false;
    26342644
    26352645    RTGETOPTSTATE GetState;
     
    26472657            case 'c':   fCursorFlags = RTASN1CURSOR_FLAGS_CER; break;
    26482658            case 'd':   fCursorFlags = RTASN1CURSOR_FLAGS_DER; break;
     2659            case 'f':   fForce = true; break;
    26492660            case 'i':   iSignature = ValueUnion.u32; break;
    26502661            case 'V':   return HandleVersion(cArgs, papszArgs);
     
    26682679    if (!pszOut)
    26692680        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given.");
    2670     if (RTPathExists(pszOut))
     2681    if (!fForce && RTPathExists(pszOut))
    26712682        return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut);
    26722683
     
    26952706                 */
    26962707                RTFILE hFile;
    2697                 rc = RTFileOpen(&hFile, pszOut, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE);
     2708                rc = RTFileOpen(&hFile, pszOut,
     2709                                RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | (fForce ? RTFILE_O_CREATE_REPLACE : RTFILE_O_CREATE));
    26982710                if (RT_SUCCESS(rc))
    26992711                {
     
    27542766        { "--exe",              'e', RTGETOPT_REQ_STRING  },
    27552767        { "--output",           'o', RTGETOPT_REQ_STRING  },
     2768        { "--force",            'f', RTGETOPT_REQ_NOTHING  },
    27562769    };
    27572770
     
    27602773    RTLDRARCH   enmLdrArch   = RTLDRARCH_WHATEVER;
    27612774    unsigned    cVerbosity   = 0;
     2775    bool        fForce       = false;
    27622776
    27632777    RTGETOPTSTATE GetState;
     
    27722786            case 'e':   pszExe = ValueUnion.psz; break;
    27732787            case 'o':   pszOut = ValueUnion.psz; break;
     2788            case 'f':   fForce = true; break;
    27742789            case 'V':   return HandleVersion(cArgs, papszArgs);
    27752790            case 'h':   return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL);
     
    27922807    if (!pszOut)
    27932808        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given.");
    2794     if (RTPathExists(pszOut))
     2809    if (!fForce && RTPathExists(pszOut))
    27952810        return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut);
    27962811
     
    28072822         */
    28082823        RTFILE hFile;
    2809         rc = RTFileOpen(&hFile, pszOut, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE);
     2824        rc = RTFileOpen(&hFile, pszOut,
     2825                        RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | (fForce ? RTFILE_O_CREATE_REPLACE : RTFILE_O_CREATE));
    28102826        if (RT_SUCCESS(rc))
    28112827        {
     
    32993315                        "[--timestamp-date <fake-isots>] "
    33003316                        "[--timestamp-year <fake-year>] "
    3301                         "[--replace-existing|-r] "
    33023317                        "<exe>\n");
    33033318    if (enmLevel == RTSIGNTOOLHELP_FULL)
     
    33293344        { "--add-cert",             OPT_ADD_CERT,               RTGETOPT_REQ_STRING },
    33303345        { "/ac",                    OPT_ADD_CERT,               RTGETOPT_REQ_STRING },
     3346        { "--no-signing-time",      OPT_NO_SIGNING_TIME,        RTGETOPT_REQ_NOTHING },
    33313347        OPT_CERT_KEY_GETOPTDEF_ENTRIES("--",           1000),
    33323348        OPT_CERT_KEY_GETOPTDEF_COMPAT_ENTRIES(         1000),
     
    33433359    bool                    fReplaceExisting        = true;
    33443360    bool                    fHashPages              = false;
     3361    bool                    fNoSigningTime          = false;
    33453362    SignToolKeyPair         SigningCertKey("signing", true);
    33463363    RTCRSTORE               hAddCerts               = NIL_RTCRSTORE; /* leaked if returning directly (--help, --version) */
     
    33683385            case OPT_HASH_PAGES:            fHashPages = true; break;
    33693386            case OPT_NO_HASH_PAGES:         fHashPages = false; break;
     3387            case OPT_NO_SIGNING_TIME:       fNoSigningTime = true; break;
    33703388            case OPT_ADD_CERT:              rcExit2 = HandleOptAddCert(&hAddCerts, ValueUnion.psz); break;
    33713389            case OPT_TIMESTAMP_TYPE:        rcExit2 = HandleOptTimestampType(&fTimestampTypeOld, ValueUnion.psz); break;
     
    33893407                    {
    33903408                        rcExit2 = SignToolPkcs7_AddOrReplaceSignature(&Exe, cVerbosity, enmSigType, fReplaceExisting, fHashPages,
    3391                                                                       &SigningCertKey, hAddCerts,
     3409                                                                      fNoSigningTime, &SigningCertKey, hAddCerts,
    33923410                                                                      fTimestampTypeOld, SigningTime, &TimestampCertKey);
    33933411                        if (rcExit2 == RTEXITCODE_SUCCESS)
     
    34663484        { "--add-cert",             OPT_ADD_CERT,               RTGETOPT_REQ_STRING },
    34673485        { "/ac",                    OPT_ADD_CERT,               RTGETOPT_REQ_STRING },
     3486        { "--no-signing-time",      OPT_NO_SIGNING_TIME,        RTGETOPT_REQ_NOTHING },
    34683487        OPT_CERT_KEY_GETOPTDEF_ENTRIES("--",           1000),
    34693488        OPT_CERT_KEY_GETOPTDEF_COMPAT_ENTRIES(         1000),
     
    34793498    RTDIGESTTYPE            enmSigType              = RTDIGESTTYPE_SHA1;
    34803499    bool                    fReplaceExisting        = true;
     3500    bool                    fNoSigningTime          = false;
    34813501    SignToolKeyPair         SigningCertKey("signing", true);
    34823502    RTCRSTORE               hAddCerts               = NIL_RTCRSTORE; /* leaked if returning directly (--help, --version) */
     
    35023522            case 't':                       rcExit2 = HandleOptSignatureType(&enmSigType, ValueUnion.psz); break;
    35033523            case 'a':                       fReplaceExisting = false; break;
     3524            case OPT_NO_SIGNING_TIME:       fNoSigningTime = true; break;
    35043525            case OPT_ADD_CERT:              rcExit2 = HandleOptAddCert(&hAddCerts, ValueUnion.psz); break;
    35053526            case OPT_TIMESTAMP_TYPE:        rcExit2 = HandleOptTimestampType(&fTimestampTypeOld, ValueUnion.psz); break;
     
    35223543                    {
    35233544                        rcExit2 = SignToolPkcs7_AddOrReplaceCatSignature(&Cat, cVerbosity, enmSigType, fReplaceExisting,
    3524                                                                          &SigningCertKey, hAddCerts,
     3545                                                                         fNoSigningTime, &SigningCertKey, hAddCerts,
    35253546                                                                         fTimestampTypeOld, SigningTime, &TimestampCertKey);
    35263547                        if (rcExit2 == RTEXITCODE_SUCCESS)
     
    35803601    uint32_t    cOkay;
    35813602    const char *pszFilename;
     3603    RTTIMESPEC  ValidationTime;
    35823604} VERIFYEXESTATE;
    35833605
     
    37683790             * We'll try different alternative timestamps here.
    37693791             */
    3770             struct { RTTIMESPEC TimeSpec; const char *pszDesc; } aTimes[2];
     3792            struct { RTTIMESPEC TimeSpec; const char *pszDesc; } aTimes[3];
    37713793            unsigned cTimes = 0;
     3794
     3795            /* The specified timestamp. */
     3796            if (RTTimeSpecGetSeconds(&pState->ValidationTime) != 0)
     3797            {
     3798                aTimes[cTimes].TimeSpec = pState->ValidationTime;
     3799                aTimes[cTimes].pszDesc  = "validation time";
     3800                cTimes++;
     3801            }
    37723802
    37733803            /* Linking timestamp: */
     
    37763806            if (RT_SUCCESS(rc))
    37773807            {
    3778                 RTTimeSpecSetSeconds(&aTimes[0].TimeSpec, uLinkingTime);
    3779                 aTimes[0].pszDesc = "at link time";
     3808                RTTimeSpecSetSeconds(&aTimes[cTimes].TimeSpec, uLinkingTime);
     3809                aTimes[cTimes].pszDesc = "at link time";
    37803810                cTimes++;
    37813811            }
     
    38963926    static const RTGETOPTDEF s_aOptions[] =
    38973927    {
    3898         { "--kernel",       'k', RTGETOPT_REQ_NOTHING },
    3899         { "--root",         'r', RTGETOPT_REQ_STRING },
    3900         { "--additional",   'a', RTGETOPT_REQ_STRING },
    3901         { "--add",          'a', RTGETOPT_REQ_STRING },
    3902         { "--type",         't', RTGETOPT_REQ_STRING },
    3903         { "--verbose",      'v', RTGETOPT_REQ_NOTHING },
    3904         { "--quiet",        'q', RTGETOPT_REQ_NOTHING },
     3928        { "--kernel",           'k', RTGETOPT_REQ_NOTHING },
     3929        { "--root",             'r', RTGETOPT_REQ_STRING },
     3930        { "--additional",       'a', RTGETOPT_REQ_STRING },
     3931        { "--add",              'a', RTGETOPT_REQ_STRING },
     3932        { "--type",             't', RTGETOPT_REQ_STRING },
     3933        { "--validation-time",  'T', RTGETOPT_REQ_STRING },
     3934        { "--verbose",          'v', RTGETOPT_REQ_NOTHING },
     3935        { "--quiet",            'q', RTGETOPT_REQ_NOTHING },
    39053936    };
    39063937
     
    39183949    if (RT_FAILURE(rc))
    39193950        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error creating in-memory certificate store: %Rrc", rc);
     3951    RTTimeSpecSetSeconds(&State.ValidationTime, 0);
    39203952
    39213953    RTGETOPTSTATE GetState;
     
    39463978                else
    39473979                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown signing type: '%s'", ValueUnion.psz);
     3980                break;
     3981
     3982            case 'T':
     3983                if (!RTTimeSpecFromString(&State.ValidationTime, ValueUnion.psz))
     3984                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid validation time (%s): %Rrc", ValueUnion.psz, rc);
    39483985                break;
    39493986
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