ReactOS 0.4.17-dev-357-ga8f14ff
cryptnet_main.c File Reference
#include <share.h>
#include <stdio.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winnt.h"
#include "winnls.h"
#include "wininet.h"
#include "objbase.h"
#include "wincrypt.h"
#include "initguid.h"
#include "knownfolders.h"
#include "shlobj.h"
#include "wine/debug.h"
Include dependency graph for cryptnet_main.c:

Go to the source code of this file.

Classes

struct  InetContext
 
struct  _CERT_REVOCATION_PARA_NO_EXTRA_FIELDS
 
struct  _OLD_CERT_REVOCATION_STATUS
 

Macros

#define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS
 
#define IS_INTOID(x)   (((ULONG_PTR)(x) >> 16) == 0)
 
#define _x(oid)   case LOWORD(oid): return #oid
 
#define CACHED_CERT_HASH_SIZE   20
 

Typedefs

typedef BOOL(WINAPIUrlDllGetObjectUrlFunc) (LPCSTR, LPVOID, DWORD, PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID)
 
typedef BOOL(WINAPISchemeDllRetrieveEncodedObjectW) (LPCWSTR pwszUrl, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
typedef BOOL(WINAPIAddContextToStore) (HCERTSTORE hCertStore, const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext)
 
typedef BOOL(WINAPIContextDllCreateObjectContext) (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
typedef struct _CERT_REVOCATION_PARA_NO_EXTRA_FIELDS CERT_REVOCATION_PARA_NO_EXTRA_FIELDS
 
typedef struct _OLD_CERT_REVOCATION_STATUS OLD_CERT_REVOCATION_STATUS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (cryptnet)
 
HRESULT WINAPI DllRegisterServer (void)
 
HRESULT WINAPI DllUnregisterServer (void)
 
static const charurl_oid_to_str (LPCSTR oid)
 
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)
 
static BOOL CRYPT_GetUrlFromCRLDistPointsExt (const CRYPT_DATA_BLOB *value, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo)
 
static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint (LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
 
BOOL WINAPI CryptGetObjectUrl (LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
 
BOOL WINAPI CryptRetrieveObjectByUrlA (LPCSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static void WINAPI CRYPT_FreeBlob (LPCSTR pszObjectOid, PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
 
static BOOL CRYPT_GetObjectFromFile (HANDLE hFile, PCRYPT_BLOB_ARRAY pObject)
 
static BOOL CRYPT_GetObjectFromCache (LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static BOOL CRYPT_CrackUrl (LPCWSTR pszURL, URL_COMPONENTSW *components)
 
static struct InetContextCRYPT_MakeInetContext (DWORD dwTimeout)
 
static BOOL CRYPT_DownloadObject (DWORD dwRetrievalFlags, HINTERNET hHttp, struct InetContext *context, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static void CRYPT_CacheURL (LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, DWORD dwRetrievalFlags, FILETIME expires)
 
static void CALLBACK CRYPT_InetStatusCallback (HINTERNET hInt, DWORD_PTR dwContext, DWORD status, void *statusInfo, DWORD statusInfoLen)
 
static BOOL CRYPT_Connect (const URL_COMPONENTSW *components, struct InetContext *context, PCRYPT_CREDENTIALS pCredentials, HINTERNET *phInt, HINTERNET *phHost)
 
static BOOL WINAPI FTP_RetrieveEncodedObjectW (LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static BOOL WINAPI HTTP_RetrieveEncodedObjectW (LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static BOOL WINAPI File_RetrieveEncodedObjectW (LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static BOOL CRYPT_GetRetrieveFunction (LPCWSTR pszURL, SchemeDllRetrieveEncodedObjectW *pFunc, HCRYPTOIDFUNCADDR *phFunc)
 
static BOOL WINAPI CRYPT_CreateBlob (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL decode_base64_blob (const CRYPT_DATA_BLOB *in, CRYPT_DATA_BLOB *out)
 
static BOOL CRYPT_CreateContext (const CRYPT_BLOB_ARRAY *pObject, DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)
 
static BOOL WINAPI CRYPT_CreateCert (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL WINAPI CRYPT_CreateCRL (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL WINAPI CRYPT_CreateCTL (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL WINAPI CRYPT_CreatePKCS7 (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL WINAPI CRYPT_CreateAny (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
 
static BOOL CRYPT_GetCreateFunction (LPCSTR pszObjectOid, ContextDllCreateObjectContext *pFunc, HCRYPTOIDFUNCADDR *phFunc)
 
static BOOL CRYPT_GetExpiration (const void *object, const char *pszObjectOid, FILETIME *expiration)
 
BOOL WINAPI CryptRetrieveObjectByUrlW (LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
 
static FILEopen_cached_revocation_file (const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const WCHAR *mode, int sharing)
 
static BOOL find_cached_revocation_status (const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, CERT_REVOCATION_STATUS *status)
 
static void cache_revocation_status (const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, const CERT_REVOCATION_STATUS *status)
 
static DWORD verify_cert_revocation_with_crl_online (const CERT_CONTEXT *cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
 
static const CRL_CONTEXTretrieve_crl_from_dist_points (const CRYPT_URL_ARRAY *array, DWORD verify_flags, DWORD timeout)
 
static DWORD verify_cert_revocation_from_dist_points_ext (const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *time, DWORD flags, const CERT_REVOCATION_PARA *params, CERT_REVOCATION_STATUS *status, FILETIME *next_update)
 
static void sha1_hash (const BYTE *data, DWORD datalen, BYTE *buf, DWORD *buflen)
 
static BYTEbuild_ocsp_request (const CERT_CONTEXT *cert, const CERT_CONTEXT *issuer_cert, DWORD *ret_size)
 
static void escape_path (const WCHAR *src, DWORD src_len, WCHAR *dst, DWORD *dst_len)
 
static WCHARbuild_request_path (const BYTE *data, DWORD data_size)
 
static WCHARbuild_request_url (const WCHAR *base_url, const BYTE *data, DWORD data_size)
 
static DWORD map_ocsp_status (DWORD status)
 
static BOOL match_cert_id (const OCSP_CERT_ID *id, const CERT_INFO *cert, const CERT_INFO *issuer)
 
static DWORD check_ocsp_response_info (const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, DWORD *status, FILETIME *next_update)
 
static DWORD verify_signed_ocsp_response_info (const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, FILETIME *next_update)
 
static DWORD handle_ocsp_response (const CERT_INFO *cert, const CERT_INFO *issuer, const BYTE *encoded, DWORD encoded_size, FILETIME *next_update)
 
static DWORD verify_cert_revocation_with_ocsp (const CERT_CONTEXT *cert, const WCHAR *base_url, const CERT_REVOCATION_PARA *revpara, FILETIME *next_update)
 
static DWORD verify_cert_revocation_from_aia_ext (const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus, FILETIME *next_update)
 
static DWORD verify_cert_revocation_with_crl_offline (PCCERT_CONTEXT cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
 
static DWORD verify_cert_revocation (const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus)
 
BOOL WINAPI CertDllVerifyRevocation (DWORD dwEncodingType, DWORD dwRevType, DWORD cContext, PVOID rgpvContext[], DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus)
 

Variables

static const char revocation_cache_signature [] = "Wine cached revocation"
 

Macro Definition Documentation

◆ _x

#define _x (   oid)    case LOWORD(oid): return #oid

◆ CACHED_CERT_HASH_SIZE

#define CACHED_CERT_HASH_SIZE   20

Definition at line 1560 of file cryptnet_main.c.

◆ CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS

#define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS

Definition at line 21 of file cryptnet_main.c.

◆ IS_INTOID

#define IS_INTOID (   x)    (((ULONG_PTR)(x) >> 16) == 0)

Definition at line 45 of file cryptnet_main.c.

Typedef Documentation

◆ AddContextToStore

typedef BOOL(WINAPI * AddContextToStore) (HCERTSTORE hCertStore, const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext)

Definition at line 1185 of file cryptnet_main.c.

◆ CERT_REVOCATION_PARA_NO_EXTRA_FIELDS

◆ ContextDllCreateObjectContext

typedef BOOL(WINAPI * ContextDllCreateObjectContext) (LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)

Definition at line 1417 of file cryptnet_main.c.

◆ OLD_CERT_REVOCATION_STATUS

◆ SchemeDllRetrieveEncodedObjectW

typedef BOOL(WINAPI * SchemeDllRetrieveEncodedObjectW) (LPCWSTR pwszUrl, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)

Definition at line 1078 of file cryptnet_main.c.

◆ UrlDllGetObjectUrlFunc

typedef BOOL(WINAPI * UrlDllGetObjectUrlFunc) (LPCSTR, LPVOID, DWORD, PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID)

Definition at line 118 of file cryptnet_main.c.

Function Documentation

◆ build_ocsp_request()

static BYTE * build_ocsp_request ( const CERT_CONTEXT cert,
const CERT_CONTEXT issuer_cert,
DWORD ret_size 
)
static

Definition at line 1788 of file cryptnet_main.c.

1789{
1792 OCSP_SIGNED_REQUEST_INFO request_signed;
1793 CERT_INFO *issuer = issuer_cert->pCertInfo;
1794 BYTE issuer_name_hash[20], issuer_key_hash[20], *buf, *ret;
1795 DWORD size = 0, hash_len = sizeof(issuer_name_hash);
1796
1797 memset(&entry, 0, sizeof(entry));
1798 entry.CertId.HashAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1;
1799
1800 sha1_hash(issuer->Subject.pbData, issuer->Subject.cbData, issuer_name_hash, &hash_len);
1801 entry.CertId.IssuerNameHash.cbData = sizeof(issuer_name_hash);
1802 entry.CertId.IssuerNameHash.pbData = issuer_name_hash;
1803
1804 sha1_hash(issuer->SubjectPublicKeyInfo.PublicKey.pbData, issuer->SubjectPublicKeyInfo.PublicKey.cbData,
1805 issuer_key_hash, &hash_len);
1806 entry.CertId.IssuerKeyHash.cbData = sizeof(issuer_key_hash);
1807 entry.CertId.IssuerKeyHash.pbData = issuer_key_hash;
1808
1809 entry.CertId.SerialNumber.cbData = cert->pCertInfo->SerialNumber.cbData;
1810 entry.CertId.SerialNumber.pbData = cert->pCertInfo->SerialNumber.pbData;
1811
1812 request.dwVersion = OCSP_REQUEST_V1;
1813 request.pRequestorName = NULL;
1814 request.cRequestEntry = 1;
1815 request.rgRequestEntry = &entry;
1816 request.cExtension = 0;
1817 request.rgExtension = NULL;
1819 {
1820 ERR("failed to encode request %#lx\n", GetLastError());
1821 return NULL;
1822 }
1823
1824 request_signed.ToBeSigned.pbData = buf;
1825 request_signed.ToBeSigned.cbData = size;
1826 request_signed.pOptionalSignatureInfo = NULL;
1828 &ret, &size))
1829 {
1830 ERR("failed to encode signed request %#lx\n", GetLastError());
1831 LocalFree(buf);
1832 return NULL;
1833 }
1834
1835 LocalFree(buf);
1836 *ret_size = size;
1837 return ret;
1838}
#define ERR(fmt,...)
Definition: precomp.h:57
static void sha1_hash(const BYTE *data, DWORD datalen, BYTE *buf, DWORD *buflen)
#define NULL
Definition: types.h:112
BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded)
Definition: encode.c:4696
static WCHAR issuer[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1905
return ret
Definition: mutex.c:146
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
uint32_t entry
Definition: isohybrid.c:63
static BYTE cert[]
Definition: msg.c:1374
static void ULONG ULONG * ret_size
Definition: time.c:40
#define memset(x, y, z)
Definition: compat.h:39
PCERT_INFO pCertInfo
Definition: wincrypt.h:491
BYTE * pbData
Definition: wincrypt.h:112
Definition: wincrypt.h:654
POCSP_SIGNATURE_INFO pOptionalSignatureInfo
Definition: wincrypt.h:644
CRYPT_DER_BLOB ToBeSigned
Definition: wincrypt.h:643
Definition: tftpd.h:86
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define OCSP_REQUEST_V1
Definition: wincrypt.h:660
#define X509_ASN_ENCODING
Definition: wincrypt.h:2501
#define szOID_OIWSEC_sha1
Definition: wincrypt.h:3253
#define CRYPT_ENCODE_ALLOC_FLAG
Definition: wincrypt.h:3599
#define OCSP_REQUEST
Definition: wincrypt.h:3588
#define OCSP_SIGNED_REQUEST
Definition: wincrypt.h:3587
unsigned char BYTE
Definition: xxhash.c:193

Referenced by verify_cert_revocation_with_ocsp().

◆ build_request_path()

static WCHAR * build_request_path ( const BYTE data,
DWORD  data_size 
)
static

Definition at line 1864 of file cryptnet_main.c.

1865{
1866 WCHAR *path, *ret;
1868
1870 if (!(path = malloc(path_len * sizeof(WCHAR)))) return NULL;
1872
1874 if (!(ret = malloc((ret_len + 2) * sizeof(WCHAR))))
1875 {
1876 free(path);
1877 return NULL;
1878 }
1880 ret[ret_len + 1] = 0;
1881 ret[0] = '/';
1882
1883 free(path);
1884 return ret;
1885}
static void escape_path(const WCHAR *src, DWORD src_len, WCHAR *dst, DWORD *dst_len)
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
BOOL WINAPI CryptBinaryToStringW(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, DWORD *pcchString)
Definition: base64.c:473
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static DWORD path_len
Definition: batch.c:31
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
Definition: process.c:81
short WCHAR
Definition: pedump.c:58
#define CRYPT_STRING_BASE64
Definition: wincrypt.h:3132
#define CRYPT_STRING_NOCRLF
Definition: wincrypt.h:3149

Referenced by build_request_url().

◆ build_request_url()

static WCHAR * build_request_url ( const WCHAR base_url,
const BYTE data,
DWORD  data_size 
)
static

Definition at line 1887 of file cryptnet_main.c.

1888{
1889 WCHAR *path, *ret;
1890 DWORD len = 0;
1891
1892 if (!(path = build_request_path(data, data_size))) return NULL;
1893 len = (wcslen(base_url) + wcslen(path) + 1) * sizeof(WCHAR);
1894 if (!(ret = malloc(len * sizeof(WCHAR))))
1895 {
1896 free(path);
1897 return NULL;
1898 }
1900 wcscat(ret, path);
1901 free(path);
1902 TRACE("-> %s.\n", debugstr_w(ret));
1903 return ret;
1904}
static WCHAR * build_request_path(const BYTE *data, DWORD data_size)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
GLenum GLsizei len
Definition: glext.h:6722
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * base_url
Definition: mimeole.c:1439
wcscat
wcscpy
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by verify_cert_revocation_with_ocsp().

◆ cache_revocation_status()

static void cache_revocation_status ( const CERT_CONTEXT cert,
const CERT_REVOCATION_PARA params,
const FILETIME time,
const CERT_REVOCATION_STATUS status 
)
static

Definition at line 1668 of file cryptnet_main.c.

1670{
1671 FILE *file;
1672
1674 return;
1676 fwrite(time, sizeof(*time), 1, file);
1677 fwrite(&status->dwError, sizeof(status->dwError), 1, file);
1678 if (status->dwError == CERT_E_REVOKED)
1679 fwrite(&status->dwReason, sizeof(status->dwReason), 1, file);
1680 fclose(file);
1681}
static FILE * open_cached_revocation_file(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const WCHAR *mode, int sharing)
static const char revocation_cache_signature[]
int CDECL fclose(FILE *file)
Definition: file.c:3757
size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE *file)
Definition: file.c:4129
#define _SH_DENYRW
Definition: share.h:37
#define L(x)
Definition: resources.c:13
GLenum const GLfloat * params
Definition: glext.h:5645
__u16 time
Definition: mkdosfs.c:8
Definition: fci.c:127
Definition: ps.c:97
#define CERT_E_REVOKED
Definition: winerror.h:4642

Referenced by verify_cert_revocation().

◆ CertDllVerifyRevocation()

BOOL WINAPI CertDllVerifyRevocation ( DWORD  dwEncodingType,
DWORD  dwRevType,
DWORD  cContext,
PVOID  rgpvContext[],
DWORD  dwFlags,
PCERT_REVOCATION_PARA  pRevPara,
PCERT_REVOCATION_STATUS  pRevStatus 
)

Definition at line 2326 of file cryptnet_main.c.

2329{
2330 DWORD error = 0, i;
2331 FILETIME now;
2332 LPFILETIME pTime = NULL;
2333
2334 TRACE("(%08lx, %ld, %ld, %p, %08lx, %p, %p)\n", dwEncodingType, dwRevType,
2335 cContext, rgpvContext, dwFlags, pRevPara, pRevStatus);
2336
2337 if (pRevStatus->cbSize != sizeof(OLD_CERT_REVOCATION_STATUS) &&
2338 pRevStatus->cbSize != sizeof(CERT_REVOCATION_STATUS))
2339 {
2341 return FALSE;
2342 }
2343 if (!cContext)
2344 {
2346 return FALSE;
2347 }
2348 if (pRevPara && pRevPara->cbSize >=
2350 pTime = pRevPara->pftTimeToUse;
2351 if (!pTime)
2352 {
2354 pTime = &now;
2355 }
2356 memset(&pRevStatus->dwIndex, 0, pRevStatus->cbSize - sizeof(DWORD));
2357 if (dwRevType != CERT_CONTEXT_REVOCATION_TYPE)
2359 else
2360 {
2361 for (i = 0; i < cContext; i++)
2362 {
2363 if ((error = verify_cert_revocation(rgpvContext[i], pTime, dwFlags, pRevPara, pRevStatus)))
2364 {
2365 pRevStatus->dwIndex = i;
2366 break;
2367 }
2368 }
2369 }
2370 if (error)
2371 {
2373 pRevStatus->dwError = error;
2374 }
2375 TRACE("returning %d (%08lx)\n", !error, error);
2376 return !error;
2377}
static DWORD verify_cert_revocation(const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus)
#define E_INVALIDARG
Definition: ddrawi.h:101
#define FALSE
Definition: types.h:117
#define SetLastError(x)
Definition: compat.h:752
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
time_t now
Definition: finger.c:65
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define error(str)
Definition: mkdosfs.c:1605
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
LPFILETIME pftTimeToUse
Definition: wincrypt.h:920
#define CERT_CONTEXT_REVOCATION_TYPE
Definition: wincrypt.h:930
#define CRYPT_E_NO_REVOCATION_CHECK
Definition: winerror.h:4435

◆ check_ocsp_response_info()

static DWORD check_ocsp_response_info ( const CERT_INFO cert,
const CERT_INFO issuer,
const CRYPT_OBJID_BLOB blob,
DWORD status,
FILETIME next_update 
)
static

Definition at line 1943 of file cryptnet_main.c.

1945{
1947 DWORD size, i;
1948
1949 memset(next_update, 0, sizeof(*next_update));
1952
1953 FIXME("check responder id\n");
1954 for (i = 0; i < info->cResponseEntry; i++)
1955 {
1956 OCSP_BASIC_RESPONSE_ENTRY *entry = &info->rgResponseEntry[i];
1957 if (match_cert_id(&entry->CertId, cert, issuer))
1958 {
1959 *status = map_ocsp_status(entry->dwCertStatus);
1960 *next_update = entry->NextUpdate;
1961 }
1962 }
1963
1964 LocalFree(info);
1965 return ERROR_SUCCESS;
1966}
#define FIXME(fmt,...)
Definition: precomp.h:53
BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
Definition: decode.c:6286
static DWORD map_ocsp_status(DWORD status)
static BOOL match_cert_id(const OCSP_CERT_ID *id, const CERT_INFO *cert, const CERT_INFO *issuer)
#define ERROR_SUCCESS
Definition: deptool.c:10
Definition: wincrypt.h:700
Definition: image.c:134
#define OCSP_BASIC_RESPONSE
Definition: wincrypt.h:3591
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3612

Referenced by verify_signed_ocsp_response_info().

◆ CRYPT_CacheURL()

static void CRYPT_CacheURL ( LPCWSTR  pszURL,
const CRYPT_BLOB_ARRAY pObject,
DWORD  dwRetrievalFlags,
FILETIME  expires 
)
static

Definition at line 730 of file cryptnet_main.c.

732{
733 WCHAR cacheFileName[MAX_PATH];
734 HANDLE hCacheFile;
735 DWORD size = 0, entryType;
736 FILETIME ft;
737
740 {
742
743 if (!info)
744 {
745 ERR("out of memory\n");
746 return;
747 }
748
749 if (GetUrlCacheEntryInfoW(pszURL, info, &size))
750 {
751 lstrcpyW(cacheFileName, info->lpszLocalFileName);
752 /* Check if the existing cache entry is up to date. If it isn't,
753 * remove the existing cache entry, and create a new one with the
754 * new value.
755 */
757 if (CompareFileTime(&info->ExpireTime, &ft) < 0)
758 {
759 DeleteUrlCacheEntryW(pszURL);
760 }
761 else
762 {
763 info->ExpireTime = expires;
766 return;
767 }
768 }
770 }
771
772 if (!CreateUrlCacheEntryW(pszURL, pObject->rgBlob[0].cbData, NULL, cacheFileName, 0))
773 return;
774
775 hCacheFile = CreateFileW(cacheFileName, GENERIC_WRITE, 0,
777 if(hCacheFile == INVALID_HANDLE_VALUE)
778 return;
779
780 WriteFile(hCacheFile, pObject->rgBlob[0].pbData,
781 pObject->rgBlob[0].cbData, &size, NULL);
782 CloseHandle(hCacheFile);
783
784 if (!(dwRetrievalFlags & CRYPT_STICKY_CACHE_RETRIEVAL))
785 entryType = NORMAL_CACHE_ENTRY;
786 else
787 entryType = STICKY_CACHE_ENTRY;
788 memset(&ft, 0, sizeof(ft));
789 CommitUrlCacheEntryW(pszURL, cacheFileName, expires, ft, entryType,
790 NULL, 0, NULL, NULL);
791}
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
Definition: main.c:131
VOID WINAPI CryptMemFree(LPVOID pv)
Definition: main.c:141
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define lstrcpyW
Definition: compat.h:749
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
BOOL WINAPI SetUrlCacheEntryInfoW(LPCWSTR lpszUrl, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, DWORD dwFieldControl)
Definition: urlcache.c:2079
BOOL WINAPI GetUrlCacheEntryInfoW(LPCWSTR lpszUrl, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, LPDWORD lpdwCacheEntryInfoBufferSize)
Definition: urlcache.c:2012
BOOL WINAPI CreateUrlCacheEntryW(LPCWSTR lpszUrlName, DWORD dwExpectedFileSize, LPCWSTR lpszFileExtension, LPWSTR lpszFileName, DWORD dwReserved)
Definition: urlcache.c:2815
BOOL WINAPI CommitUrlCacheEntryW(LPCWSTR lpszUrlName, LPCWSTR lpszLocalFileName, FILETIME ExpireTime, FILETIME LastModifiedTime, DWORD CacheEntryType, LPWSTR lpHeaderInfo, DWORD dwHeaderSize, LPCWSTR lpszFileExtension, LPCWSTR lpszOriginalUrl)
Definition: urlcache.c:3085
BOOL WINAPI DeleteUrlCacheEntryW(LPCWSTR lpszUrlName)
Definition: urlcache.c:3344
FxObject * pObject
#define GENERIC_WRITE
Definition: nt_native.h:90
Definition: wininet.h:2127
#define CRYPT_STICKY_CACHE_RETRIEVAL
Definition: wincrypt.h:1887
#define CACHE_ENTRY_EXPTIME_FC
Definition: wininet.h:2296
#define NORMAL_CACHE_ENTRY
Definition: wininet.h:2087
#define STICKY_CACHE_ENTRY
Definition: wininet.h:2088

Referenced by CryptRetrieveObjectByUrlW(), and HTTP_RetrieveEncodedObjectW().

◆ CRYPT_Connect()

static BOOL CRYPT_Connect ( const URL_COMPONENTSW components,
struct InetContext context,
PCRYPT_CREDENTIALS  pCredentials,
HINTERNET phInt,
HINTERNET phHost 
)
static

Definition at line 808 of file cryptnet_main.c.

811{
812 BOOL ret;
813
814 TRACE("(%s:%d, %p, %p, %p, %p)\n", debugstr_w(components->lpszHostName),
815 components->nPort, context, pCredentials, phInt, phInt);
816
817 *phHost = NULL;
820 if (*phInt)
821 {
822 DWORD service;
823
824 if (context)
826 switch (components->nScheme)
827 {
829 service = INTERNET_SERVICE_FTP;
830 break;
832 service = INTERNET_SERVICE_HTTP;
833 break;
834 default:
835 service = 0;
836 }
837 /* FIXME: use pCredentials for username/password */
838 *phHost = InternetConnectW(*phInt, components->lpszHostName,
839 components->nPort, NULL, NULL, service, 0, (DWORD_PTR)context);
840 if (!*phHost)
841 {
842 InternetCloseHandle(*phInt);
843 *phInt = NULL;
844 ret = FALSE;
845 }
846 else
847 ret = TRUE;
848 }
849 else
850 ret = FALSE;
851 TRACE("returning %d\n", ret);
852 return ret;
853}
static void CALLBACK CRYPT_InetStatusCallback(HINTERNET hInt, DWORD_PTR dwContext, DWORD status, void *statusInfo, DWORD statusInfoLen)
#define TRUE
Definition: types.h:120
INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(HINTERNET hInternet, INTERNET_STATUS_CALLBACK lpfnIntCB)
Definition: internet.c:2075
BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
Definition: internet.c:1414
HINTERNET WINAPI InternetConnectW(HINTERNET hInternet, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:1258
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
Definition: internet.c:979
unsigned int BOOL
Definition: ntddk_ex.h:94
GLenum GLenum GLuint components
Definition: glext.h:9620
Definition: http.c:7252
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define INTERNET_SCHEME_FTP
Definition: winhttp.h:49
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:47
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define INTERNET_SERVICE_FTP
Definition: wininet.h:560
#define INTERNET_OPEN_TYPE_PRECONFIG
Definition: wininet.h:521
#define INTERNET_SERVICE_HTTP
Definition: wininet.h:562

Referenced by HTTP_RetrieveEncodedObjectW().

◆ CRYPT_CrackUrl()

static BOOL CRYPT_CrackUrl ( LPCWSTR  pszURL,
URL_COMPONENTSW components 
)
static

Definition at line 576 of file cryptnet_main.c.

577{
578 BOOL ret;
579
580 TRACE("(%s, %p)\n", debugstr_w(pszURL), components);
581
582 memset(components, 0, sizeof(*components));
583 components->dwStructSize = sizeof(*components);
585 components->dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH;
586 if (!components->lpszHostName)
587 {
589 return FALSE;
590 }
591 components->lpszUrlPath = CryptMemAlloc(INTERNET_MAX_PATH_LENGTH * sizeof(WCHAR));
592 components->dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
593 if (!components->lpszUrlPath)
594 {
595 CryptMemFree(components->lpszHostName);
597 return FALSE;
598 }
599
601 if (ret)
602 {
603 switch (components->nScheme)
604 {
606 if (!components->nPort)
608 break;
610 if (!components->nPort)
612 break;
613 default:
614 ; /* do nothing */
615 }
616 }
617 TRACE("returning %d\n", ret);
618 return ret;
619}
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
BOOL WINAPI InternetCrackUrlW(const WCHAR *lpszUrl, DWORD dwUrlLength, DWORD dwFlags, URL_COMPONENTSW *lpUC)
Definition: internet.c:1625
#define ICU_DECODE
Definition: winhttp.h:353
#define INTERNET_DEFAULT_HTTP_PORT
Definition: winhttp.h:41
#define INTERNET_DEFAULT_FTP_PORT
Definition: wininet.h:38
#define INTERNET_MAX_HOST_NAME_LENGTH
Definition: wininet.h:44
#define INTERNET_MAX_PATH_LENGTH
Definition: wininet.h:49

Referenced by HTTP_RetrieveEncodedObjectW().

◆ CRYPT_CreateAny()

static BOOL WINAPI CRYPT_CreateAny ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1327 of file cryptnet_main.c.

1329{
1330 BOOL ret;
1331
1332 if (!pObject->cBlob)
1333 {
1335 *ppvContext = NULL;
1336 ret = FALSE;
1337 }
1338 else
1339 {
1342
1343 if (store)
1344 {
1347
1348 if (memStore)
1349 {
1350 CertAddStoreToCollection(store, memStore,
1352 CertCloseStore(memStore, 0);
1353 }
1354 else
1355 {
1356 CertCloseStore(store, 0);
1357 store = NULL;
1358 }
1359 }
1360 if (store)
1361 {
1362 DWORD i;
1363
1364 ret = TRUE;
1365 for (i = 0; i < pObject->cBlob; i++)
1366 {
1367 DWORD contentType, expectedContentTypes =
1373 HCERTSTORE contextStore;
1374 const void *context;
1375
1377 &pObject->rgBlob[i], expectedContentTypes,
1378 CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, &contentType, NULL,
1379 &contextStore, NULL, &context))
1380 {
1381 switch (contentType)
1382 {
1386 ret = FALSE;
1388 break;
1390 if (!CertAddCRLContextToStore(store,
1392 ret = FALSE;
1394 break;
1396 if (!CertAddCTLContextToStore(store,
1398 ret = FALSE;
1400 break;
1401 default:
1402 CertAddStoreToCollection(store, contextStore, 0, 0);
1403 }
1404 CertCloseStore(contextStore, 0);
1405 }
1406 else
1407 ret = FALSE;
1408 }
1409 }
1410 else
1411 ret = FALSE;
1412 *ppvContext = store;
1413 }
1414 return ret;
1415}
BOOL WINAPI CertAddStoreToCollection(HCERTSTORE hCollectionStore, HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition, PCCERT_CONTEXT *ppStoreContext)
Definition: cert.c:286
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:371
BOOL WINAPI CertFreeCRLContext(PCCRL_CONTEXT pCrlContext)
Definition: crl.c:386
BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCTLContext)
Definition: ctl.c:499
BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, PCCTL_CONTEXT *ppStoreContext)
Definition: ctl.c:63
BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void *pvObject, DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags, DWORD dwFlags, DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, DWORD *pdwFormatType, HCERTSTORE *phCertStore, HCRYPTMSG *phMsg, const void **ppvContext)
Definition: object.c:699
BOOL WINAPI CertAddCRLContextToStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pCrlContext, DWORD dwAddDisposition, PCCRL_CONTEXT *ppStoreContext)
Definition: store.c:960
HCERTSTORE WINAPI CertOpenStore(LPCSTR lpszStoreProvider, DWORD dwMsgAndCertEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void *pvPara)
Definition: store.c:815
BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
Definition: store.c:1127
#define CERT_QUERY_CONTENT_FLAG_CTL
Definition: wincrypt.h:3704
#define CERT_STORE_PROV_COLLECTION
Definition: wincrypt.h:2465
#define CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG
Definition: wincrypt.h:2743
#define CERT_QUERY_CONTENT_FLAG_CRL
Definition: wincrypt.h:3705
#define CERT_QUERY_CONTENT_FLAG_CERT
Definition: wincrypt.h:3703
#define CERT_QUERY_CONTENT_CRL
Definition: wincrypt.h:3691
#define CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
Definition: wincrypt.h:3716
#define CERT_STORE_CREATE_NEW_FLAG
Definition: wincrypt.h:2633
#define CERT_QUERY_OBJECT_BLOB
Definition: wincrypt.h:3687
#define CERT_QUERY_FORMAT_FLAG_BINARY
Definition: wincrypt.h:3743
#define CERT_QUERY_CONTENT_CTL
Definition: wincrypt.h:3690
#define CERT_STORE_PROV_MEMORY
Definition: wincrypt.h:2455
#define CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
Definition: wincrypt.h:3714
#define CERT_STORE_ADD_ALWAYS
Definition: wincrypt.h:2654
#define CERT_QUERY_CONTENT_CERT
Definition: wincrypt.h:3689
#define ERROR_INVALID_DATA
Definition: winerror.h:238

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_CreateBlob()

static BOOL WINAPI CRYPT_CreateBlob ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1150 of file cryptnet_main.c.

1152{
1153 DWORD size, i;
1155 BOOL ret = FALSE;
1156
1157 size = sizeof(CRYPT_BLOB_ARRAY) + pObject->cBlob * sizeof(CRYPT_DATA_BLOB);
1158 for (i = 0; i < pObject->cBlob; i++)
1159 size += pObject->rgBlob[i].cbData;
1161 if (context)
1162 {
1163 LPBYTE nextData;
1164
1165 context->cBlob = 0;
1166 context->rgBlob =
1168 nextData =
1169 (LPBYTE)context->rgBlob + pObject->cBlob * sizeof(CRYPT_DATA_BLOB);
1170 for (i = 0; i < pObject->cBlob; i++)
1171 {
1172 memcpy(nextData, pObject->rgBlob[i].pbData,
1173 pObject->rgBlob[i].cbData);
1174 context->rgBlob[i].pbData = nextData;
1175 context->rgBlob[i].cbData = pObject->rgBlob[i].cbData;
1176 nextData += pObject->rgBlob[i].cbData;
1177 context->cBlob++;
1178 }
1179 *ppvContext = context;
1180 ret = TRUE;
1181 }
1182 return ret;
1183}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char * LPBYTE
Definition: typedefs.h:53
struct _CRYPT_BLOB_ARRAY CRYPT_BLOB_ARRAY

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_CreateCert()

static BOOL WINAPI CRYPT_CreateCert ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1282 of file cryptnet_main.c.

1284{
1287}
BOOL(WINAPI * AddContextToStore)(HCERTSTORE hCertStore, const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext)
static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject, DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_CreateContext()

static BOOL CRYPT_CreateContext ( const CRYPT_BLOB_ARRAY pObject,
DWORD  dwExpectedContentTypeFlags,
AddContextToStore  addFunc,
void **  ppvContext 
)
static

Definition at line 1204 of file cryptnet_main.c.

1206{
1207 BOOL ret = TRUE;
1209
1210 if (!pObject->cBlob)
1211 {
1213 *ppvContext = NULL;
1214 ret = FALSE;
1215 }
1216 else if (pObject->cBlob == 1)
1217 {
1218 if (decode_base64_blob(&pObject->rgBlob[0], &blob))
1219 {
1221 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
1222 NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
1223 CryptMemFree(blob.pbData);
1224 }
1225 else
1226 {
1228 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0,
1229 NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext);
1230 }
1231 if (!ret)
1232 {
1234 ret = FALSE;
1235 }
1236 }
1237 else
1238 {
1241
1242 if (store)
1243 {
1244 DWORD i;
1245 const void *context;
1246
1247 for (i = 0; i < pObject->cBlob; i++)
1248 {
1249 if (decode_base64_blob(&pObject->rgBlob[i], &blob))
1250 {
1252 dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY,
1253 0, NULL, NULL, NULL, NULL, NULL, &context);
1254 CryptMemFree(blob.pbData);
1255 }
1256 else
1257 {
1259 &pObject->rgBlob[i], dwExpectedContentTypeFlags,
1261 NULL, &context);
1262 }
1263 if (ret)
1264 {
1265 if (!addFunc(store, context, CERT_STORE_ADD_ALWAYS, NULL))
1266 ret = FALSE;
1267 }
1268 else
1269 {
1271 ret = FALSE;
1272 }
1273 }
1274 }
1275 else
1276 ret = FALSE;
1277 *ppvContext = store;
1278 }
1279 return ret;
1280}
static BOOL decode_base64_blob(const CRYPT_DATA_BLOB *in, CRYPT_DATA_BLOB *out)
#define CRYPT_E_NO_MATCH
Definition: winerror.h:4426

Referenced by CRYPT_CreateCert(), CRYPT_CreateCRL(), and CRYPT_CreateCTL().

◆ CRYPT_CreateCRL()

static BOOL WINAPI CRYPT_CreateCRL ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1289 of file cryptnet_main.c.

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_CreateCTL()

static BOOL WINAPI CRYPT_CreateCTL ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1296 of file cryptnet_main.c.

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_CreatePKCS7()

static BOOL WINAPI CRYPT_CreatePKCS7 ( LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
const CRYPT_BLOB_ARRAY pObject,
void **  ppvContext 
)
static

Definition at line 1303 of file cryptnet_main.c.

1305{
1306 BOOL ret;
1307
1308 if (!pObject->cBlob)
1309 {
1311 *ppvContext = NULL;
1312 ret = FALSE;
1313 }
1314 else if (pObject->cBlob == 1)
1318 0, NULL, NULL, NULL, ppvContext, NULL, NULL);
1319 else
1320 {
1321 FIXME("multiple messages unimplemented\n");
1322 ret = FALSE;
1323 }
1324 return ret;
1325}

Referenced by CRYPT_GetCreateFunction().

◆ CRYPT_DownloadObject()

static BOOL CRYPT_DownloadObject ( DWORD  dwRetrievalFlags,
HINTERNET  hHttp,
struct InetContext context,
PCRYPT_BLOB_ARRAY  pObject,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)
static

Definition at line 649 of file cryptnet_main.c.

652{
653 CRYPT_DATA_BLOB object = { 0, NULL };
654 DWORD bytesAvailable;
655 BOOL ret;
656
657 do {
658 if ((ret = InternetQueryDataAvailable(hHttp, &bytesAvailable, 0, 0)))
659 {
660 if (bytesAvailable)
661 {
662 if (object.pbData)
663 object.pbData = CryptMemRealloc(object.pbData,
664 object.cbData + bytesAvailable);
665 else
666 object.pbData = CryptMemAlloc(bytesAvailable);
667 if (object.pbData)
668 {
669 INTERNET_BUFFERSA buffer = { sizeof(buffer), 0 };
670
671 buffer.dwBufferLength = bytesAvailable;
672 buffer.lpvBuffer = object.pbData + object.cbData;
673 if (!(ret = InternetReadFileExA(hHttp, &buffer, IRF_NO_WAIT,
675 {
677 {
679 context->timeout) == WAIT_TIMEOUT)
681 else if (context->error)
682 SetLastError(context->error);
683 else
684 ret = TRUE;
685 }
686 }
687 if (ret)
688 object.cbData += buffer.dwBufferLength;
689 }
690 else
691 {
693 ret = FALSE;
694 }
695 }
696 }
697 else if (GetLastError() == ERROR_IO_PENDING)
698 {
699 if (WaitForSingleObject(context->event, context->timeout) ==
702 else
703 ret = TRUE;
704 }
705 } while (ret && bytesAvailable);
706 if (ret)
707 {
708 pObject->rgBlob = CryptMemAlloc(sizeof(CRYPT_DATA_BLOB));
709 if (!pObject->rgBlob)
710 {
711 CryptMemFree(object.pbData);
713 ret = FALSE;
714 }
715 else
716 {
717 pObject->rgBlob[0].cbData = object.cbData;
718 pObject->rgBlob[0].pbData = object.pbData;
719 pObject->cBlob = 1;
720 }
721 }
722 TRACE("returning %d\n", ret);
723 return ret;
724}
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define ERROR_IO_PENDING
Definition: dderror.h:15
LPVOID WINAPI CryptMemRealloc(LPVOID pv, ULONG cbSize)
Definition: main.c:136
BOOL WINAPI InternetReadFileExA(HINTERNET hFile, LPINTERNET_BUFFERSA lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:2210
BOOL WINAPI InternetQueryDataAvailable(HINTERNET hFile, LPDWORD lpdwNumberOfBytesAvailable, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3960
GLuint buffer
Definition: glext.h:5915
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
DWORD dwBufferLength
Definition: wininet.h:265
HANDLE event
Definition: http.c:7253
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define ERROR_TIMEOUT
Definition: winerror.h:1286
#define IRF_NO_WAIT
Definition: wininet.h:625

Referenced by HTTP_RetrieveEncodedObjectW().

◆ CRYPT_FreeBlob()

static void WINAPI CRYPT_FreeBlob ( LPCSTR  pszObjectOid,
PCRYPT_BLOB_ARRAY  pObject,
void pvFreeContext 
)
static

Definition at line 451 of file cryptnet_main.c.

453{
454 DWORD i;
455
456 for (i = 0; i < pObject->cBlob; i++)
457 CryptMemFree(pObject->rgBlob[i].pbData);
458 CryptMemFree(pObject->rgBlob);
459}

Referenced by File_RetrieveEncodedObjectW(), FTP_RetrieveEncodedObjectW(), and HTTP_RetrieveEncodedObjectW().

◆ CRYPT_GetCreateFunction()

static BOOL CRYPT_GetCreateFunction ( LPCSTR  pszObjectOid,
ContextDllCreateObjectContext pFunc,
HCRYPTOIDFUNCADDR phFunc 
)
static

Definition at line 1420 of file cryptnet_main.c.

1422{
1423 BOOL ret = TRUE;
1424
1425 TRACE("(%s, %p, %p)\n", debugstr_a(pszObjectOid), pFunc, phFunc);
1426
1427 *pFunc = NULL;
1428 *phFunc = 0;
1429 if (IS_INTOID(pszObjectOid))
1430 {
1431 switch (LOWORD(pszObjectOid))
1432 {
1433 case 0:
1434 *pFunc = CRYPT_CreateBlob;
1435 break;
1437 *pFunc = CRYPT_CreateCert;
1438 break;
1439 case LOWORD(CONTEXT_OID_CRL):
1440 *pFunc = CRYPT_CreateCRL;
1441 break;
1442 case LOWORD(CONTEXT_OID_CTL):
1443 *pFunc = CRYPT_CreateCTL;
1444 break;
1446 *pFunc = CRYPT_CreatePKCS7;
1447 break;
1449 *pFunc = CRYPT_CreateAny;
1450 break;
1451 }
1452 }
1453 if (!*pFunc)
1454 {
1455 static HCRYPTOIDFUNCSET set = NULL;
1456
1457 if (!set)
1461 0, (void **)pFunc, phFunc);
1462 }
1463 TRACE("returning %d\n", ret);
1464 return ret;
1465}
Definition: _set.h:50
static BOOL WINAPI CRYPT_CreateCert(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL WINAPI CRYPT_CreatePKCS7(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL WINAPI CRYPT_CreateBlob(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL WINAPI CRYPT_CreateCTL(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
#define IS_INTOID(x)
Definition: cryptnet_main.c:45
static BOOL WINAPI CRYPT_CreateCRL(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet(LPCSTR pszFuncName, DWORD dwFlags)
Definition: oid.c:114
BOOL WINAPI CryptGetOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet, DWORD dwEncodingType, LPCSTR pszOID, DWORD dwFlags, void **ppvFuncAddr, HCRYPTOIDFUNCADDR *phFuncAddr)
Definition: oid.c:387
#define debugstr_a
Definition: kernel32.h:31
#define LOWORD(l)
Definition: pedump.c:82
#define CONTEXT_OID_CERTIFICATE
Definition: wincrypt.h:1876
#define CONTEXT_OID_CRL
Definition: wincrypt.h:1877
#define CONTEXT_OID_CAPI2_ANY
Definition: wincrypt.h:1880
#define CONTEXT_OID_PKCS7
Definition: wincrypt.h:1879
#define CONTEXT_OID_CTL
Definition: wincrypt.h:1878
#define CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC
Definition: wincrypt.h:1870

Referenced by CryptRetrieveObjectByUrlW().

◆ CRYPT_GetExpiration()

static BOOL CRYPT_GetExpiration ( const void object,
const char pszObjectOid,
FILETIME expiration 
)
static

Definition at line 1467 of file cryptnet_main.c.

1468{
1469 if (!IS_INTOID(pszObjectOid))
1470 return FALSE;
1471
1472 switch (LOWORD(pszObjectOid)) {
1474 *expiration = ((const CERT_CONTEXT*)object)->pCertInfo->NotAfter;
1475 return TRUE;
1476 case LOWORD(CONTEXT_OID_CRL):
1477 *expiration = ((const CRL_CONTEXT*)object)->pCrlInfo->NextUpdate;
1478 return TRUE;
1479 case LOWORD(CONTEXT_OID_CTL):
1480 *expiration = ((const CTL_CONTEXT*)object)->pCtlInfo->NextUpdate;
1481 return TRUE;
1482 }
1483
1484 return FALSE;
1485}
#define const
Definition: zconf.h:233

Referenced by CryptRetrieveObjectByUrlW().

◆ CRYPT_GetObjectFromCache()

static BOOL CRYPT_GetObjectFromCache ( LPCWSTR  pszURL,
PCRYPT_BLOB_ARRAY  pObject,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)
static

Definition at line 510 of file cryptnet_main.c.

512{
513 BOOL ret = FALSE;
514 INTERNET_CACHE_ENTRY_INFOW *pCacheInfo = NULL;
515 DWORD size = 0;
516
517 TRACE("(%s, %p, %p)\n", debugstr_w(pszURL), pObject, pAuxInfo);
518
521 return FALSE;
522
523 pCacheInfo = CryptMemAlloc(size);
524 if (!pCacheInfo)
525 {
527 return FALSE;
528 }
529
530 if ((ret = RetrieveUrlCacheEntryFileW(pszURL, pCacheInfo, &size, 0)))
531 {
532 FILETIME ft;
533
535 if (CompareFileTime(&pCacheInfo->ExpireTime, &ft) >= 0)
536 {
539
541 {
543 {
544 if (pAuxInfo && pAuxInfo->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CRYPT_RETRIEVE_AUX_INFO, pLastSyncTime)
545 && pAuxInfo->pLastSyncTime)
546 {
547 memcpy(pAuxInfo->pLastSyncTime,
548 &pCacheInfo->LastSyncTime,
549 sizeof(FILETIME));
550 }
551 }
553 }
554 else
555 {
556 DeleteUrlCacheEntryW(pszURL);
557 ret = FALSE;
558 }
559 }
560 else
561 {
562 DeleteUrlCacheEntryW(pszURL);
563 ret = FALSE;
564 }
565 UnlockUrlCacheEntryFileW(pszURL, 0);
566 }
567 CryptMemFree(pCacheInfo);
568 TRACE("returning %d\n", ret);
569 return ret;
570}
static BOOL CRYPT_GetObjectFromFile(HANDLE hFile, PCRYPT_BLOB_ARRAY pObject)
#define GENERIC_READ
Definition: compat.h:135
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI UnlockUrlCacheEntryFileW(LPCWSTR lpszUrlName, DWORD dwReserved)
Definition: urlcache.c:2621
BOOL WINAPI RetrieveUrlCacheEntryFileW(LPCWSTR lpszUrlName, LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo, LPDWORD lpdwCacheEntryInfoBufferSize, DWORD dwReserved)
Definition: urlcache.c:2185
_In_ HANDLE hFile
Definition: mswsock.h:90
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
FILETIME * pLastSyncTime
Definition: wincrypt.h:1843
FILETIME LastSyncTime
Definition: wininet.h:2139
FILETIME ExpireTime
Definition: wininet.h:2137
LPWSTR lpszLocalFileName
Definition: wininet.h:2130

Referenced by HTTP_RetrieveEncodedObjectW().

◆ CRYPT_GetObjectFromFile()

static BOOL CRYPT_GetObjectFromFile ( HANDLE  hFile,
PCRYPT_BLOB_ARRAY  pObject 
)
static

Definition at line 461 of file cryptnet_main.c.

462{
463 BOOL ret;
465
466 if ((ret = GetFileSizeEx(hFile, &size)))
467 {
468 if (size.HighPart)
469 {
470 WARN("file too big\n");
472 ret = FALSE;
473 }
474 else
475 {
477
478 blob.pbData = CryptMemAlloc(size.LowPart);
479 if (blob.pbData)
480 {
481 ret = ReadFile(hFile, blob.pbData, size.LowPart, &blob.cbData,
482 NULL);
483 if (ret)
484 {
485 pObject->rgBlob = CryptMemAlloc(sizeof(CRYPT_DATA_BLOB));
486 if (pObject->rgBlob)
487 {
488 pObject->cBlob = 1;
489 memcpy(pObject->rgBlob, &blob, sizeof(CRYPT_DATA_BLOB));
490 }
491 else
492 {
494 ret = FALSE;
495 }
496 }
497 if (!ret)
498 CryptMemFree(blob.pbData);
499 }
500 else
501 {
503 ret = FALSE;
504 }
505 }
506 }
507 return ret;
508}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define GetFileSizeEx
Definition: compat.h:757

Referenced by CRYPT_GetObjectFromCache(), and File_RetrieveEncodedObjectW().

◆ CRYPT_GetRetrieveFunction()

static BOOL CRYPT_GetRetrieveFunction ( LPCWSTR  pszURL,
SchemeDllRetrieveEncodedObjectW pFunc,
HCRYPTOIDFUNCADDR phFunc 
)
static

Definition at line 1084 of file cryptnet_main.c.

1086{
1087 URL_COMPONENTSW components = { sizeof(components), 0 };
1088 BOOL ret;
1089
1090 TRACE("(%s, %p, %p)\n", debugstr_w(pszURL), pFunc, phFunc);
1091
1092 *pFunc = NULL;
1093 *phFunc = 0;
1094 components.dwSchemeLength = 1;
1095 ret = InternetCrackUrlW(pszURL, 0, 0, &components);
1096 if (ret)
1097 {
1098 /* Microsoft always uses CryptInitOIDFunctionSet/
1099 * CryptGetOIDFunctionAddress, but there doesn't seem to be a pressing
1100 * reason to do so for builtin schemes.
1101 */
1102 switch (components.nScheme)
1103 {
1106 break;
1109 break;
1112 break;
1113 default:
1114 {
1115 int len = WideCharToMultiByte(CP_ACP, 0, components.lpszScheme,
1116 components.dwSchemeLength, NULL, 0, NULL, NULL);
1117
1118 if (len)
1119 {
1121
1122 if (scheme)
1123 {
1124 static HCRYPTOIDFUNCSET set = NULL;
1125
1126 if (!set)
1129 WideCharToMultiByte(CP_ACP, 0, components.lpszScheme,
1130 components.dwSchemeLength, scheme, len, NULL, NULL);
1132 scheme, 0, (void **)pFunc, phFunc);
1134 }
1135 else
1136 {
1138 ret = FALSE;
1139 }
1140 }
1141 else
1142 ret = FALSE;
1143 }
1144 }
1145 }
1146 TRACE("returning %d\n", ret);
1147 return ret;
1148}
static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL WINAPI FTP_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL WINAPI HTTP_RetrieveEncodedObjectW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
DWORD scheme
char * LPSTR
Definition: typedefs.h:51
#define SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC
Definition: wincrypt.h:1860
@ INTERNET_SCHEME_FILE
Definition: wininet.h:143

Referenced by CryptRetrieveObjectByUrlW().

◆ CRYPT_GetUrlFromCertificateCRLDistPoint()

static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint ( LPCSTR  pszUrlOid,
LPVOID  pvPara,
DWORD  dwFlags,
PCRYPT_URL_ARRAY  pUrlArray,
DWORD pcbUrlArray,
PCRYPT_URL_INFO  pUrlInfo,
DWORD pcbUrlInfo,
LPVOID  pvReserved 
)
static

Definition at line 343 of file cryptnet_main.c.

346{
347 PCCERT_CONTEXT cert = pvPara;
349 BOOL ret = FALSE;
350
351 /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
353 {
355 return FALSE;
356 }
358 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
359 ret = CRYPT_GetUrlFromCRLDistPointsExt(&ext->Value, pUrlArray,
360 pcbUrlArray, pUrlInfo, pcbUrlInfo);
361 else
363 return ret;
364}
static BOOL CRYPT_GetUrlFromCRLDistPointsExt(const CRYPT_DATA_BLOB *value, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo)
PCERT_EXTENSION WINAPI CertFindExtension(LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[])
Definition: cert.c:2028
static const WCHAR *const ext[]
Definition: module.c:53
#define CRYPT_GET_URL_FROM_EXTENSION
Definition: wincrypt.h:3637
#define szOID_CRL_DIST_POINTS
Definition: wincrypt.h:3352
#define CRYPT_E_NOT_FOUND
Definition: winerror.h:4421

Referenced by CryptGetObjectUrl().

◆ CRYPT_GetUrlFromCertificateIssuer()

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 
)
static

Definition at line 121 of file cryptnet_main.c.

124{
125 PCCERT_CONTEXT cert = pvPara;
127 BOOL ret = FALSE;
128
129 /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
131 {
133 return FALSE;
134 }
136 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
137 {
139 DWORD size;
140
142 ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
143 &aia, &size);
144 if (ret)
145 {
146 DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
147
148 for (i = 0, cUrl = 0; i < aia->cAccDescr; i++)
149 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
151 {
152 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice ==
154 {
155 if (aia->rgAccDescr[i].AccessLocation.pwszURL)
156 {
157 cUrl++;
158 bytesNeeded += sizeof(LPWSTR) +
159 (lstrlenW(aia->rgAccDescr[i].AccessLocation.
160 pwszURL) + 1) * sizeof(WCHAR);
161 }
162 }
163 else
164 FIXME("unsupported alt name type %ld\n",
165 aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
166 }
167 if (!pcbUrlArray)
168 {
170 ret = FALSE;
171 }
172 else if (!pUrlArray)
173 *pcbUrlArray = bytesNeeded;
174 else if (*pcbUrlArray < bytesNeeded)
175 {
177 *pcbUrlArray = bytesNeeded;
178 ret = FALSE;
179 }
180 else
181 {
182 LPWSTR nextUrl;
183
184 *pcbUrlArray = bytesNeeded;
185 pUrlArray->cUrl = 0;
186 pUrlArray->rgwszUrl =
187 (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
188 nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
189 + cUrl * sizeof(LPWSTR));
190 for (i = 0; i < aia->cAccDescr; i++)
191 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
193 {
194 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice
196 {
197 if (aia->rgAccDescr[i].AccessLocation.pwszURL)
198 {
199 lstrcpyW(nextUrl,
200 aia->rgAccDescr[i].AccessLocation.pwszURL);
201 pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
202 nextUrl;
203 nextUrl += (lstrlenW(nextUrl) + 1);
204 }
205 }
206 }
207 }
208 if (ret)
209 {
210 if (pcbUrlInfo)
211 {
212 FIXME("url info: stub\n");
213 if (!pUrlInfo)
214 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
215 else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
216 {
217 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
219 ret = FALSE;
220 }
221 else
222 {
223 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
224 memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
225 }
226 }
227 }
228 LocalFree(aia);
229 }
230 }
231 else
233 return ret;
234}
#define ERROR_MORE_DATA
Definition: dderror.h:13
static WCHAR aia[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1601
#define lstrlenW
Definition: compat.h:750
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
LPWSTR * rgwszUrl
Definition: wincrypt.h:1738
uint16_t * LPWSTR
Definition: typedefs.h:56
#define CERT_ALT_NAME_URL
Definition: wincrypt.h:360
#define X509_AUTHORITY_INFO_ACCESS
Definition: wincrypt.h:3551
struct _CRYPT_URL_ARRAY CRYPT_URL_ARRAY
#define szOID_AUTHORITY_INFO_ACCESS
Definition: wincrypt.h:3446
struct _CRYPT_URL_INFO CRYPT_URL_INFO
#define szOID_PKIX_CA_ISSUERS
Definition: wincrypt.h:3483

Referenced by CryptGetObjectUrl().

◆ CRYPT_GetUrlFromCRLDistPointsExt()

static BOOL CRYPT_GetUrlFromCRLDistPointsExt ( const CRYPT_DATA_BLOB value,
PCRYPT_URL_ARRAY  pUrlArray,
DWORD pcbUrlArray,
PCRYPT_URL_INFO  pUrlInfo,
DWORD pcbUrlInfo 
)
static

Definition at line 236 of file cryptnet_main.c.

239{
240 BOOL ret;
242 DWORD size;
243
245 value->pbData, value->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size);
246 if (ret)
247 {
248 DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
249
250 for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
251 if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
253 {
254 DWORD j;
256 &info->rgDistPoint[i].DistPointName.FullName;
257
258 for (j = 0; j < name->cAltEntry; j++)
259 if (name->rgAltEntry[j].dwAltNameChoice ==
261 {
262 if (name->rgAltEntry[j].pwszURL)
263 {
264 cUrl++;
265 bytesNeeded += sizeof(LPWSTR) +
266 (lstrlenW(name->rgAltEntry[j].pwszURL) + 1)
267 * sizeof(WCHAR);
268 }
269 }
270 }
271 if (!pcbUrlArray)
272 {
274 ret = FALSE;
275 }
276 else if (!pUrlArray)
277 *pcbUrlArray = bytesNeeded;
278 else if (*pcbUrlArray < bytesNeeded)
279 {
281 *pcbUrlArray = bytesNeeded;
282 ret = FALSE;
283 }
284 else
285 {
286 LPWSTR nextUrl;
287
288 *pcbUrlArray = bytesNeeded;
289 pUrlArray->cUrl = 0;
290 pUrlArray->rgwszUrl =
291 (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
292 nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
293 + cUrl * sizeof(LPWSTR));
294 for (i = 0; i < info->cDistPoint; i++)
295 if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
297 {
298 DWORD j;
300 &info->rgDistPoint[i].DistPointName.FullName;
301
302 for (j = 0; j < name->cAltEntry; j++)
303 if (name->rgAltEntry[j].dwAltNameChoice ==
305 {
306 if (name->rgAltEntry[j].pwszURL)
307 {
308 lstrcpyW(nextUrl,
309 name->rgAltEntry[j].pwszURL);
310 pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
311 nextUrl;
312 nextUrl +=
313 (lstrlenW(name->rgAltEntry[j].pwszURL) + 1);
314 }
315 }
316 }
317 }
318 if (ret)
319 {
320 if (pcbUrlInfo)
321 {
322 FIXME("url info: stub\n");
323 if (!pUrlInfo)
324 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
325 else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
326 {
327 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
329 ret = FALSE;
330 }
331 else
332 {
333 *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
334 memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
335 }
336 }
337 }
339 }
340 return ret;
341}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
Definition: name.c:39
Definition: pdh_main.c:96
#define CRL_DIST_POINT_FULL_NAME
Definition: wincrypt.h:523
#define X509_CRL_DIST_POINTS
Definition: wincrypt.h:3554

Referenced by CRYPT_GetUrlFromCertificateCRLDistPoint(), and verify_cert_revocation_from_dist_points_ext().

◆ CRYPT_InetStatusCallback()

static void CALLBACK CRYPT_InetStatusCallback ( HINTERNET  hInt,
DWORD_PTR  dwContext,
DWORD  status,
void statusInfo,
DWORD  statusInfoLen 
)
static

Definition at line 793 of file cryptnet_main.c.

795{
796 struct InetContext *context = (struct InetContext *)dwContext;
798
799 switch (status)
800 {
802 result = statusInfo;
803 context->error = result->dwError;
805 }
806}
GLuint64EXT * result
Definition: glext.h:11304
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898

Referenced by CRYPT_Connect().

◆ CRYPT_MakeInetContext()

static struct InetContext * CRYPT_MakeInetContext ( DWORD  dwTimeout)
static

Definition at line 628 of file cryptnet_main.c.

629{
630 struct InetContext *context = CryptMemAlloc(sizeof(struct InetContext));
631
632 if (context)
633 {
635 if (!context->event)
636 {
638 context = NULL;
639 }
640 else
641 {
642 context->timeout = dwTimeout;
643 context->error = ERROR_SUCCESS;
644 }
645 }
646 return context;
647}
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587

Referenced by HTTP_RetrieveEncodedObjectW().

◆ CryptGetObjectUrl()

BOOL WINAPI CryptGetObjectUrl ( LPCSTR  pszUrlOid,
LPVOID  pvPara,
DWORD  dwFlags,
PCRYPT_URL_ARRAY  pUrlArray,
DWORD pcbUrlArray,
PCRYPT_URL_INFO  pUrlInfo,
DWORD pcbUrlInfo,
LPVOID  pvReserved 
)

Definition at line 369 of file cryptnet_main.c.

372{
374 HCRYPTOIDFUNCADDR hFunc = NULL;
375 BOOL ret = FALSE;
376
377 TRACE("(%s, %p, %08lx, %p, %p, %p, %p, %p)\n", debugstr_a(pszUrlOid),
378 pvPara, dwFlags, pUrlArray, pcbUrlArray, pUrlInfo, pcbUrlInfo, pvReserved);
379
380 if (IS_INTOID(pszUrlOid))
381 {
382 switch (LOWORD(pszUrlOid))
383 {
386 break;
389 break;
390 default:
391 FIXME("unimplemented for %s\n", url_oid_to_str(pszUrlOid));
393 }
394 }
395 else
396 {
397 static HCRYPTOIDFUNCSET set = NULL;
398
399 if (!set)
402 (void **)&func, &hFunc);
403 }
404 if (func)
405 ret = func(pszUrlOid, pvPara, dwFlags, pUrlArray, pcbUrlArray,
406 pUrlInfo, pcbUrlInfo, pvReserved);
407 if (hFunc)
409 return ret;
410}
static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
static const char * url_oid_to_str(LPCSTR oid)
Definition: cryptnet_main.c:91
BOOL(WINAPI * UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD, PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID)
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)
BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr, DWORD dwFlags)
Definition: oid.c:468
GLenum func
Definition: glext.h:6028
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static LPCWSTR LPVOID pvReserved
Definition: asmcache.c:749
#define URL_OID_CERTIFICATE_ISSUER
Definition: wincrypt.h:1748
#define URL_OID_GET_OBJECT_URL_FUNC
Definition: wincrypt.h:2678
#define URL_OID_CERTIFICATE_CRL_DIST_POINT
Definition: wincrypt.h:1749

Referenced by CRYPT_FindIssuer(), and test_getObjectUrl().

◆ CryptRetrieveObjectByUrlA()

BOOL WINAPI CryptRetrieveObjectByUrlA ( LPCSTR  pszURL,
LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
DWORD  dwTimeout,
LPVOID ppvObject,
HCRYPTASYNC  hAsyncRetrieve,
PCRYPT_CREDENTIALS  pCredentials,
LPVOID  pvVerify,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)

Definition at line 415 of file cryptnet_main.c.

419{
420 BOOL ret = FALSE;
421 int len;
422
423 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p)\n", debugstr_a(pszURL),
424 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, ppvObject,
425 hAsyncRetrieve, pCredentials, pvVerify, pAuxInfo);
426
427 if (!pszURL)
428 {
430 return FALSE;
431 }
432 len = MultiByteToWideChar(CP_ACP, 0, pszURL, -1, NULL, 0);
433 if (len)
434 {
435 LPWSTR url = CryptMemAlloc(len * sizeof(WCHAR));
436
437 if (url)
438 {
439 MultiByteToWideChar(CP_ACP, 0, pszURL, -1, url, len);
440 ret = CryptRetrieveObjectByUrlW(url, pszObjectOid,
441 dwRetrievalFlags, dwTimeout, ppvObject, hAsyncRetrieve,
442 pCredentials, pvVerify, pAuxInfo);
444 }
445 else
447 }
448 return ret;
449}
BOOL WINAPI CryptRetrieveObjectByUrlW(LPCWSTR pszURL, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, LPVOID *ppvObject, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, LPVOID pvVerify, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define MultiByteToWideChar
Definition: compat.h:110
static const WCHAR url[]
Definition: encode.c:1384

Referenced by test_retrieveObjectByUrl().

◆ CryptRetrieveObjectByUrlW()

BOOL WINAPI CryptRetrieveObjectByUrlW ( LPCWSTR  pszURL,
LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
DWORD  dwTimeout,
LPVOID ppvObject,
HCRYPTASYNC  hAsyncRetrieve,
PCRYPT_CREDENTIALS  pCredentials,
LPVOID  pvVerify,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)

Definition at line 1490 of file cryptnet_main.c.

1494{
1495 BOOL ret;
1498 HCRYPTOIDFUNCADDR hRetrieve = 0, hCreate = 0;
1499
1500 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
1501 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, ppvObject,
1502 hAsyncRetrieve, pCredentials, pvVerify, pAuxInfo);
1503
1504 if (!pszURL)
1505 {
1507 return FALSE;
1508 }
1509 ret = CRYPT_GetRetrieveFunction(pszURL, &retrieve, &hRetrieve);
1510 if (ret)
1511 ret = CRYPT_GetCreateFunction(pszObjectOid, &create, &hCreate);
1512 if (ret)
1513 {
1514 CRYPT_BLOB_ARRAY object = { 0, NULL };
1516 void *freeContext;
1517 FILETIME expires;
1518
1519 ret = retrieve(pszURL, pszObjectOid, dwRetrievalFlags, dwTimeout,
1520 &object, &freeObject, &freeContext, hAsyncRetrieve, pCredentials,
1521 pAuxInfo);
1522 if (ret)
1523 {
1524 ret = create(pszObjectOid, dwRetrievalFlags, &object, ppvObject);
1525 if (ret && !(dwRetrievalFlags & CRYPT_DONT_CACHE_RESULT) &&
1526 CRYPT_GetExpiration(*ppvObject, pszObjectOid, &expires))
1527 {
1528 CRYPT_CacheURL(pszURL, &object, dwRetrievalFlags, expires);
1529 }
1530 freeObject(pszObjectOid, &object, freeContext);
1531 }
1532 }
1533 if (hCreate)
1534 CryptFreeOIDFunctionAddress(hCreate, 0);
1535 if (hRetrieve)
1536 CryptFreeOIDFunctionAddress(hRetrieve, 0);
1537 TRACE("returning %d\n", ret);
1538 return ret;
1539}
static BOOL CRYPT_GetRetrieveFunction(LPCWSTR pszURL, SchemeDllRetrieveEncodedObjectW *pFunc, HCRYPTOIDFUNCADDR *phFunc)
static BOOL CRYPT_GetCreateFunction(LPCSTR pszObjectOid, ContextDllCreateObjectContext *pFunc, HCRYPTOIDFUNCADDR *phFunc)
static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, DWORD dwRetrievalFlags, FILETIME expires)
static BOOL CRYPT_GetExpiration(const void *object, const char *pszObjectOid, FILETIME *expiration)
BOOL(WINAPI * ContextDllCreateObjectContext)(LPCSTR pszObjectOid, DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
BOOL(WINAPI * SchemeDllRetrieveEncodedObjectW)(LPCWSTR pwszUrl, LPCSTR pszObjectOid, DWORD dwRetrievalFlags, DWORD dwTimeout, PCRYPT_BLOB_ARRAY pObject, PFN_FREE_ENCODED_OBJECT_FUNC *ppfnFreeObject, void **ppvFreeContext, HCRYPTASYNC hAsyncRetrieve, PCRYPT_CREDENTIALS pCredentials, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static const struct access_res create[16]
Definition: package.c:7505
#define CRYPT_DONT_CACHE_RESULT
Definition: wincrypt.h:1885
void(WINAPI * PFN_FREE_ENCODED_OBJECT_FUNC)(LPCSTR pszObjectOid, PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
Definition: wincrypt.h:1854

Referenced by CRYPT_FindIssuer(), CryptRetrieveObjectByUrlA(), and retrieve_crl_from_dist_points().

◆ decode_base64_blob()

static BOOL decode_base64_blob ( const CRYPT_DATA_BLOB in,
CRYPT_DATA_BLOB out 
)
static

Definition at line 1188 of file cryptnet_main.c.

1189{
1190 BOOL ret;
1191 DWORD len = in->cbData;
1192
1193 while (len && !in->pbData[len - 1]) len--;
1194 if (!CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY,
1195 NULL, &out->cbData, NULL, NULL )) return FALSE;
1196
1197 if (!(out->pbData = CryptMemAlloc( out->cbData ))) return FALSE;
1199 out->pbData, &out->cbData, NULL, NULL );
1200 if (!ret) CryptMemFree( out->pbData );
1201 return ret;
1202}
BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags)
Definition: base64.c:772
GLuint in
Definition: glext.h:9616
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define CRYPT_STRING_BASE64_ANY
Definition: wincrypt.h:3137

Referenced by CRYPT_CreateContext().

◆ DllRegisterServer()

HRESULT WINAPI DllRegisterServer ( void  )

Definition at line 65 of file cryptnet_main.c.

66{
67 TRACE("\n");
69 CRYPT_OID_VERIFY_REVOCATION_FUNC, 0, L"cryptnet.dll");
71 L"cryptnet.dll", "LdapProvOpenStore");
73 CERT_STORE_PROV_LDAP_W, L"cryptnet.dll", "LdapProvOpenStore");
74 return S_OK;
75}
BOOL WINAPI CryptRegisterDefaultOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, DWORD dwIndex, LPCWSTR pwszDll)
Definition: oid.c:1109
BOOL WINAPI CryptRegisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszDll, LPCSTR pszOverrideFuncName)
Definition: oid.c:647
#define S_OK
Definition: intsafe.h:52
#define CERT_STORE_PROV_LDAP_W
Definition: wincrypt.h:2473
#define CRYPT_OID_VERIFY_REVOCATION_FUNC
Definition: wincrypt.h:2666
#define CRYPT_OID_OPEN_STORE_PROV_FUNC
Definition: wincrypt.h:2660

◆ DllUnregisterServer()

HRESULT WINAPI DllUnregisterServer ( void  )

Definition at line 80 of file cryptnet_main.c.

81{
82 TRACE("\n");
84 CRYPT_OID_VERIFY_REVOCATION_FUNC, L"cryptnet.dll");
88 return S_OK;
89}
BOOL WINAPI CryptUnregisterDefaultOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCWSTR pwszDll)
Definition: oid.c:1142
BOOL WINAPI CryptUnregisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID)
Definition: oid.c:831

◆ escape_path()

static void escape_path ( const WCHAR src,
DWORD  src_len,
WCHAR dst,
DWORD dst_len 
)
static

Definition at line 1840 of file cryptnet_main.c.

1841{
1842 static const WCHAR hex[] = L"0123456789ABCDEF";
1843 WCHAR *ptr = dst;
1844 DWORD i;
1845
1846 *dst_len = src_len;
1847 for (i = 0; i < src_len; i++)
1848 {
1849 if (src[i] == '+' || src[i] == '/' || src[i] == '=')
1850 {
1851 if (dst)
1852 {
1853 ptr[0] = '%';
1854 ptr[1] = hex[(src[i] >> 4) & 0xf];
1855 ptr[2] = hex[src[i] & 0xf];
1856 ptr += 3;
1857 }
1858 *dst_len += 2;
1859 }
1860 else if (dst) *ptr++ = src[i];
1861 }
1862}
ios_base &_STLP_CALL hex(ios_base &__s)
Definition: _ios_base.h:324
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
static PVOID ptr
Definition: dispmode.c:27

Referenced by build_request_path().

◆ File_RetrieveEncodedObjectW()

static BOOL WINAPI File_RetrieveEncodedObjectW ( LPCWSTR  pszURL,
LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
DWORD  dwTimeout,
PCRYPT_BLOB_ARRAY  pObject,
PFN_FREE_ENCODED_OBJECT_FUNC ppfnFreeObject,
void **  ppvFreeContext,
HCRYPTASYNC  hAsyncRetrieve,
PCRYPT_CREDENTIALS  pCredentials,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)
static

Definition at line 981 of file cryptnet_main.c.

986{
987 URL_COMPONENTSW components = { sizeof(components), 0 };
988 BOOL ret;
989
990 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
991 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
992 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
993
994 pObject->cBlob = 0;
995 pObject->rgBlob = NULL;
996 *ppfnFreeObject = CRYPT_FreeBlob;
997 *ppvFreeContext = NULL;
998
1000 components.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
1001 if (!components.lpszUrlPath)
1002 {
1004 return FALSE;
1005 }
1006
1008 if (ret)
1009 {
1010 LPWSTR path;
1011
1012 /* 3 == lstrlenW(L"c:") + 1 */
1013 path = CryptMemAlloc((components.dwUrlPathLength + 3) * sizeof(WCHAR));
1014 if (path)
1015 {
1016 HANDLE hFile;
1017
1018 /* Try to create the file directly - Wine handles / in pathnames */
1019 lstrcpynW(path, components.lpszUrlPath,
1020 components.dwUrlPathLength + 1);
1023#ifdef __REACTOS__
1024 if ((hFile == INVALID_HANDLE_VALUE) && (lstrlenW(components.lpszUrlPath) > 1) && (components.lpszUrlPath[1] != ':'))
1025#else
1027#endif
1028 {
1029 /* Try again on the current drive */
1030 GetCurrentDirectoryW(components.dwUrlPathLength, path);
1031 if (path[1] == ':')
1032 {
1033 lstrcpynW(path + 2, components.lpszUrlPath,
1034 components.dwUrlPathLength + 1);
1037 }
1039 {
1040 /* Try again on the Windows drive */
1041 GetWindowsDirectoryW(path, components.dwUrlPathLength);
1042 if (path[1] == ':')
1043 {
1044 lstrcpynW(path + 2, components.lpszUrlPath,
1045 components.dwUrlPathLength + 1);
1048 }
1049 }
1050 }
1052 {
1054 {
1055 if (pAuxInfo && pAuxInfo->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CRYPT_RETRIEVE_AUX_INFO, pLastSyncTime)
1056 && pAuxInfo->pLastSyncTime)
1057 {
1059 pAuxInfo->pLastSyncTime);
1060 }
1061 }
1063 }
1064 else
1065 ret = FALSE;
1067 }
1068 else
1069 {
1071 ret = FALSE;
1072 }
1073 }
1074 CryptMemFree(components.lpszUrlPath);
1075 return ret;
1076}
static void WINAPI CRYPT_FreeBlob(LPCSTR pszObjectOid, PCRYPT_BLOB_ARRAY pObject, void *pvFreeContext)
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
#define lstrcpynW
Definition: compat.h:738
BOOL WINAPI GetFileTime(IN HANDLE hFile, OUT LPFILETIME lpCreationTime OPTIONAL, OUT LPFILETIME lpLastAccessTime OPTIONAL, OUT LPFILETIME lpLastWriteTime OPTIONAL)
Definition: fileinfo.c:880
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2271

Referenced by CRYPT_GetRetrieveFunction().

◆ find_cached_revocation_status()

static BOOL find_cached_revocation_status ( const CERT_CONTEXT cert,
const CERT_REVOCATION_PARA params,
const FILETIME time,
CERT_REVOCATION_STATUS status 
)
static

Definition at line 1617 of file cryptnet_main.c.

1619{
1620 char buffer[sizeof(revocation_cache_signature)];
1621 FILETIME update_time;
1622 FILE *file;
1623 int len;
1624
1626 return FALSE;
1627
1628 if ((len = fread(buffer, 1, sizeof(buffer), file)) != sizeof(buffer)
1630 {
1631 ERR("Invalid cache signature.\n");
1632 fclose(file);
1633 return FALSE;
1634 }
1635
1636 if (fread(&update_time, sizeof(update_time), 1, file) != 1)
1637 {
1638 ERR("Failed to read update time.\n");
1639 fclose(file);
1640 return FALSE;
1641 }
1642
1643 if (CompareFileTime(time, &update_time) > 0)
1644 {
1645 TRACE("Cached revocation status is potentially out of date.\n");
1646 fclose(file);
1647 return FALSE;
1648 }
1649
1650 if (fread(&status->dwError, sizeof(status->dwError), 1, file) != 1)
1651 {
1652 ERR("Failed to read error code.\n");
1653 fclose(file);
1654 return FALSE;
1655 }
1656
1657 if (status->dwError == CERT_E_REVOKED && fread(&status->dwReason, sizeof(status->dwReason), 1, file) != 1)
1658 {
1659 ERR("Failed to read revocation reason.\n");
1660 fclose(file);
1661 return FALSE;
1662 }
1663
1664 TRACE("Using cached status %#lx, reason %#lx.\n", status->dwError, status->dwReason);
1665 return TRUE;
1666}
size_t CDECL fread(void *ptr, size_t size, size_t nmemb, FILE *file)
Definition: file.c:4406
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define _SH_DENYWR
Definition: share.h:38

Referenced by verify_cert_revocation().

◆ FTP_RetrieveEncodedObjectW()

static BOOL WINAPI FTP_RetrieveEncodedObjectW ( LPCWSTR  pszURL,
LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
DWORD  dwTimeout,
PCRYPT_BLOB_ARRAY  pObject,
PFN_FREE_ENCODED_OBJECT_FUNC ppfnFreeObject,
void **  ppvFreeContext,
HCRYPTASYNC  hAsyncRetrieve,
PCRYPT_CREDENTIALS  pCredentials,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)
static

Definition at line 855 of file cryptnet_main.c.

860{
861 FIXME("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
862 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
863 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
864
865 pObject->cBlob = 0;
866 pObject->rgBlob = NULL;
867 *ppfnFreeObject = CRYPT_FreeBlob;
868 *ppvFreeContext = NULL;
869 return FALSE;
870}

Referenced by CRYPT_GetRetrieveFunction().

◆ handle_ocsp_response()

static DWORD handle_ocsp_response ( const CERT_INFO cert,
const CERT_INFO issuer,
const BYTE encoded,
DWORD  encoded_size,
FILETIME next_update 
)
static

Definition at line 2020 of file cryptnet_main.c.

2022{
2025
2027 &info, &size)) return GetLastError();
2028
2029 switch (info->dwStatus)
2030 {
2032 if (!info->pszObjId || strcmp(info->pszObjId, szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE))
2033 {
2034 FIXME("unhandled response type %s\n", debugstr_a(info->pszObjId));
2035 break;
2036 }
2037 error = verify_signed_ocsp_response_info(cert, issuer, &info->Value, next_update);
2038 break;
2039
2040 default:
2041 FIXME("unhandled status %lu\n", info->dwStatus);
2042 break;
2043 }
2044
2045 LocalFree(info);
2046 return error;
2047}
static DWORD verify_signed_ocsp_response_info(const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, FILETIME *next_update)
#define szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE
Definition: wincrypt.h:678
#define OCSP_SUCCESSFUL_RESPONSE
Definition: wincrypt.h:671
#define OCSP_RESPONSE
Definition: wincrypt.h:3589

Referenced by verify_cert_revocation_with_ocsp().

◆ HTTP_RetrieveEncodedObjectW()

static BOOL WINAPI HTTP_RetrieveEncodedObjectW ( LPCWSTR  pszURL,
LPCSTR  pszObjectOid,
DWORD  dwRetrievalFlags,
DWORD  dwTimeout,
PCRYPT_BLOB_ARRAY  pObject,
PFN_FREE_ENCODED_OBJECT_FUNC ppfnFreeObject,
void **  ppvFreeContext,
HCRYPTASYNC  hAsyncRetrieve,
PCRYPT_CREDENTIALS  pCredentials,
PCRYPT_RETRIEVE_AUX_INFO  pAuxInfo 
)
static

Definition at line 872 of file cryptnet_main.c.

877{
878 BOOL ret = FALSE;
879
880 TRACE("(%s, %s, %08lx, %ld, %p, %p, %p, %p, %p, %p)\n", debugstr_w(pszURL),
881 debugstr_a(pszObjectOid), dwRetrievalFlags, dwTimeout, pObject,
882 ppfnFreeObject, ppvFreeContext, hAsyncRetrieve, pCredentials, pAuxInfo);
883
884 pObject->cBlob = 0;
885 pObject->rgBlob = NULL;
886 *ppfnFreeObject = CRYPT_FreeBlob;
887 *ppvFreeContext = NULL;
888
889 if (!(dwRetrievalFlags & CRYPT_WIRE_ONLY_RETRIEVAL))
890 ret = CRYPT_GetObjectFromCache(pszURL, pObject, pAuxInfo);
891 if (!ret && (!(dwRetrievalFlags & CRYPT_CACHE_ONLY_RETRIEVAL) ||
892 (dwRetrievalFlags & CRYPT_WIRE_ONLY_RETRIEVAL)))
893 {
895
896 if ((ret = CRYPT_CrackUrl(pszURL, &components)))
897 {
898 HINTERNET hInt, hHost;
899 struct InetContext *context = NULL;
900
901 if (dwTimeout)
902 context = CRYPT_MakeInetContext(dwTimeout);
903 ret = CRYPT_Connect(&components, context, pCredentials, &hInt,
904 &hHost);
905 if (ret)
906 {
907 static LPCWSTR types[] =
908 {
909 L"application/x-x509-ca-cert", L"application/x-x509-email-cert",
910 L"application/x-x509-server-cert", L"application/x-x509-user-cert",
911 L"application/x-pkcs7-certificates", L"application/pkix-crl",
912 L"application/x-pkcs7-crl", L"application/x-pkcs7-signature",
913 L"application/x-pkcs7-mime", NULL
914 };
915 HINTERNET hHttp = HttpOpenRequestW(hHost, NULL,
916 components.lpszUrlPath, NULL, NULL, types,
919
920 if (hHttp)
921 {
922 if (dwTimeout)
923 {
924 InternetSetOptionW(hHttp,
926 sizeof(dwTimeout));
928 &dwTimeout, sizeof(dwTimeout));
929 }
930 ret = HttpSendRequestExW(hHttp, NULL, NULL, 0,
932 if (!ret && GetLastError() == ERROR_IO_PENDING)
933 {
935 context->timeout) == WAIT_TIMEOUT)
937 else
938 ret = TRUE;
939 }
940 if (ret &&
941 !(ret = HttpEndRequestW(hHttp, NULL, 0, (DWORD_PTR)context)) &&
943 {
945 context->timeout) == WAIT_TIMEOUT)
947 else
948 ret = TRUE;
949 }
950 if (ret)
951 ret = CRYPT_DownloadObject(dwRetrievalFlags, hHttp,
952 context, pObject, pAuxInfo);
953 if (ret && !(dwRetrievalFlags & CRYPT_DONT_CACHE_RESULT))
954 {
955 SYSTEMTIME st;
956 FILETIME ft;
957 DWORD len = sizeof(st);
958
960 &st, &len, NULL) && SystemTimeToFileTime(&st, &ft))
961 CRYPT_CacheURL(pszURL, pObject, dwRetrievalFlags, ft);
962 }
963 InternetCloseHandle(hHttp);
964 }
965 InternetCloseHandle(hHost);
967 }
968 if (context)
969 {
972 }
973 CryptMemFree(components.lpszUrlPath);
974 CryptMemFree(components.lpszHostName);
975 }
976 }
977 TRACE("returning %d\n", ret);
978 return ret;
979}
static BOOL CRYPT_Connect(const URL_COMPONENTSW *components, struct InetContext *context, PCRYPT_CREDENTIALS pCredentials, HINTERNET *phInt, HINTERNET *phHost)
static struct InetContext * CRYPT_MakeInetContext(DWORD dwTimeout)
static BOOL CRYPT_DownloadObject(DWORD dwRetrievalFlags, HINTERNET hHttp, struct InetContext *context, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL CRYPT_GetObjectFromCache(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo)
static BOOL CRYPT_CrackUrl(LPCWSTR pszURL, URL_COMPONENTSW *components)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:153
BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5389
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
BOOL WINAPI HttpSendRequestExW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersIn, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5500
HINTERNET WINAPI HttpOpenRequestW(HINTERNET hHttpSession, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:3469
BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength)
Definition: internet.c:2837
Definition: cmds.c:130
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define CRYPT_WIRE_ONLY_RETRIEVAL
Definition: wincrypt.h:1884
#define CRYPT_CACHE_ONLY_RETRIEVAL
Definition: wincrypt.h:1883
#define HTTP_QUERY_FLAG_SYSTEMTIME
Definition: wininet.h:1605
#define INTERNET_FLAG_NO_COOKIES
Definition: wininet.h:75
#define INTERNET_FLAG_NO_UI
Definition: wininet.h:84
#define INTERNET_OPTION_SEND_TIMEOUT
Definition: wininet.h:704
#define INTERNET_OPTION_RECEIVE_TIMEOUT
Definition: wininet.h:706
#define HTTP_QUERY_EXPIRES
Definition: wininet.h:1533

Referenced by CRYPT_GetRetrieveFunction().

◆ map_ocsp_status()

static DWORD map_ocsp_status ( DWORD  status)
static

Definition at line 1906 of file cryptnet_main.c.

1907{
1908 switch (status)
1909 {
1913 default:
1914 FIXME("unhandled status %lu\n", status);
1916 }
1917}
#define OCSP_BASIC_GOOD_CERT_STATUS
Definition: wincrypt.h:696
#define OCSP_BASIC_UNKNOWN_CERT_STATUS
Definition: wincrypt.h:698
#define OCSP_BASIC_REVOKED_CERT_STATUS
Definition: wincrypt.h:697
#define CRYPT_E_REVOKED
Definition: winerror.h:4433
#define CRYPT_E_REVOCATION_OFFLINE
Definition: winerror.h:4436

Referenced by check_ocsp_response_info().

◆ match_cert_id()

static BOOL match_cert_id ( const OCSP_CERT_ID id,
const CERT_INFO cert,
const CERT_INFO issuer 
)
static

Definition at line 1919 of file cryptnet_main.c.

1920{
1921 BYTE hash[20];
1922 DWORD hash_len = sizeof(hash);
1923
1924 if (!id->HashAlgorithm.pszObjId || strcmp(id->HashAlgorithm.pszObjId, szOID_OIWSEC_sha1))
1925 {
1926 FIXME("hash algorithm %s not supported\n", debugstr_a(id->HashAlgorithm.pszObjId));
1927 return FALSE;
1928 }
1929
1930 sha1_hash(issuer->Subject.pbData, issuer->Subject.cbData, hash, &hash_len);
1931 if (id->IssuerNameHash.cbData != hash_len) return FALSE;
1932 if (memcmp(id->IssuerNameHash.pbData, hash, hash_len)) return FALSE;
1933
1934 sha1_hash(issuer->SubjectPublicKeyInfo.PublicKey.pbData,
1935 issuer->SubjectPublicKeyInfo.PublicKey.cbData, hash, &hash_len);
1936 if (id->IssuerKeyHash.cbData != hash_len) return FALSE;
1937 if (memcmp(id->IssuerKeyHash.pbData, hash, hash_len)) return FALSE;
1938
1939 if (cert->SerialNumber.cbData != id->SerialNumber.cbData) return FALSE;
1940 return !memcmp(cert->SerialNumber.pbData, id->SerialNumber.pbData, id->SerialNumber.cbData);
1941}
GLuint id
Definition: glext.h:5910
Definition: _hash_fun.h:40

Referenced by check_ocsp_response_info().

◆ open_cached_revocation_file()

static FILE * open_cached_revocation_file ( const CERT_CONTEXT cert,
const CERT_REVOCATION_PARA params,
const WCHAR mode,
int  sharing 
)
static

Definition at line 1562 of file cryptnet_main.c.

1564{
1567 WCHAR *appdata_path;
1568 DWORD len, i, size;
1569 HCRYPTPROV prov;
1571 HRESULT hr;
1572
1573 if (FAILED(hr = SHGetKnownFolderPath(&FOLDERID_LocalAppDataLow, 0, NULL, &appdata_path)))
1574 {
1575 ERR("Failed to get LocalAppDataLow path, hr %#lx.\n", hr);
1576 return INVALID_HANDLE_VALUE;
1577 }
1578
1579 len = swprintf(path, ARRAY_SIZE(path), L"%s\\Microsoft\\CryptnetUrlCache\\Content\\", appdata_path);
1580 CoTaskMemFree(appdata_path);
1581
1582 if (len + CACHED_CERT_HASH_SIZE * 2 * sizeof(WCHAR) > ARRAY_SIZE(path) - 1)
1583 {
1584 WARN("Hash length exceeds static buffer; not caching.\n");
1585 return INVALID_HANDLE_VALUE;
1586 }
1587
1589 CryptCreateHash(prov, CALG_SHA1, 0, 0, &hash);
1590 CryptHashData(hash, cert->pbCertEncoded, cert->cbCertEncoded, 0);
1591 if (params && params->pIssuerCert)
1592 {
1593 CryptHashData(hash, (BYTE *)&params->pIssuerCert->cbCertEncoded, sizeof(params->pIssuerCert->cbCertEncoded), 0);
1594 CryptHashData(hash, params->pIssuerCert->pbCertEncoded, params->pIssuerCert->cbCertEncoded, 0);
1595 }
1596 else
1597 {
1598 size = 0;
1599 CryptHashData(hash, (BYTE *)&size, sizeof(size), 0);
1600 }
1601 size = sizeof(hash_data);
1604 CryptReleaseContext(prov, 0);
1605
1607
1608 for (i = 0; i < CACHED_CERT_HASH_SIZE; ++i)
1609 {
1610 swprintf(path + len, 3, L"%02x", hash_data[i]);
1611 len += 2;
1612 }
1613
1614 return _wfsopen(path, mode, sharing);
1615}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define CACHED_CERT_HASH_SIZE
HRESULT hr
Definition: delayimp.cpp:582
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:715
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1584
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:875
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:641
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1745
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:362
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
FILE *CDECL _wfsopen(const wchar_t *path, const wchar_t *mode, int share)
Definition: file.c:4254
#define swprintf
Definition: precomp.h:40
GLenum mode
Definition: glext.h:6217
#define FAILED(hr)
Definition: intsafe.h:51
static const struct @1831 hash_data[]
static OBJECT_ATTRIBUTES *static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:95
int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:1006
#define PROV_RSA_FULL
Definition: wincrypt.h:2243
#define CRYPT_VERIFYCONTEXT
Definition: wincrypt.h:2273
#define CALG_SHA1
Definition: wincrypt.h:2060
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:55
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:59
#define HP_HASHVAL
Definition: wincrypt.h:2387

Referenced by cache_revocation_status(), and find_cached_revocation_status().

◆ retrieve_crl_from_dist_points()

static const CRL_CONTEXT * retrieve_crl_from_dist_points ( const CRYPT_URL_ARRAY array,
DWORD  verify_flags,
DWORD  timeout 
)
static

Definition at line 1698 of file cryptnet_main.c.

1700{
1701 DWORD retrieve_flags = 0;
1702 const CRL_CONTEXT *crl;
1703 DWORD i;
1704
1705 if (verify_flags & CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION)
1706 retrieve_flags |= CRYPT_CACHE_ONLY_RETRIEVAL;
1707
1708 /* Yes, this is a weird algorithm, but the documentation for
1709 * CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT specifies this, and
1710 * tests seem to bear it out for CertVerifyRevocation() as well. */
1712 timeout /= 2;
1713
1714 for (i = 0; i < array->cUrl; ++i)
1715 {
1716 if (CryptRetrieveObjectByUrlW(array->rgwszUrl[i], CONTEXT_OID_CRL, retrieve_flags,
1717 timeout, (void **)&crl, NULL, NULL, NULL, NULL))
1718 return crl;
1719
1720 /* We don't check the current time here. This may result in less
1721 * accurate timeouts, but this too seems to be true of Windows. */
1723 timeout /= 2;
1724 }
1725
1726 return NULL;
1727}
static const BYTE crl[]
Definition: message.c:817
Definition: undname.c:54
Definition: dhcpd.h:248
#define CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION
Definition: wincrypt.h:932
#define CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG
Definition: wincrypt.h:933

Referenced by verify_cert_revocation_from_dist_points_ext().

◆ sha1_hash()

static void sha1_hash ( const BYTE data,
DWORD  datalen,
BYTE buf,
DWORD buflen 
)
static

Definition at line 1774 of file cryptnet_main.c.

1775{
1776 HCRYPTPROV prov;
1778
1780 CryptCreateHash(prov, CALG_SHA1, 0, 0, &hash);
1782 CryptGetHashParam(hash, HP_HASHVAL, buf, buflen, 0);
1783
1785 CryptReleaseContext(prov, 0);
1786}
int const JOCTET unsigned int datalen
Definition: jpeglib.h:1033

Referenced by build_ocsp_request(), and match_cert_id().

◆ url_oid_to_str()

static const char * url_oid_to_str ( LPCSTR  oid)
static

Definition at line 91 of file cryptnet_main.c.

92{
93 if (IS_INTOID(oid))
94 {
95 static char buf[10];
96
97 switch (LOWORD(oid))
98 {
99#define _x(oid) case LOWORD(oid): return #oid
108#undef _x
109 default:
110 snprintf(buf, sizeof(buf), "%d", LOWORD(oid));
111 return buf;
112 }
113 }
114 else
115 return oid;
116}
#define _x(oid)
#define URL_OID_CRL_ISSUER
Definition: wincrypt.h:1752
#define URL_OID_CTL_NEXT_UPDATE
Definition: wincrypt.h:1751
#define URL_OID_CROSS_CERT_DIST_POINT
Definition: wincrypt.h:1755
#define URL_OID_CERTIFICATE_FRESHEST_CRL
Definition: wincrypt.h:1753
#define URL_OID_CRL_FRESHEST_CRL
Definition: wincrypt.h:1754
#define URL_OID_CTL_ISSUER
Definition: wincrypt.h:1750
#define snprintf
Definition: wintirpc.h:48

Referenced by CryptGetObjectUrl().

◆ verify_cert_revocation()

static DWORD verify_cert_revocation ( const CERT_CONTEXT cert,
FILETIME pTime,
DWORD  dwFlags,
CERT_REVOCATION_PARA pRevPara,
CERT_REVOCATION_STATUS pRevStatus 
)
static

Definition at line 2193 of file cryptnet_main.c.

2195{
2197 FILETIME next_update = {0};
2199
2200 if (find_cached_revocation_status(cert, pRevPara, pTime, pRevStatus))
2201 {
2202 if (pRevStatus->dwError == ERROR_SUCCESS || pRevStatus->dwError == CRYPT_E_REVOKED)
2203 {
2204 TRACE("Returning cached status.\n");
2205 return pRevStatus->dwError;
2206 }
2207 }
2208
2209 if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2210 {
2211 error = verify_cert_revocation_from_aia_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus,
2212 &next_update);
2213 TRACE("verify_cert_revocation_from_aia_ext() returned %08lx\n", error);
2214 if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) goto done;
2215 }
2216 if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2217 {
2218 error = verify_cert_revocation_from_dist_points_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus,
2219 &next_update);
2220 TRACE("verify_cert_revocation_from_dist_points_ext() returned %08lx\n", error);
2221 if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) goto done;
2222 }
2223 if (!ext)
2224 {
2225 if (pRevPara && pRevPara->hCrlStore && pRevPara->pIssuerCert)
2226 {
2228 BOOL canSignCRLs;
2229
2230 /* If the caller told us about the issuer, make sure the issuer
2231 * can sign CRLs before looking for one.
2232 */
2234 pRevPara->pIssuerCert->pCertInfo->cExtension,
2235 pRevPara->pIssuerCert->pCertInfo->rgExtension)))
2236 {
2238 DWORD size = sizeof(usage);
2239
2240 if (!CryptDecodeObjectEx(cert->dwCertEncodingType, X509_BITS,
2241 ext->Value.pbData, ext->Value.cbData,
2243 canSignCRLs = FALSE;
2244 else if (usage.cbData > 2)
2245 {
2246 /* The key usage extension only defines 9 bits => no more
2247 * than 2 bytes are needed to encode all known usages.
2248 */
2249 canSignCRLs = FALSE;
2250 }
2251 else
2252 {
2253 BYTE usageBits = usage.pbData[usage.cbData - 1];
2254
2255 canSignCRLs = usageBits & CERT_CRL_SIGN_KEY_USAGE;
2256 }
2257 }
2258 else
2259 canSignCRLs = TRUE;
2260 if (canSignCRLs)
2261 {
2262 /* If the caller was helpful enough to tell us where to find a
2263 * CRL for the cert, look for one and check it.
2264 */
2265 crl = CertFindCRLInStore(pRevPara->hCrlStore,
2266 cert->dwCertEncodingType,
2269 CRL_FIND_ISSUED_BY, pRevPara->pIssuerCert, NULL);
2270 }
2271 if (crl)
2272 {
2275 }
2276 else
2277 {
2278 TRACE("no CRL found\n");
2280 }
2281 }
2282 else
2283 {
2284 if (!pRevPara)
2285 WARN("no CERT_REVOCATION_PARA\n");
2286 else if (!pRevPara->hCrlStore)
2287 WARN("no dist points/aia extension and no CRL store\n");
2288 else if (!pRevPara->pIssuerCert)
2289 WARN("no dist points/aia extension and no issuer\n");
2291 }
2292 }
2293done:
2294 if ((next_update.dwLowDateTime || next_update.dwHighDateTime)
2296 {
2297 CERT_REVOCATION_STATUS rev_status;
2298
2299 memset(&rev_status, 0, sizeof(rev_status));
2300 rev_status.cbSize = sizeof(rev_status);
2301 rev_status.dwError = error;
2302 cache_revocation_status(cert, pRevPara, &next_update, &rev_status);
2303 }
2304 return error;
2305}
static DWORD verify_cert_revocation_with_crl_offline(PCCERT_CONTEXT cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
static BOOL find_cached_revocation_status(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, CERT_REVOCATION_STATUS *status)
static void cache_revocation_status(const CERT_CONTEXT *cert, const CERT_REVOCATION_PARA *params, const FILETIME *time, const CERT_REVOCATION_STATUS *status)
static DWORD verify_cert_revocation_from_dist_points_ext(const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *time, DWORD flags, const CERT_REVOCATION_PARA *params, CERT_REVOCATION_STATUS *status, FILETIME *next_update)
static DWORD verify_cert_revocation_from_aia_ext(const CRYPT_DATA_BLOB *value, const CERT_CONTEXT *cert, FILETIME *pTime, DWORD dwFlags, CERT_REVOCATION_PARA *pRevPara, CERT_REVOCATION_STATUS *pRevStatus, FILETIME *next_update)
PCCRL_CONTEXT WINAPI CertFindCRLInStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCRL_CONTEXT pPrevCrlContext)
Definition: crl.c:287
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:261
DWORD cExtension
Definition: wincrypt.h:260
HCERTSTORE hCrlStore
Definition: wincrypt.h:919
PCCERT_CONTEXT pIssuerCert
Definition: wincrypt.h:916
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65
#define CRL_FIND_ISSUED_BY_AKI_FLAG
Definition: wincrypt.h:3079
#define CRYPT_DECODE_NOCOPY_FLAG
Definition: wincrypt.h:3608
#define CRL_FIND_ISSUED_BY_SIGNATURE_FLAG
Definition: wincrypt.h:3080
#define CERT_CRL_SIGN_KEY_USAGE
Definition: wincrypt.h:320
#define szOID_KEY_USAGE
Definition: wincrypt.h:3341
#define X509_BITS
Definition: wincrypt.h:3544
#define CRL_FIND_ISSUED_BY
Definition: wincrypt.h:3075

