Changeset 84248 in vbox for trunk/src/VBox/Runtime/common/crypto
- Timestamp:
- May 11, 2020 11:46:40 AM (5 years ago)
- 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 426 426 case RTDIGESTTYPE_SHA384: return RTCRX509ALGORITHMIDENTIFIERID_SHA384; 427 427 case RTDIGESTTYPE_SHA512: return RTCRX509ALGORITHMIDENTIFIERID_SHA512; 428 case RTDIGESTTYPE_SHA512T224: return RTCRX509ALGORITHMIDENTIFIERID_SHA512T224; 429 case RTDIGESTTYPE_SHA512T256: return RTCRX509ALGORITHMIDENTIFIERID_SHA512T256; 428 430 default: return NULL; 429 431 } -
trunk/src/VBox/Runtime/common/crypto/iprt-openssl.cpp
r84230 r84248 36 36 # include <iprt/mem.h> 37 37 # include <iprt/asn1.h> 38 # include <iprt/crypto/digest.h> 38 39 39 40 # include "internal/iprt-openssl.h" … … 146 147 } 147 148 149 150 DECLHIDDEN(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 148 171 #endif /* IPRT_WITH_OPENSSL */ 149 172 -
trunk/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp
r84235 r84248 85 85 86 86 RTDECL(int) RTCrPkcs7SimpleSignSignedData(uint32_t fFlags, PCRTCRX509CERTIFICATE pSigner, RTCRKEY hPrivateKey, 87 void const *pvData, size_t cbData, RT CRSTORE 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) 89 89 { 90 90 size_t const cbResultBuf = *pcbResult; 91 91 *pcbResult = 0; 92 92 AssertReturn(!(fFlags & ~RTCRPKCS7SIGN_SD_F_VALID_MASK), VERR_INVALID_FLAGS); 93 #if defined(IPRT_WITH_OPENSSL)93 #ifdef IPRT_WITH_OPENSSL 94 94 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 } 95 105 96 106 /* … … 125 135 * Do the signing. 126 136 */ 127 unsigned int fOsslSign = CMS_BINARY ;137 unsigned int fOsslSign = CMS_BINARY | CMS_PARTIAL; 128 138 if (fFlags & RTCRPKCS7SIGN_SD_F_DEATCHED) 129 139 fOsslSign |= CMS_DETACHED; 130 140 if (fFlags & RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP) 131 141 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) 134 144 { 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) 140 146 { 141 rc = i2d_CMS_bio(pOsslResult, pCms);147 rc = CMS_final(pCms, pOsslData, NULL /*dcont*/, fOsslSign); 142 148 if (rc > 0) 143 149 { 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) 147 155 { 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) 152 158 { 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"); 155 177 } 156 178 else 157 rc = VERR_BUFFER_OVERFLOW;158 *pcbResult = cbResult;179 rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_CMS_bio"); 180 BIO_free(pOsslResult); 159 181 } 160 182 else 161 rc = RTErrInfoSet(pErrInfo, VERR_ GENERAL_FAILURE, "BIO_get_mem_ptr");183 rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "BIO_new/BIO_s_mem"); 162 184 } 163 185 else 164 rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_CMS_bio"); 165 BIO_free(pOsslResult); 186 rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_final"); 166 187 } 167 188 else 168 rc = RTErrInfoSet(pErrInfo, VERR_ NO_MEMORY, "BIO_new/BIO_s_mem");189 rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_add1_signer"); 169 190 CMS_ContentInfo_free(pCms); 170 191 } … … 180 201 return rc; 181 202 #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); 183 204 *pcbResult = 0; 184 205 return VERR_NOT_IMPLEMENTED; -
trunk/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp
r82968 r84248 81 81 * @{ */ 82 82 static 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,0x1083 {/* { { 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 85 85 }; 86 86 static 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,0x1087 {/* { { 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 89 89 }; 90 90 static 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,0x1091 {/* { { 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 93 93 }; 94 94 static 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,0x1495 {/* { { 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 97 97 }; 98 98 static 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,0x2099 {/* { { 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 101 101 }; 102 102 static 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,0x30103 {/* { { 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 105 105 }; 106 106 static 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,0x40107 {/* { { 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 109 109 }; 110 110 static 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 }; 114 static 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 }; 118 static 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 113 121 }; 114 122 /** @} */ … … 122 130 } const g_aDigestInfos[] = 123 131 { 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)}, 132 142 }; 133 143 … … 464 474 }; 465 475 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 */ 484 static 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 509 RTDECL(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 518 RTDECL(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 32 32 #include <iprt/crypto/pkix.h> 33 33 34 #include <iprt/errcore.h> 34 #include <iprt/asn1.h> 35 #include <iprt/assert.h> 36 #include <iprt/err.h> 35 37 #include <iprt/string.h> 38 #include <iprt/crypto/rsa.h> 36 39 37 40 #ifdef IPRT_WITH_OPENSSL … … 92 95 } 93 96 97 98 RTDECL(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 137 RTDECL(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 170 170 { 171 171 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)) 172 182 return 0; 173 183 } … … 219 229 || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA)) 220 230 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; 221 237 222 238 /* if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
Note:
See TracChangeset
for help on using the changeset viewer.