Juan Lang : cryptnet: Implement getting the certificate issuer URL from a cert' s authority info access extension.
Alexandre Julliard
julliard at winehq.org
Fri Dec 4 09:11:26 CST 2009
Module: wine
Branch: master
Commit: 59820c2e5cdd915399687968f381914e0923dac5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=59820c2e5cdd915399687968f381914e0923dac5
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Dec 3 10:53:45 2009 -0800
cryptnet: Implement getting the certificate issuer URL from a cert's authority info access extension.
---
dlls/cryptnet/cryptnet_main.c | 145 +++++++++++++++++++++------------------
dlls/cryptnet/tests/cryptnet.c | 1 -
2 files changed, 78 insertions(+), 68 deletions(-)
diff --git a/dlls/cryptnet/cryptnet_main.c b/dlls/cryptnet/cryptnet_main.c
index 34bbc58..fef7837 100644
--- a/dlls/cryptnet/cryptnet_main.c
+++ b/dlls/cryptnet/cryptnet_main.c
@@ -120,61 +120,6 @@ static const char *url_oid_to_str(LPCSTR oid)
typedef BOOL (WINAPI *UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD,
PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID);
-static LPWSTR name_value_to_str(CERT_NAME_BLOB *name)
-{
- DWORD len = CertNameToStrW(X509_ASN_ENCODING, name, CERT_SIMPLE_NAME_STR,
- NULL, 0);
- LPWSTR str = NULL;
-
- if (len)
- {
- str = CryptMemAlloc(len * sizeof(WCHAR));
- if (str)
- CertNameToStrW(X509_ASN_ENCODING, name, CERT_SIMPLE_NAME_STR,
- str, len);
- }
- return str;
-}
-
-static void dump_alt_name_entry(CERT_ALT_NAME_ENTRY *entry)
-{
- LPWSTR str;
-
- switch (entry->dwAltNameChoice)
- {
- case CERT_ALT_NAME_OTHER_NAME:
- TRACE("CERT_ALT_NAME_OTHER_NAME, oid = %s\n",
- debugstr_a(entry->u.pOtherName->pszObjId));
- break;
- case CERT_ALT_NAME_RFC822_NAME:
- TRACE("CERT_ALT_NAME_RFC822_NAME: %s\n",
- debugstr_w(entry->u.pwszRfc822Name));
- break;
- case CERT_ALT_NAME_DNS_NAME:
- TRACE("CERT_ALT_NAME_DNS_NAME: %s\n",
- debugstr_w(entry->u.pwszDNSName));
- break;
- case CERT_ALT_NAME_DIRECTORY_NAME:
- str = name_value_to_str(&entry->u.DirectoryName);
- TRACE("CERT_ALT_NAME_DIRECTORY_NAME: %s\n", debugstr_w(str));
- CryptMemFree(str);
- break;
- case CERT_ALT_NAME_URL:
- TRACE("CERT_ALT_NAME_URL: %s\n", debugstr_w(entry->u.pwszURL));
- break;
- case CERT_ALT_NAME_IP_ADDRESS:
- TRACE("CERT_ALT_NAME_IP_ADDRESS: %d bytes\n",
- entry->u.IPAddress.cbData);
- break;
- case CERT_ALT_NAME_REGISTERED_ID:
- TRACE("CERT_ALT_NAME_REGISTERED_ID: %s\n",
- debugstr_a(entry->u.pszRegisteredID));
- break;
- default:
- TRACE("dwAltNameChoice = %d\n", entry->dwAltNameChoice);
- }
-}
-
static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid,
LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
@@ -200,23 +145,89 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid,
&aia, &size);
if (ret)
{
- DWORD i;
+ DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
- TRACE("%d access descriptions:\n", aia->cAccDescr);
- for (i = 0; i < aia->cAccDescr; i++)
- {
+ for (i = 0, cUrl = 0; i < aia->cAccDescr; i++)
if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
- szOID_PKIX_OCSP))
- TRACE("OCSP:\n");
- else if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
szOID_PKIX_CA_ISSUERS))
- TRACE("CA issuers:\n");
- dump_alt_name_entry(&aia->rgAccDescr[i].AccessLocation);
+ {
+ if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice ==
+ CERT_ALT_NAME_URL)
+ {
+ if (aia->rgAccDescr[i].AccessLocation.u.pwszURL)
+ {
+ cUrl++;
+ bytesNeeded += sizeof(LPWSTR) +
+ (lstrlenW(aia->rgAccDescr[i].AccessLocation.u.
+ pwszURL) + 1) * sizeof(WCHAR);
+ }
+ }
+ else
+ FIXME("unsupported alt name type %d\n",
+ aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
+ }
+ if (!pcbUrlArray)
+ {
+ SetLastError(E_INVALIDARG);
+ ret = FALSE;
+ }
+ else if (!pUrlArray)
+ *pcbUrlArray = bytesNeeded;
+ else if (*pcbUrlArray < bytesNeeded)
+ {
+ SetLastError(ERROR_MORE_DATA);
+ *pcbUrlArray = bytesNeeded;
+ ret = FALSE;
+ }
+ else
+ {
+ LPWSTR nextUrl;
+
+ *pcbUrlArray = bytesNeeded;
+ pUrlArray->cUrl = 0;
+ pUrlArray->rgwszUrl =
+ (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
+ nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
+ + cUrl * sizeof(LPWSTR));
+ for (i = 0; i < aia->cAccDescr; i++)
+ if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+ szOID_PKIX_CA_ISSUERS))
+ {
+ if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice
+ == CERT_ALT_NAME_URL)
+ {
+ if (aia->rgAccDescr[i].AccessLocation.u.pwszURL)
+ {
+ lstrcpyW(nextUrl,
+ aia->rgAccDescr[i].AccessLocation.u.pwszURL);
+ pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
+ nextUrl;
+ nextUrl += (lstrlenW(nextUrl) + 1);
+ }
+ }
+ }
+ }
+ if (ret)
+ {
+ if (pcbUrlInfo)
+ {
+ FIXME("url info: stub\n");
+ if (!pUrlInfo)
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
+ {
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ SetLastError(ERROR_MORE_DATA);
+ ret = FALSE;
+ }
+ else
+ {
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
+ }
+ }
}
LocalFree(aia);
- FIXME("authority info access unsupported\n");
- SetLastError(CRYPT_E_NOT_FOUND);
- ret = FALSE;
}
}
else
diff --git a/dlls/cryptnet/tests/cryptnet.c b/dlls/cryptnet/tests/cryptnet.c
index acbfa32..83060b6 100644
--- a/dlls/cryptnet/tests/cryptnet.c
+++ b/dlls/cryptnet/tests/cryptnet.c
@@ -265,7 +265,6 @@ static void test_getObjectUrl(void)
*/
ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_ISSUER,
(void *)cert, 0, NULL, &urlArraySize, NULL, NULL, NULL);
- todo_wine
ok(ret, "CryptGetObjectUrl failed: %08x\n", GetLastError());
if (ret)
{
More information about the wine-cvs
mailing list