Referenced by CertDllVerifyRevocation().

◆ verify_cert_revocation_from_aia_ext()

static DWORD verify_cert_revocation_from_aia_ext ( const CRYPT_DATA_BLOB value,
const CERT_CONTEXT cert,
FILETIME pTime,
DWORD  dwFlags,
CERT_REVOCATION_PARA pRevPara,
CERT_REVOCATION_STATUS pRevStatus,
FILETIME next_update 
)
static

Definition at line 2131 of file cryptnet_main.c.

2134{
2135 BOOL ret;
2138
2141 if (!ret) return GetLastError();
2142
2143 for (i = 0; i < aia->cAccDescr; i++)
2144 {
2145 if (!strcmp(aia->rgAccDescr[i].pszAccessMethod, szOID_PKIX_OCSP))
2146 {
2147 if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice == CERT_ALT_NAME_URL)
2148 {
2149 const WCHAR *url = aia->rgAccDescr[i].AccessLocation.pwszURL;
2150 TRACE("OCSP URL = %s\n", debugstr_w(url));
2151 error = verify_cert_revocation_with_ocsp(cert, url, pRevPara, next_update);
2152 }
2153 else
2154 {
2155 FIXME("unsupported AccessLocation type %lu\n", aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
2157 }
2158 break;
2159 }
2160 }
2161
2162 LocalFree(aia);
2163 return error;
2164}
static DWORD verify_cert_revocation_with_ocsp(const CERT_CONTEXT *cert, const WCHAR *base_url, const CERT_REVOCATION_PARA *revpara, FILETIME *next_update)
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define szOID_PKIX_OCSP
Definition: wincrypt.h:3482

