From 421670c3c75b1079b2d107b1dc8335cba65cfbab Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Wed, 27 Aug 2008 10:17:09 -0700 Subject: [PATCH] Implement authority info access encoding --- dlls/crypt32/encode.c | 82 +++++++++++++++++++++++++++++++++++++++++++ dlls/crypt32/tests/encode.c | 5 --- 2 files changed, 82 insertions(+), 5 deletions(-) diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c index c935396..0bcdad8 100644 --- a/dlls/crypt32/encode.c +++ b/dlls/crypt32/encode.c @@ -2347,6 +2347,83 @@ static BOOL WINAPI CRYPT_AsnEncodeAuthor return ret; } +static BOOL WINAPI CRYPT_AsnEncodeAccessDescription( + const CERT_ACCESS_DESCRIPTION *descr, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + struct AsnEncodeSequenceItem items[] = { + { descr->pszAccessMethod, CRYPT_AsnEncodeOid, 0 }, + { &descr->AccessLocation, CRYPT_AsnEncodeAltNameEntry, 0 }, + }; + + if (!descr->pszAccessMethod) + { + SetLastError(E_INVALIDARG); + return FALSE; + } + return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, + sizeof(items) / sizeof(items[0]), 0, NULL, pbEncoded, pcbEncoded); +} + +static BOOL WINAPI CRYPT_AsnEncodeAuthorityInfoAccess(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret; + + __TRY + { + DWORD bytesNeeded, dataLen, lenBytes, i; + const CERT_AUTHORITY_INFO_ACCESS *info = + (const CERT_AUTHORITY_INFO_ACCESS *)pvStructInfo; + + ret = TRUE; + for (i = 0, dataLen = 0; ret && i < info->cAccDescr; i++) + { + DWORD size; + + ret = CRYPT_AsnEncodeAccessDescription(&info->rgAccDescr[i], NULL, + &size); + if (ret) + dataLen += size; + } + if (ret) + { + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else + { + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, + pbEncoded, pcbEncoded, bytesNeeded))) + { + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < info->cAccDescr; i++) + { + DWORD size = dataLen; + + ret = CRYPT_AsnEncodeAccessDescription( + &info->rgAccDescr[i], pbEncoded, &size); + pbEncoded += size; + dataLen -= size; + } + } + } + } + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + ret = FALSE; + } + __ENDTRY + return ret; +} + static BOOL WINAPI CRYPT_AsnEncodeBasicConstraints(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) @@ -3762,6 +3839,9 @@ static CryptEncodeObjectExFunc CRYPT_Get case LOWORD(X509_AUTHORITY_KEY_ID2): encodeFunc = CRYPT_AsnEncodeAuthorityKeyId2; break; + case LOWORD(X509_AUTHORITY_INFO_ACCESS): + encodeFunc = CRYPT_AsnEncodeAuthorityInfoAccess; + break; case LOWORD(X509_SEQUENCE_OF_ANY): encodeFunc = CRYPT_AsnEncodeSequenceOfAny; break; @@ -3832,6 +3912,8 @@ static CryptEncodeObjectExFunc CRYPT_Get encodeFunc = CRYPT_AsnEncodeIssuingDistPoint; else if (!strcmp(lpszStructType, szOID_NAME_CONSTRAINTS)) encodeFunc = CRYPT_AsnEncodeNameConstraints; + else if (!strcmp(lpszStructType, szOID_AUTHORITY_INFO_ACCESS)) + encodeFunc = CRYPT_AsnEncodeAuthorityInfoAccess; return encodeFunc; } diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 01d05c9..d4d19aa 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -4799,7 +4799,6 @@ static void test_encodeAuthorityInfoAcce /* Having no access descriptions is allowed */ ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) { @@ -4813,7 +4812,6 @@ static void test_encodeAuthorityInfoAcce aia.rgAccDescr = accessDescription; ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); /* It can't have an empty location */ @@ -4821,14 +4819,12 @@ static void test_encodeAuthorityInfoAcce SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); accessDescription[0].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; accessDescription[0].AccessLocation.pwszURL = (LPWSTR)url; ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) { @@ -4849,7 +4845,6 @@ static void test_encodeAuthorityInfoAcce aia.cAccDescr = 2; ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) { -- 1.4.1