VirtualBox

Ignore:
Timestamp:
May 11, 2020 11:46:40 AM (5 years ago)
Author:
vboxsync
Message:

IPRT/crypto: Adding functions for checking whether a key or certificate can handle a given digest (size wise). Also, added OIDs, padding variants and stuff for sha512-224WithRSAEncryption and sha512-256WithRSAEncryption (RFC-8017). Note that OpenSSL does not implement these yet. bugref:9699

Location:
trunk/src/VBox/Runtime/common/crypto
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/crypto/digest-core.cpp

    r82968 r84248  
    426426        case RTDIGESTTYPE_SHA384:       return RTCRX509ALGORITHMIDENTIFIERID_SHA384;
    427427        case RTDIGESTTYPE_SHA512:       return RTCRX509ALGORITHMIDENTIFIERID_SHA512;
     428        case RTDIGESTTYPE_SHA512T224:   return RTCRX509ALGORITHMIDENTIFIERID_SHA512T224;
     429        case RTDIGESTTYPE_SHA512T256:   return RTCRX509ALGORITHMIDENTIFIERID_SHA512T256;
    428430        default:                        return NULL;
    429431    }
  • trunk/src/VBox/Runtime/common/crypto/iprt-openssl.cpp

    r84230 r84248  
    3636# include <iprt/mem.h>
    3737# include <iprt/asn1.h>
     38# include <iprt/crypto/digest.h>
    3839
    3940# include "internal/iprt-openssl.h"
     
    146147}
    147148
     149
     150DECLHIDDEN(const void /*EVP_MD*/ *) rtCrOpenSslConvertDigestType(RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo)
     151{
     152    const char *pszAlgoObjId = RTCrDigestTypeToAlgorithmOid(enmDigestType);
     153    AssertReturnStmt(pszAlgoObjId, RTErrInfoSetF(pErrInfo, VERR_INVALID_PARAMETER, "Invalid type: %d", enmDigestType), NULL);
     154
     155    int iAlgoNid = OBJ_txt2nid(pszAlgoObjId);
     156    AssertReturnStmt(iAlgoNid != NID_undef,
     157                     RTErrInfoSetF(pErrInfo, VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR,
     158                                   "OpenSSL does not know: %s (%s)", pszAlgoObjId, RTCrDigestTypeToName(enmDigestType)),
     159                     NULL);
     160
     161    const char   *pszAlgoSn  = OBJ_nid2sn(iAlgoNid);
     162    const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlgoSn);
     163    AssertReturnStmt(pEvpMdType,
     164                     RTErrInfoSetF(pErrInfo, VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR, "OpenSSL/EVP does not know: %d (%s; %s; %s)",
     165                                   iAlgoNid, pszAlgoSn, pszAlgoSn, RTCrDigestTypeToName(enmDigestType)),
     166                     NULL);
     167
     168    return pEvpMdType;
     169}
     170
    148171#endif /* IPRT_WITH_OPENSSL */
    149172
  • trunk/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp

    r84235 r84248  
    8585
    8686RTDECL(int) RTCrPkcs7SimpleSignSignedData(uint32_t fFlags, PCRTCRX509CERTIFICATE pSigner, RTCRKEY hPrivateKey,
    87                                           void const *pvData, size_t cbData, RTCRSTORE hAdditionalCerts,
    88                                           void *pvResult, size_t *pcbResult, PRTERRINFO pErrInfo)
     87                                          void const *pvData, size_t cbData, RTDIGESTTYPE enmDigestType,
     88                                          RTCRSTORE hAdditionalCerts, void *pvResult, size_t *pcbResult, PRTERRINFO pErrInfo)
    8989{
    9090    size_t const cbResultBuf = *pcbResult;
    9191    *pcbResult = 0;
    9292    AssertReturn(!(fFlags & ~RTCRPKCS7SIGN_SD_F_VALID_MASK), VERR_INVALID_FLAGS);
    93 #if defined(IPRT_WITH_OPENSSL)
     93#ifdef IPRT_WITH_OPENSSL
    9494    AssertReturn((int)cbData >= 0 && (unsigned)cbData == cbData, VERR_TOO_MUCH_DATA);
     95
     96    /*
     97     * Resolve the digest type.
     98     */
     99    const EVP_MD *pEvpMd = NULL;
     100    if (enmDigestType != RTDIGESTTYPE_UNKNOWN)
     101    {
     102        pEvpMd = (const EVP_MD *)rtCrOpenSslConvertDigestType(enmDigestType, pErrInfo);
     103        AssertReturn(pEvpMd, pErrInfo ? pErrInfo->rc : VERR_INVALID_PARAMETER);
     104    }
    95105
    96106    /*
     
    125135                     * Do the signing.
    126136                     */
    127                     unsigned int fOsslSign = CMS_BINARY;
     137                    unsigned int fOsslSign = CMS_BINARY | CMS_PARTIAL;
    128138                    if (fFlags & RTCRPKCS7SIGN_SD_F_DEATCHED)
    129139                        fOsslSign |= CMS_DETACHED;
    130140                    if (fFlags & RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP)
    131141                        fOsslSign |= CMS_NOSMIMECAP;
    132                     CMS_ContentInfo *pCms = CMS_sign(pOsslSigner, pEvpPrivateKey, pOsslAdditionalCerts, pOsslData, fOsslSign);
    133                     if (pCms)
     142                    CMS_ContentInfo *pCms = CMS_sign(NULL, NULL, pOsslAdditionalCerts, NULL, fOsslSign);
     143                    if (pCms != NULL)
    134144                    {
    135                         /*
    136                          * Get the output and copy it into the result buffer.
    137                          */
    138                         BIO *pOsslResult = BIO_new(BIO_s_mem());
    139                         if (pOsslResult)
     145                        if (CMS_add1_signer(pCms, pOsslSigner, pEvpPrivateKey, pEvpMd, fOsslSign) != NULL)
    140146                        {
    141                             rc = i2d_CMS_bio(pOsslResult, pCms);
     147                            rc = CMS_final(pCms, pOsslData, NULL /*dcont*/, fOsslSign);
    142148                            if (rc > 0)
    143149                            {
    144                                 BUF_MEM *pBuf = NULL;
    145                                 rc = (int)BIO_get_mem_ptr(pOsslResult, &pBuf);
    146                                 if (rc > 0)
     150                                /*
     151                                 * Get the output and copy it into the result buffer.
     152                                 */
     153                                BIO *pOsslResult = BIO_new(BIO_s_mem());
     154                                if (pOsslResult)
    147155                                {
    148                                     AssertPtr(pBuf);
    149                                     size_t const cbResult = pBuf->length;
    150                                     if (   cbResultBuf >= cbResult
    151                                         && pvResult != NULL)
     156                                    rc = i2d_CMS_bio(pOsslResult, pCms);
     157                                    if (rc > 0)
    152158                                    {
    153                                         memcpy(pvResult, pBuf->data, cbResult);
    154                                         rc = VINF_SUCCESS;
     159                                        BUF_MEM *pBuf = NULL;
     160                                        rc = (int)BIO_get_mem_ptr(pOsslResult, &pBuf);
     161                                        if (rc > 0)
     162                                        {
     163                                            AssertPtr(pBuf);
     164                                            size_t const cbResult = pBuf->length;
     165                                            if (   cbResultBuf >= cbResult
     166                                                && pvResult != NULL)
     167                                            {
     168                                                memcpy(pvResult, pBuf->data, cbResult);
     169                                                rc = VINF_SUCCESS;
     170                                            }
     171                                            else
     172                                                rc = VERR_BUFFER_OVERFLOW;
     173                                            *pcbResult = cbResult;
     174                                        }
     175                                        else
     176                                            rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "BIO_get_mem_ptr");
    155177                                    }
    156178                                    else
    157                                         rc = VERR_BUFFER_OVERFLOW;
    158                                     *pcbResult = cbResult;
     179                                        rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_CMS_bio");
     180                                    BIO_free(pOsslResult);
    159181                                }
    160182                                else
    161                                     rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "BIO_get_mem_ptr");
     183                                    rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "BIO_new/BIO_s_mem");
    162184                            }
    163185                            else
    164                                 rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_CMS_bio");
    165                             BIO_free(pOsslResult);
     186                                rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_final");
    166187                        }
    167188                        else
    168                             rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "BIO_new/BIO_s_mem");
     189                            rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_add1_signer");
    169190                        CMS_ContentInfo_free(pCms);
    170191                    }
     
    180201    return rc;
    181202#else
    182     RT_NOREF(fFlags, pSigner, hPrivateKey, pvData, cbData, hAdditionalCerts, pvResult, pErrInfo, cbResultBuf);
     203    RT_NOREF(fFlags, pSigner, hPrivateKey, pvData, cbData, enmDigestType, hAdditionalCerts, pvResult, pErrInfo, cbResultBuf);
    183204    *pcbResult = 0;
    184205    return VERR_NOT_IMPLEMENTED;
  • trunk/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp

    r82968 r84248  
    8181 * @{ */
    8282static const uint8_t g_abMd2[] =
    83 {/* {          {          1.2.840.113549.2.2 (MD2),                          NULL },    hash octet-string } */
    84     0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02, 0x05,0x00, 0x04,0x10
     83{/* {          {          1.2.840.113549.2.2 (MD2),                                 NULL },     hash octet-string } */
     84    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02,        0x05,0x00, 0x04,0x10
    8585};
    8686static const uint8_t g_abMd4[] =
    87 {/* {          {          1.2.840.113549.2.4 (MD4),                          NULL },    hash octet-string } */
    88     0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04, 0x05,0x00, 0x04,0x10
     87{/* {          {          1.2.840.113549.2.4 (MD4),                                 NULL },     hash octet-string } */
     88    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04,        0x05,0x00, 0x04,0x10
    8989};
    9090static const uint8_t g_abMd5[] =
    91 {/* {          {          1.2.840.113549.2.5 (MD5),                          NULL },    hash octet-string } */
    92     0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05, 0x05,0x00, 0x04,0x10
     91{/* {          {          1.2.840.113549.2.5 (MD5),                                 NULL },     hash octet-string } */
     92    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,        0x05,0x00, 0x04,0x10
    9393};
    9494static const uint8_t g_abSha1[] =
    95 {/* {          {          1.3.14.3.2.26 (SHA-1),              NULL },    hash octet-string } */
    96     0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a, 0x05,0x00, 0x04,0x14
     95{/* {          {          1.3.14.3.2.26 (SHA-1),                                    NULL },     hash octet-string } */
     96    0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,                       0x05,0x00, 0x04,0x14
    9797};
    9898static const uint8_t g_abSha256[] =
    99 {/* {          {          2.16.840.1.101.3.4.2.1 (SHA-256),                       NULL },    hash octet-string } */
    100     0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 0x05,0x00, 0x04,0x20
     99{/* {          {          2.16.840.1.101.3.4.2.1 (SHA-256),                         NULL },     hash octet-string } */
     100    0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,   0x05,0x00, 0x04,0x20
    101101};
    102102static const uint8_t g_abSha384[] =
    103 {/* {          {          2.16.840.1.101.3.4.2.2 (SHA-384),                       NULL },    hash octet-string } */
    104     0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02, 0x05,0x00, 0x04,0x30
     103{/* {          {          2.16.840.1.101.3.4.2.2 (SHA-384),                         NULL },     hash octet-string } */
     104    0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02,   0x05,0x00, 0x04,0x30
    105105};
    106106static const uint8_t g_abSha512[] =
    107 {/* {          {          2.16.840.1.101.3.4.2.3 (SHA-512),                       NULL },    hash octet-string } */
    108     0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03, 0x05,0x00, 0x04,0x40
     107{/* {          {          2.16.840.1.101.3.4.2.3 (SHA-512),                         NULL },     hash octet-string } */
     108    0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,   0x05,0x00, 0x04,0x40
    109109};
    110110static const uint8_t g_abSha224[] =
    111 {/* {          {          2.16.840.1.101.3.4.2.4 (SHA-224),                       NULL },    hash octet-string } */
    112     0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04, 0x05,0x00, 0x04,0x1c
     111{/* {          {          2.16.840.1.101.3.4.2.4 (SHA-224),                         NULL },     hash octet-string } */
     112    0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04,   0x05,0x00,  0x04,0x1c
     113};
     114static const uint8_t g_abSha512T224[] =
     115{/* {          {          2.16.840.1.101.3.4.2.5 (SHA-512T224),                     NULL },     hash octet-string } */
     116    0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x05,   0x05,0x00,  0x04,0x1c
     117};
     118static const uint8_t g_abSha512T256[] =
     119{/* {          {          2.16.840.1.101.3.4.2.6 (SHA-512T256),                     NULL },     hash octet-string } */
     120    0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x06,   0x05,0x00,  0x04,0x20
    113121};
    114122/** @} */
     
    122130} const g_aDigestInfos[] =
    123131{
    124     { RTDIGESTTYPE_MD2,     g_abMd2,    sizeof(g_abMd2) },
    125     { RTDIGESTTYPE_MD4,     g_abMd4,    sizeof(g_abMd4) },
    126     { RTDIGESTTYPE_MD5,     g_abMd5,    sizeof(g_abMd5) },
    127     { RTDIGESTTYPE_SHA1,    g_abSha1,   sizeof(g_abSha1) },
    128     { RTDIGESTTYPE_SHA256,  g_abSha256, sizeof(g_abSha256) },
    129     { RTDIGESTTYPE_SHA384,  g_abSha384, sizeof(g_abSha384) },
    130     { RTDIGESTTYPE_SHA512,  g_abSha512, sizeof(g_abSha512) },
    131     { RTDIGESTTYPE_SHA224,  g_abSha224, sizeof(g_abSha224) },
     132    { RTDIGESTTYPE_SHA1,        g_abSha1,       sizeof(g_abSha1) },
     133    { RTDIGESTTYPE_SHA256,      g_abSha256,     sizeof(g_abSha256) },
     134    { RTDIGESTTYPE_SHA512,      g_abSha512,     sizeof(g_abSha512) },
     135    { RTDIGESTTYPE_MD2,         g_abMd2,        sizeof(g_abMd2) },
     136    { RTDIGESTTYPE_MD4,         g_abMd4,        sizeof(g_abMd4) },
     137    { RTDIGESTTYPE_MD5,         g_abMd5,        sizeof(g_abMd5) },
     138    { RTDIGESTTYPE_SHA384,      g_abSha384,     sizeof(g_abSha384) },
     139    { RTDIGESTTYPE_SHA224,      g_abSha224,     sizeof(g_abSha224) },
     140    { RTDIGESTTYPE_SHA512T224,  g_abSha512T224, sizeof(g_abSha512T224)},
     141    { RTDIGESTTYPE_SHA512T256,  g_abSha512T256, sizeof(g_abSha512T256)},
    132142};
    133143
     
    464474};
    465475
     476
     477/**
     478 * Worker for RTCrRsaPublicKey_CanHandleDigestType and
     479 * RTCrRsaPrivateKey_CanHandleDigestType.
     480 *
     481 * We implement these two functions here because we've already got the
     482 * DigestInfo sizes nicely lined up here.
     483 */
     484static bool rtCrRsa_CanHandleDigestType(int32_t cModulusBits, RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo)
     485{
     486    /*
     487     * ASSUME EMSA-PKCS1-v1_5 padding scheme (RFC-8017 section 9.2):
     488     *     - 11 byte padding prefix (00, 01, 8 times ff)
     489     *     - digest info der sequence for rsaWithXxxxEncryption
     490     *     - the hash value.
     491     */
     492    for (uint32_t i = 0; i < RT_ELEMENTS(g_aDigestInfos); i++)
     493        if (g_aDigestInfos[i].enmDigest == enmDigestType)
     494        {
     495            size_t const cbHash = RTCrDigestTypeToHashSize(enmDigestType);
     496            AssertBreak(cbHash > 0);
     497
     498            size_t cbMsg = 11 + g_aDigestInfos[i].cb + cbHash;
     499            if ((ssize_t)cbMsg <= cModulusBits / 8)
     500                return true;
     501            RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH, "cModulusBits=%d cbMsg=%u", cModulusBits, cbMsg);
     502            return false;
     503        }
     504    RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE, "%s", RTCrDigestTypeToName(enmDigestType));
     505    return false;
     506}
     507
     508
     509RTDECL(bool) RTCrRsaPublicKey_CanHandleDigestType(PCRTCRRSAPUBLICKEY pRsaPublicKey, RTDIGESTTYPE enmDigestType,
     510                                                  PRTERRINFO pErrInfo)
     511{
     512    if (RTCrRsaPublicKey_IsPresent(pRsaPublicKey))
     513        return rtCrRsa_CanHandleDigestType(RTAsn1Integer_UnsignedLastBit(&pRsaPublicKey->Modulus) + 1, enmDigestType, pErrInfo);
     514    return false;
     515}
     516
     517
     518RTDECL(bool) RTCrRsaPrivateKey_CanHandleDigestType(PCRTCRRSAPRIVATEKEY pRsaPrivateKey, RTDIGESTTYPE enmDigestType,
     519                                                   PRTERRINFO pErrInfo)
     520{
     521    if (RTCrRsaPrivateKey_IsPresent(pRsaPrivateKey))
     522        return rtCrRsa_CanHandleDigestType(RTAsn1Integer_UnsignedLastBit(&pRsaPrivateKey->Modulus) + 1, enmDigestType, pErrInfo);
     523    return false;
     524}
     525
  • trunk/src/VBox/Runtime/common/crypto/pkix-util.cpp

    r82968 r84248  
    3232#include <iprt/crypto/pkix.h>
    3333
    34 #include <iprt/errcore.h>
     34#include <iprt/asn1.h>
     35#include <iprt/assert.h>
     36#include <iprt/err.h>
    3537#include <iprt/string.h>
     38#include <iprt/crypto/rsa.h>
    3639
    3740#ifdef IPRT_WITH_OPENSSL
     
    9295}
    9396
     97
     98RTDECL(bool) RTCrPkixPubKeyCanHandleDigestType(PCRTCRX509SUBJECTPUBLICKEYINFO pPublicKeyInfo, RTDIGESTTYPE enmDigestType,
     99                                               PRTERRINFO pErrInfo)
     100{
     101    bool fRc = false;
     102    if (RTCrX509SubjectPublicKeyInfo_IsPresent(pPublicKeyInfo))
     103    {
     104        void const * const  pvKeyBits = RTASN1BITSTRING_GET_BIT0_PTR(&pPublicKeyInfo->SubjectPublicKey);
     105        uint32_t const      cbKeyBits = RTASN1BITSTRING_GET_BYTE_SIZE(&pPublicKeyInfo->SubjectPublicKey);
     106        RTASN1CURSORPRIMARY PrimaryCursor;
     107        union
     108        {
     109            RTCRRSAPUBLICKEY    RsaPublicKey;
     110        } u;
     111
     112        if (RTAsn1ObjId_CompareWithString(&pPublicKeyInfo->Algorithm.Algorithm, RTCR_PKCS1_RSA_OID) == 0)
     113        {
     114            /*
     115             * RSA.
     116             */
     117            RTAsn1CursorInitPrimary(&PrimaryCursor, pvKeyBits, cbKeyBits, pErrInfo, &g_RTAsn1DefaultAllocator,
     118                                    RTASN1CURSOR_FLAGS_DER, "rsa");
     119
     120            RT_ZERO(u.RsaPublicKey);
     121            int rc = RTCrRsaPublicKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &u.RsaPublicKey, "PublicKey");
     122            if (RT_SUCCESS(rc))
     123                fRc = RTCrRsaPublicKey_CanHandleDigestType(&u.RsaPublicKey, enmDigestType, pErrInfo);
     124            RTCrRsaPublicKey_Delete(&u.RsaPublicKey);
     125        }
     126        else
     127        {
     128            RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN, "%s", pPublicKeyInfo->Algorithm.Algorithm.szObjId);
     129            AssertMsgFailed(("unknown key algorithm: %s\n", pPublicKeyInfo->Algorithm.Algorithm.szObjId));
     130            fRc = true;
     131        }
     132    }
     133    return fRc;
     134}
     135
     136
     137RTDECL(bool) RTCrPkixCanCertHandleDigestType(PCRTCRX509CERTIFICATE pCertificate, RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo)
     138{
     139    if (RTCrX509Certificate_IsPresent(pCertificate))
     140        return RTCrPkixPubKeyCanHandleDigestType(&pCertificate->TbsCertificate.SubjectPublicKeyInfo, enmDigestType, pErrInfo);
     141    return false;
     142}
     143
  • trunk/src/VBox/Runtime/common/crypto/x509-core.cpp

    r82968 r84248  
    170170    {
    171171        if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA))
     172            return 0;
     173    }
     174    else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224))
     175    {
     176        if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA))
     177            return 0;
     178    }
     179    else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256))
     180    {
     181        if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA))
    172182            return 0;
    173183    }
     
    219229            || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA))
    220230            return RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA;
     231        if (   !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224)
     232            || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA))
     233            return RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA;
     234        if (   !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256)
     235            || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA))
     236            return RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA;
    221237
    222238        /* if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
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