Referenced by verify_cert_revocation().

◆ verify_cert_revocation_from_dist_points_ext()

static DWORD verify_cert_revocation_from_dist_points_ext ( const CRYPT_DATA_BLOB value,
const CERT_CONTEXT cert,
FILETIME time,
DWORD  flags,
const CERT_REVOCATION_PARA params,
CERT_REVOCATION_STATUS status,
FILETIME next_update 
)
static

Definition at line 1729 of file cryptnet_main.c.

1732{
1733 DWORD url_array_size, error;
1734 CRYPT_URL_ARRAY *url_array;
1735 const CRL_CONTEXT *crl;
1736 DWORD timeout = 0;
1737
1738 if (!params || !params->pIssuerCert)
1739 {
1740 TRACE("no issuer certificate\n");
1742 }
1743
1744 if (!CRYPT_GetUrlFromCRLDistPointsExt(value, NULL, &url_array_size, NULL, NULL))
1745 return GetLastError();
1746
1747 if (!(url_array = CryptMemAlloc(url_array_size)))
1748 return ERROR_OUTOFMEMORY;
1749
1750 if (!CRYPT_GetUrlFromCRLDistPointsExt(value, url_array, &url_array_size, NULL, NULL))
1751 {
1752 CryptMemFree(url_array);
1753 return GetLastError();
1754 }
1755
1756 if (params && params->cbSize >= RTL_SIZEOF_THROUGH_FIELD(CERT_REVOCATION_PARA, dwUrlRetrievalTimeout))
1757 timeout = params->dwUrlRetrievalTimeout;
1758
1759 if (!(crl = retrieve_crl_from_dist_points(url_array, flags, timeout)))
1760 {
1761 CryptMemFree(url_array);
1763 }
1764
1766
1767 *next_update = crl->pCrlInfo->NextUpdate;
1768
1770 CryptMemFree(url_array);
1771 return error;
1772}
static DWORD verify_cert_revocation_with_crl_online(const CERT_CONTEXT *cert, const CRL_CONTEXT *crl, FILETIME *pTime, CERT_REVOCATION_STATUS *pRevStatus)
static const CRL_CONTEXT * retrieve_crl_from_dist_points(const CRYPT_URL_ARRAY *array, DWORD verify_flags, DWORD timeout)
GLbitfield flags
Definition: glext.h:7161

