VirtualBox

Changeset 52600 in vbox for trunk/include/iprt/crypto


Ignore:
Timestamp:
Sep 4, 2014 10:59:00 PM (10 years ago)
Author:
vboxsync
Message:

IPRT: Added support for microsoft timestamp counter signatures. This required making the PKCS #7 code accept some of the CMS (RFC-5652) stuff.

Location:
trunk/include/iprt/crypto
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/crypto/pkcs7.h

    r52537 r52600  
    8585    /** Signing time (PKCS \#9), use pSigningTime. */
    8686    RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME,
     87    /** Microsoft timestamp info (RFC-3161) signed data, use pContentInfo. */
     88    RTCRPKCS7ATTRIBUTETYPE_MS_TIMESTAMP,
    8789    /** Blow the type up to 32-bits. */
    8890    RTCRPKCS7ATTRIBUTETYPE_32BIT_HACK = 0x7fffffff
     
    115117        /** Signing time(s) (RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME). */
    116118        PRTASN1SETOFTIMES               pSigningTime;
     119        /** Microsoft timestamp (RFC-3161 signed data). */
     120        struct RTCRPKCS7SETOFCONTENTINFOS *pContentInfos;
    117121    } uValues;
    118122} RTCRPKCS7ATTRIBUTE;
     
    173177 * Value: SignerInfo. */
    174178#define RTCR_PKCS9_ID_COUNTER_SIGNATURE_OID "1.2.840.113549.1.9.6"
     179/** Microsoft timestamp (RTF-3161) counter signature (SignedData).
     180 * @remarks This isn't defined by PKCS \#9, but lumped in here for
     181 *          convenience.  It's actually listed as SPC by MS. */
     182#define RTCR_PKCS9_ID_MS_TIMESTAMP          "1.3.6.1.4.1.311.3.3.1"
    175183/** @} */
     184
    176185
    177186/**
     
    193202 */
    194203RTDECL(PCRTASN1TIME) RTCrPkcs7SignerInfo_GetSigningTime(PCRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7SIGNERINFO *ppSignerInfo);
     204
     205
     206/**
     207 * Get the (first) timestamp from within a Microsoft timestamp server counter
     208 * signature.
     209 *
     210 * @returns Pointer to the signing time if found, NULL if not.
     211 * @param   pThis               The SignerInfo to search.
     212 * @param   ppContentInfo       Where to return the pointer to the counter
     213 *                              signature, optional.
     214 */
     215RTDECL(PCRTASN1TIME) RTCrPkcs7SignerInfo_GetMsTimestamp(PCRTCRPKCS7SIGNERINFO pThis,
     216                                                        struct RTCRPKCS7CONTENTINFO const **ppContentInfo);
    195217
    196218
     
    223245     */
    224246    RTASN1OCTETSTRING                   Content;
     247    /** Pointer to the CMS octet string that's inside the Content, NULL if PKCS \#7.
     248     *
     249     * Hack alert! When transitioning from PKCS \#7 to CMS, the designers decided to
     250     * change things and add another wrapper.  This time we're talking about a real
     251     * octet string, not like the one above which is really an explicit content tag.
     252     * When constructing or decoding CMS content, this will be the same pointer as
     253     * Content.pEncapsulated, while the union below will be holding the same pointer
     254     * as pCmsContent->pEncapsulated.
     255     */
     256    PRTASN1OCTETSTRING                  pCmsContent;
    225257    /** Same as Content.pEncapsulated, except a choice of known types. */
    226258    union
     
    230262        /** ContentType is RTCRSPCINDIRECTDATACONTENT_OID. */
    231263        struct RTCRSPCINDIRECTDATACONTENT  *pIndirectDataContent;
     264        /** ContentType is RTCRTSPTSTINFO_OID. */
     265        struct RTCRTSPTSTINFO              *pTstInfo;
    232266        /** Generic / Unknown / User. */
    233267        PRTASN1CORE                         pCore;
     
    238272/** Pointer to the const IPRT representation of a PKCS \#7 ContentInfo. */
    239273typedef RTCRPKCS7CONTENTINFO const *PCRTCRPKCS7CONTENTINFO;
    240 
    241274RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7CONTENTINFO, RTDECL, RTCrPkcs7ContentInfo, SeqCore.Asn1Core);
     275RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SETOFCONTENTINFOS, RTCRPKCS7CONTENTINFO, RTDECL, RTCrPkcs7SetOfContentInfos);
    242276
    243277RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis);
     278
     279
     280/**
     281 * PKCS \#7 Certificate choice.
     282 */
     283typedef enum RTCRPKCS7CERTCHOICE
     284{
     285    RTCRPKCS7CERTCHOICE_INVALID = 0,
     286    RTCRPKCS7CERTCHOICE_X509,
     287    RTCRPKCS7CERTCHOICE_EXTENDED_PKCS6,
     288    RTCRPKCS7CERTCHOICE_AC_V1,
     289    RTCRPKCS7CERTCHOICE_AC_V2,
     290    RTCRPKCS7CERTCHOICE_OTHER,
     291    RTCRPKCS7CERTCHOICE_END,
     292    RTCRPKCS7CERTCHOICE_32BIT_HACK = 0x7fffffff
     293} RTCRPKCS7CERTCHOICE;
     294
     295
     296/**
     297 * Common representation for PKCS \#7 ExtendedCertificateOrCertificate and the
     298 * CMS CertificateChoices types.
     299 */
     300typedef struct RTCRPKCS7CERT
     301{
     302    /** Dummy ASN.1 record, not encoded. */
     303    RTASN1DUMMY                         Dummy;
     304    /** The value allocation. */
     305    RTASN1ALLOCATION                    Allocation;
     306    /** The choice of value.   */
     307    RTCRPKCS7CERTCHOICE                 enmChoice;
     308    /** The value union. */
     309    union
     310    {
     311        /** Standard X.509 certificate (RTCRCMSCERTIFICATECHOICE_X509). */
     312        PRTCRX509CERTIFICATE            pX509Cert;
     313        /** Extended PKCS \#6 certificate (RTCRCMSCERTIFICATECHOICE_EXTENDED_PKCS6). */
     314        PRTASN1CORE                     pExtendedCert;
     315        /** Attribute certificate version 1 (RTCRCMSCERTIFICATECHOICE_AC_V1). */
     316        PRTASN1CORE                     pAcV1;
     317        /** Attribute certificate version 2 (RTCRCMSCERTIFICATECHOICE_AC_V2). */
     318        PRTASN1CORE                     pAcV2;
     319        /** Other certificate (RTCRCMSCERTIFICATECHOICE_OTHER). */
     320        PRTASN1CORE                     pOtherCert;
     321    } u;
     322} RTCRPKCS7CERT;
     323/** Pointer to the IPRT representation of PKCS \#7 or CMS certificate. */
     324typedef RTCRPKCS7CERT *PRTCRPKCS7CERT;
     325/** Pointer to the const IPRT representation of PKCS \#7 or CMS certificate. */
     326typedef RTCRPKCS7CERT const *PCRTCRPKCS7CERT;
     327RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7CERT, RTDECL, RTCrPkcs7Cert, Dummy.Asn1Core);
     328RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SETOFCERTS, RTCRPKCS7CERT, RTDECL, RTCrPkcs7SetOfCerts);
     329
     330RTDECL(PCRTCRX509CERTIFICATE) RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(PCRTCRPKCS7SETOFCERTS pCertificates,
     331                                                                                  PCRTCRX509NAME pIssuer,
     332                                                                                  PCRTASN1INTEGER pSerialNumber);
    244333
    245334
     
    258347    RTCRPKCS7CONTENTINFO                ContentInfo;
    259348    /** Certificates, optional, implicit tag 0. (Required by Authenticode.) */
    260     RTCRX509CERTIFICATES                Certificates;
     349    RTCRPKCS7SETOFCERTS                 Certificates;
    261350    /** Certificate revocation lists, optional, implicit tag 1.
    262351     * Not used by Authenticode, so currently stubbed. */
     
    270359typedef RTCRPKCS7SIGNEDDATA const *PCRTCRPKCS7SIGNEDDATA;
    271360RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNEDDATA, RTDECL, RTCrPkcs7SignedData, SeqCore.Asn1Core);
     361RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SETOFSIGNEDDATA, RTCRPKCS7SIGNEDDATA, RTDECL, RTCrPkcs7SetOfSignedData);
    272362
    273363/** PKCS \#7 SignedData object ID.  */
     
    276366/** PKCS \#7 SignedData version number 1.  */
    277367#define RTCRPKCS7SIGNEDDATA_V1    1
     368/* No version 2 seems to exist. */
     369/** CMS SignedData version number 3.
     370 * This should only be used if there are version 1 attribute certificates
     371 * present, or if there are version 3 SignerInfo items present, or if
     372 * enmcCountInfo is not id-data (RFC-5652, section 5.1). */
     373#define RTCRPKCS7SIGNEDDATA_V3    3
     374/** CMS SignedData version number 4.
     375 * This should only be used if there are version 2 attribute certificates
     376 * present (RFC-5652, section 5.1). */
     377#define RTCRPKCS7SIGNEDDATA_V4    4
     378/** CMS SignedData version number 5.
     379 * This should only be used if there are certificates or/and CRLs of the
     380 * OTHER type present (RFC-5652, section 5.1). */
     381#define RTCRPKCS7SIGNEDDATA_V5    5
    278382
    279383
     
    384488 * signing time attributes and use the @a pValidationTime instead. */
    385489#define RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_SIGNING_TIME_IF_PRESENT     RT_BIT_32(0)
     490/** Same as RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_SIGNING_TIME_IF_PRESENT for the MS
     491 *  timestamp counter sigantures. */
     492#define RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_MS_TIMESTAMP_IF_PRESENT     RT_BIT_32(1)
    386493/** Only use signging time attributes from counter signatures. */
    387 #define RTCRPKCS7VERIFY_SD_F_COUNTER_SIGNATURE_SIGNING_TIME_ONLY    RT_BIT_32(1)
     494#define RTCRPKCS7VERIFY_SD_F_COUNTER_SIGNATURE_SIGNING_TIME_ONLY    RT_BIT_32(2)
    388495/** Don't validate the counter signature containing the signing time, just use
    389496 * it unverified.  This is useful if we don't necessarily have the root
    390  * certificates for the timestamp server handy, but use with great care. */
    391 #define RTCRPKCS7VERIFY_SD_F_USE_SIGNING_TIME_UNVERIFIED            RT_BIT_32(2)
     497 * certificates for the timestamp server handy, but use with great care.
     498 * @sa RTCRPKCS7VERIFY_SD_F_USE_MS_TIMESTAMP_UNVERIFIED */
     499#define RTCRPKCS7VERIFY_SD_F_USE_SIGNING_TIME_UNVERIFIED            RT_BIT_32(3)
     500/** Don't validate the MS counter signature containing the signing timestamp.
     501 * @sa RTCRPKCS7VERIFY_SD_F_USE_SIGNING_TIME_UNVERIFIED */
     502#define RTCRPKCS7VERIFY_SD_F_USE_MS_TIMESTAMP_UNVERIFIED            RT_BIT_32(4)
     503/** Do not consider timestamps in microsoft counter signatures. */
     504#define RTCRPKCS7VERIFY_SD_F_IGNORE_MS_TIMESTAMP                    RT_BIT_32(5)
     505/** The signed data requires certificates to have the timestamp extended
     506 * usage bit present.  This is used for recursivly verifying MS timestamp
     507 * signatures. */
     508#define RTCRPKCS7VERIFY_SD_F_USAGE_TIMESTAMPING                     RT_BIT_32(6)
     509
    392510/** Indicates internally that we're validating a counter signature and should
    393511 * use different rules when checking out the authenticated attributes.
  • trunk/include/iprt/crypto/x509.h

    r52537 r52600  
    10231023RTDECL(int) RTCrX509CertPathsSetUntrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hUntrustedStore);
    10241024RTDECL(int) RTCrX509CertPathsSetUntrustedArray(RTCRX509CERTPATHS hCertPaths, PCRTCRX509CERTIFICATE paCerts, uint32_t cCerts);
     1025RTDECL(int) RTCrX509CertPathsSetUntrustedSet(RTCRX509CERTPATHS hCertPaths, struct RTCRPKCS7SETOFCERTS const *pSetOfCerts);
    10251026RTDECL(int) RTCrX509CertPathsSetValidTime(RTCRX509CERTPATHS hCertPaths, PCRTTIME pTime);
    10261027RTDECL(int) RTCrX509CertPathsSetValidTimeSpec(RTCRX509CERTPATHS hCertPaths, PCRTTIMESPEC pTimeSpec);
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