Referenced by verify_cert_revocation().

◆ verify_cert_revocation_with_crl_offline()

static DWORD verify_cert_revocation_with_crl_offline ( PCCERT_CONTEXT  cert,
const CRL_CONTEXT crl,
FILETIME pTime,
CERT_REVOCATION_STATUS pRevStatus 
)
static

Definition at line 2166 of file cryptnet_main.c.

2168{
2170 LONG valid;
2171
2172 valid = CompareFileTime(pTime, &crl->pCrlInfo->ThisUpdate);
2173 if (valid <= 0)
2174 {
2175 /* If this CRL is not older than the time being verified, there's no
2176 * way to know whether the certificate was revoked.
2177 */
2178 TRACE("CRL not old enough\n");
2180 }
2181
2183 if (entry)
2184 return CRYPT_E_REVOKED;
2185
2186 /* Since the CRL was not retrieved for the cert being checked, there's no
2187 * guarantee it's fresh, so the cert *might* be okay, but it's safer not to
2188 * guess. */
2189 TRACE("certificate not found\n");
2191}
BOOL WINAPI CertFindCertificateInCRL(PCCERT_CONTEXT pCert, PCCRL_CONTEXT pCrlContext, DWORD dwFlags, void *pvReserved, PCRL_ENTRY *ppCrlEntry)
Definition: crl.c:750
BOOLEAN valid
long LONG
Definition: pedump.c:60
Definition: wincrypt.h:496

Referenced by verify_cert_revocation().

◆ verify_cert_revocation_with_crl_online()

static DWORD verify_cert_revocation_with_crl_online ( const CERT_CONTEXT cert,
const CRL_CONTEXT crl,
FILETIME pTime,
CERT_REVOCATION_STATUS pRevStatus 
)
static

Definition at line 1683 of file cryptnet_main.c.

1685{
1687
1689 if (entry)
1690 return CRYPT_E_REVOKED;
1691
1692 /* Since the CRL was retrieved for the cert being checked, then it's
1693 * guaranteed to be fresh, and the cert is not revoked. */
1694 return ERROR_SUCCESS;
1695}

Referenced by verify_cert_revocation_from_dist_points_ext().

◆ verify_cert_revocation_with_ocsp()

static DWORD verify_cert_revocation_with_ocsp ( const CERT_CONTEXT cert,
const WCHAR base_url,
const CERT_REVOCATION_PARA revpara,
FILETIME next_update 
)
static

Definition at line 2049 of file cryptnet_main.c.

2051{
2052 HINTERNET ses, con, req = NULL;
2053 BYTE *request_data = NULL, *response_data = NULL;
2054 DWORD size, flags, status, request_len, response_len, count, ret = CRYPT_E_REVOCATION_OFFLINE;
2055 URL_COMPONENTSW comp;
2056 WCHAR *url;
2057
2058 if (!revpara || !revpara->pIssuerCert)
2059 {
2060 TRACE("no issuer certificate\n");
2062 }
2063 if (!(request_data = build_ocsp_request(cert, revpara->pIssuerCert, &request_len)))
2065
2066 url = build_request_url(base_url, request_data, request_len);
2067 LocalFree(request_data);
2068 if (!url) return CRYPT_E_REVOCATION_OFFLINE;
2069
2070 memset(&comp, 0, sizeof(comp));
2071 comp.dwStructSize = sizeof(comp);
2072 comp.dwHostNameLength = ~0u;
2073 comp.dwUrlPathLength = ~0u;
2074 if (!InternetCrackUrlW(url, 0, 0, &comp))
2075 {
2076 free(url);
2078 }
2079
2080 switch (comp.nScheme)
2081 {
2083 flags = 0;
2084 break;
2087 break;
2088 default:
2089 FIXME("scheme %u not supported\n", comp.nScheme);
2090 free(url);
2091 return ERROR_NOT_SUPPORTED;
2092 }
2093
2094 if (!(ses = InternetOpenW(L"CryptoAPI", 0, NULL, NULL, 0))) return GetLastError();
2095 comp.lpszHostName[comp.dwHostNameLength] = 0;
2096 if (!(con = InternetConnectW(ses, comp.lpszHostName, comp.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)))
2097 {
2098 free(url);
2100 return GetLastError();
2101 }
2102 comp.lpszHostName[comp.dwHostNameLength] = '/';
2103 if (!(req = HttpOpenRequestW(con, NULL, comp.lpszUrlPath, NULL, NULL, NULL, flags, 0)) ||
2104 !HttpSendRequestW(req, NULL, 0, NULL, 0)) goto done;
2105
2106 size = sizeof(status);
2108 if (status != HTTP_STATUS_OK)
2109 {
2110 WARN("request status %lu\n", status);
2111 goto done;
2112 }
2113
2114 size = sizeof(response_len);
2115 if (!HttpQueryInfoW(req, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_CONTENT_LENGTH, &response_len, &size, 0) ||
2116 !response_len || !(response_data = malloc(response_len)) ||
2117 !InternetReadFile(req, response_data, response_len, &count) || count != response_len) goto done;
2118
2119 ret = handle_ocsp_response(cert->pCertInfo, revpara->pIssuerCert->pCertInfo, response_data, response_len,
2120 next_update);
2121
2122done:
2123 free(url);
2124 free(response_data);
2128 return ret;
2129}
static DWORD handle_ocsp_response(const CERT_INFO *cert, const CERT_INFO *issuer, const BYTE *encoded, DWORD encoded_size, FILETIME *next_update)
static WCHAR * build_request_url(const WCHAR *base_url, const BYTE *data, DWORD data_size)
static BYTE * build_ocsp_request(const CERT_CONTEXT *cert, const CERT_CONTEXT *issuer_cert, DWORD *ret_size)
BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders, DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength)
Definition: http.c:5595
BOOL WINAPI InternetReadFile(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
Definition: internet.c:2154
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
DWORD dwStructSize
Definition: wininet.h:211
DWORD dwUrlPathLength
Definition: wininet.h:223
LPWSTR lpszHostName
Definition: wininet.h:215
DWORD dwHostNameLength
Definition: wininet.h:216
INTERNET_SCHEME nScheme
Definition: wininet.h:214
LPWSTR lpszUrlPath
Definition: wininet.h:222
INTERNET_PORT nPort
Definition: wininet.h:217
#define HTTP_STATUS_OK
Definition: winhttp.h:301
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:48
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define INTERNET_FLAG_SECURE
Definition: wininet.h:71
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528

Referenced by verify_cert_revocation_from_aia_ext().

◆ verify_signed_ocsp_response_info()

static DWORD verify_signed_ocsp_response_info ( const CERT_INFO cert,
const CERT_INFO issuer,
const CRYPT_OBJID_BLOB blob,
FILETIME next_update 
)
static

Definition at line 1968 of file cryptnet_main.c.

1970{
1974 CRYPT_BIT_BLOB *sig;
1975 HCRYPTPROV prov = 0;
1976 HCRYPTHASH hash = 0;
1977 HCRYPTKEY key = 0;
1978 DWORD algid;
1979
1982
1983 if ((error = check_ocsp_response_info(cert, issuer, &info->ToBeSigned, &status, next_update))) goto done;
1984
1985 alg = &info->SignatureInfo.SignatureAlgorithm;
1986 if (!alg->pszObjId || !(algid = CertOIDToAlgId(alg->pszObjId)))
1987 {
1988 FIXME("unhandled signature algorithm %s\n", debugstr_a(alg->pszObjId));
1990 goto done;
1991 }
1992
1994 if (!CryptCreateHash(prov, algid, 0, 0, &hash)) goto done;
1995 if (!CryptHashData(hash, info->ToBeSigned.pbData, info->ToBeSigned.cbData, 0)) goto done;
1996
1997 sig = &info->SignatureInfo.Signature;
1998 if (!CryptImportPublicKeyInfoEx(prov, X509_ASN_ENCODING, (CERT_PUBLIC_KEY_INFO *)&issuer->SubjectPublicKeyInfo,
1999 0, 0, NULL, &key))
2000 {
2001 error = GetLastError();
2002 TRACE("failed to import public key %#lx\n", error);
2003 }
2004 else if (!CryptVerifySignatureW(hash, sig->pbData, sig->cbData, key, NULL, 0))
2005 {
2006 error = GetLastError();
2007 TRACE("failed to verify signature %#lx\n", error);
2008 }
2009 else error = ERROR_SUCCESS;
2010
2011done:
2014 CryptReleaseContext(prov, 0);
2015 LocalFree(info);
2016 if (error) return error;
2017 return status;
2018}
static DWORD check_ocsp_response_info(const CERT_INFO *cert, const CERT_INFO *issuer, const CRYPT_OBJID_BLOB *blob, DWORD *status, FILETIME *next_update)
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
Definition: crypt.c:911
BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
Definition: crypt.c:2205
BOOL WINAPI CryptImportPublicKeyInfoEx(HCRYPTPROV hCryptProv, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, ALG_ID aiKeyAlg, DWORD dwFlags, void *pvAuxInfo, HCRYPTKEY *phKey)
Definition: encode.c:5044
DWORD WINAPI CertOIDToAlgId(LPCSTR pszObjId)
Definition: oid.c:1901
BYTE * pbData
Definition: wincrypt.h:206
Definition: copy.c:22
#define OCSP_BASIC_SIGNED_RESPONSE
Definition: wincrypt.h:3590
ULONG_PTR HCRYPTKEY
Definition: wincrypt.h:58

Referenced by handle_ocsp_response().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( cryptnet  )

Variable Documentation

◆ revocation_cache_signature

const char revocation_cache_signature[] = "Wine cached revocation"
static

Definition at line 1558 of file cryptnet_main.c.

Referenced by cache_revocation_status(), and find_cached_revocation_status().