ReactOS 0.4.16-dev-2498-g8632030
crypt.c File Reference
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "wintrust.h"
#include "winver.h"
#include "mscat.h"
#include "mssip.h"
#include "imagehlp.h"
#include "winternl.h"
#include "wine/debug.h"
Include dependency graph for crypt.c:

Go to the source code of this file.

Classes

struct  cryptcat
 
struct  catadmin
 
struct  catinfo
 
struct  _CAB_SIGNINFO
 

Macros

#define CATADMIN_MAGIC   0x43415441 /* 'CATA' */
 
#define CRYPTCAT_MAGIC   0x43415443 /* 'CATC' */
 
#define CATINFO_MAGIC   0x43415449 /* 'CATI' */
 
#define cfhead_Signature   (0x00)
 
#define cfhead_CabinetSize   (0x08)
 
#define cfhead_MinorVersion   (0x18)
 
#define cfhead_MajorVersion   (0x19)
 
#define cfhead_Flags   (0x1E)
 
#define cfhead_SIZEOF   (0x24)
 
#define cfheadext_HeaderReserved   (0x00)
 
#define cfheadext_SIZEOF   (0x04)
 
#define cfsigninfo_CertOffset   (0x04)
 
#define cfsigninfo_CertSize   (0x08)
 
#define cfsigninfo_SIZEOF   (0x0C)
 
#define cfheadRESERVE_PRESENT   (0x0004)
 
#define EndGetI32(a)   ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0]))
 
#define EndGetI16(a)   ((((a)[1])<<8)|((a)[0]))
 

Typedefs

typedef struct _CAB_SIGNINFO CAB_SIGNINFO
 
typedef struct _CAB_SIGNINFOPCAB_SIGNINFO
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wintrust)
 
static HCATINFO create_catinfo (const WCHAR *filename)
 
BOOL WINAPI CryptCATAdminAcquireContext (HCATADMIN *catAdmin, const GUID *sys, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminAcquireContext2 (HCATADMIN *catAdmin, const GUID *sys, const WCHAR *algorithm, const CERT_STRONG_SIGN_PARA *policy, DWORD dwFlags)
 
HCATINFO WINAPI CryptCATAdminAddCatalog (HCATADMIN catAdmin, PWSTR catalogFile, PWSTR selectBaseName, DWORD flags)
 
static BOOL pe_image_hash (HANDLE file, HCRYPTHASH hash)
 
static BOOL catadmin_calc_hash_from_filehandle (HCATADMIN catAdmin, HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminCalcHashFromFileHandle (HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminCalcHashFromFileHandle2 (HCATADMIN catAdmin, HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags)
 
HCATINFO WINAPI CryptCATAdminEnumCatalogFromHash (HCATADMIN hCatAdmin, BYTE *pbHash, DWORD cbHash, DWORD dwFlags, HCATINFO *phPrevCatInfo)
 
BOOL WINAPI CryptCATAdminReleaseCatalogContext (HCATADMIN hCatAdmin, HCATINFO hCatInfo, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminReleaseContext (HCATADMIN hCatAdmin, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminRemoveCatalog (HCATADMIN hCatAdmin, LPCWSTR pwszCatalogFile, DWORD dwFlags)
 
BOOL WINAPI CryptCATAdminResolveCatalogPath (HCATADMIN hcatadmin, WCHAR *catalog_file, CATALOG_INFO *info, DWORD flags)
 
BOOL WINAPI CryptCATClose (HANDLE hCatalog)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATGetAttrInfo (HANDLE hCatalog, CRYPTCATMEMBER *member, LPWSTR tag)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATGetCatAttrInfo (HANDLE hCatalog, LPWSTR tag)
 
CRYPTCATMEMBER *WINAPI CryptCATGetMemberInfo (HANDLE hCatalog, LPWSTR tag)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATEnumerateAttr (HANDLE hCatalog, CRYPTCATMEMBER *member, CRYPTCATATTRIBUTE *prev)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATEnumerateCatAttr (HANDLE hCatalog, CRYPTCATATTRIBUTE *prev)
 
CRYPTCATMEMBER *WINAPI CryptCATEnumerateMember (HANDLE hCatalog, CRYPTCATMEMBER *prev)
 
static CTL_INFOdecode_inner_content (HANDLE hmsg, DWORD encoding, DWORD *len)
 
BOOL WINAPI CryptCATCatalogInfoFromContext (HCATINFO hcatinfo, CATALOG_INFO *info, DWORD flags)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATPutAttrInfo (HANDLE catalog, CRYPTCATMEMBER *member, WCHAR *name, DWORD flags, DWORD size, BYTE *data)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATPutCatAttrInfo (HANDLE catalog, WCHAR *name, DWORD flags, DWORD size, BYTE *data)
 
CRYPTCATMEMBER *WINAPI CryptCATPutMemberInfo (HANDLE catalog, WCHAR *filename, WCHAR *member, GUID *subject, DWORD version, DWORD size, BYTE *data)
 
BOOL WINAPI CryptCATPersistStore (HANDLE catalog)
 
HANDLE WINAPI CryptCATOpen (WCHAR *filename, DWORD flags, HCRYPTPROV hProv, DWORD dwPublicVersion, DWORD dwEncodingType)
 
BOOL WINAPI CryptSIPCreateIndirectData (SIP_SUBJECTINFO *pSubjectInfo, DWORD *pcbIndirectData, SIP_INDIRECT_DATA *pIndirectData)
 
BOOL WINAPI CryptCATCDFClose (CRYPTCATCDF *pCDF)
 
CRYPTCATATTRIBUTE *WINAPI CryptCATCDFEnumCatAttributes (CRYPTCATCDF *pCDF, CRYPTCATATTRIBUTE *pPrevAttr, PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError)
 
LPWSTR WINAPI CryptCATCDFEnumMembersByCDFTagEx (CRYPTCATCDF *pCDF, LPWSTR pwszPrevCDFTag, PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError, CRYPTCATMEMBER **ppMember, BOOL fContinueOnError, LPVOID pvReserved)
 
CRYPTCATCDF *WINAPI CryptCATCDFOpen (LPWSTR pwszFilePath, PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError)
 
static BOOL WINTRUST_GetSignedMsgFromPEFile (SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
 
static BOOL WINTRUST_PutSignedMsgToPEFile (SIP_SUBJECTINFO *pSubjectInfo, DWORD pdwEncodingType, DWORD *pdwIndex, DWORD cbSignedDataMsg, BYTE *pbSignedDataMsg)
 
static BOOL WINTRUST_GetSignedMsgFromCabFile (SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
 
static BOOL WINTRUST_GetSignedMsgFromCatFile (SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
 
BOOL WINAPI CryptSIPGetSignedDataMsg (SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
 
BOOL WINAPI CryptSIPPutSignedDataMsg (SIP_SUBJECTINFO *pSubjectInfo, DWORD pdwEncodingType, DWORD *pdwIndex, DWORD cbSignedDataMsg, BYTE *pbSignedDataMsg)
 
BOOL WINAPI CryptSIPRemoveSignedDataMsg (SIP_SUBJECTINFO *pSubjectInfo, DWORD dwIndex)
 
BOOL WINAPI CryptSIPVerifyIndirectData (SIP_SUBJECTINFO *pSubjectInfo, SIP_INDIRECT_DATA *pIndirectData)
 

Variables

static const GUID unknown
 
static const GUID cabGUID
 
static const GUID catGUID
 

Macro Definition Documentation

◆ CATADMIN_MAGIC

#define CATADMIN_MAGIC   0x43415441 /* 'CATA' */

Definition at line 40 of file crypt.c.

◆ CATINFO_MAGIC

#define CATINFO_MAGIC   0x43415449 /* 'CATI' */

Definition at line 42 of file crypt.c.

◆ cfhead_CabinetSize

#define cfhead_CabinetSize   (0x08)

Definition at line 1407 of file crypt.c.

◆ cfhead_Flags

#define cfhead_Flags   (0x1E)

Definition at line 1410 of file crypt.c.

◆ cfhead_MajorVersion

#define cfhead_MajorVersion   (0x19)

Definition at line 1409 of file crypt.c.

◆ cfhead_MinorVersion

#define cfhead_MinorVersion   (0x18)

Definition at line 1408 of file crypt.c.

◆ cfhead_Signature

#define cfhead_Signature   (0x00)

Definition at line 1406 of file crypt.c.

◆ cfhead_SIZEOF

#define cfhead_SIZEOF   (0x24)

Definition at line 1411 of file crypt.c.

◆ cfheadext_HeaderReserved

#define cfheadext_HeaderReserved   (0x00)

Definition at line 1412 of file crypt.c.

◆ cfheadext_SIZEOF

#define cfheadext_SIZEOF   (0x04)

Definition at line 1413 of file crypt.c.

◆ cfheadRESERVE_PRESENT

#define cfheadRESERVE_PRESENT   (0x0004)

Definition at line 1419 of file crypt.c.

◆ cfsigninfo_CertOffset

#define cfsigninfo_CertOffset   (0x04)

Definition at line 1414 of file crypt.c.

◆ cfsigninfo_CertSize

#define cfsigninfo_CertSize   (0x08)

Definition at line 1415 of file crypt.c.

◆ cfsigninfo_SIZEOF

#define cfsigninfo_SIZEOF   (0x0C)

Definition at line 1416 of file crypt.c.

◆ CRYPTCAT_MAGIC

#define CRYPTCAT_MAGIC   0x43415443 /* 'CATC' */

Definition at line 41 of file crypt.c.

◆ EndGetI16

#define EndGetI16 (   a)    ((((a)[1])<<8)|((a)[0]))

Definition at line 1423 of file crypt.c.

◆ EndGetI32

#define EndGetI32 (   a)    ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0]))

Definition at line 1422 of file crypt.c.

Typedef Documentation

◆ CAB_SIGNINFO

◆ PCAB_SIGNINFO

Function Documentation

◆ catadmin_calc_hash_from_filehandle()

static BOOL catadmin_calc_hash_from_filehandle ( HCATADMIN  catAdmin,
HANDLE  hFile,
DWORD pcbHash,
BYTE pbHash,
DWORD  dwFlags 
)
static

Definition at line 335 of file crypt.c.

337{
338 BOOL ret = FALSE;
339 struct catadmin *ca = catAdmin;
343 DWORD hashLength;
344
345 if (!hFile || !pcbHash || dwFlags)
346 {
348 return FALSE;
349 }
350
351 if (ca)
352 {
353 alg = ca->alg;
354 providerName = ca->providerName;
355 providerType = ca->providerType;
356 }
357
358 switch (alg)
359 {
360 case CALG_SHA1:
361 hashLength = 20;
362 break;
363 case CALG_SHA_256:
364 hashLength = 32;
365 break;
366 default:
367 FIXME("unsupported algorithm %x\n", alg);
368 return FALSE;
369 }
370
371 if (*pcbHash < hashLength)
372 {
373 *pcbHash = hashLength;
375 return TRUE;
376 }
377
378 *pcbHash = hashLength;
379 if (pbHash)
380 {
381 HCRYPTPROV prov;
383 DWORD bytes_read;
384 BYTE *buffer;
385
386 if (!(buffer = malloc(4096)))
387 {
389 return FALSE;
390 }
392 if (!ret)
393 {
394 free(buffer);
395 return FALSE;
396 }
397 ret = CryptCreateHash(prov, alg, 0, 0, &hash);
398 if (!ret)
399 {
400 free(buffer);
401 CryptReleaseContext(prov, 0);
402 return FALSE;
403 }
404
405 if (!(ret = pe_image_hash(hFile, hash)))
406 {
407 while ((ret = ReadFile(hFile, buffer, 4096, &bytes_read, NULL)) && bytes_read)
408 {
409 CryptHashData(hash, buffer, bytes_read, 0);
410 }
411 }
412 if (ret) ret = CryptGetHashParam(hash, HP_HASHVAL, pbHash, pcbHash, 0);
413
414 free(buffer);
416 CryptReleaseContext(prov, 0);
417 }
418 return ret;
419}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:753
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1675
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:929
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:661
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1836
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:358
static const WCHAR ca[]
Definition: main.c:457
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetLastError(x)
Definition: compat.h:752
static BOOL pe_image_hash(HANDLE file, HCRYPTHASH hash)
Definition: crypt.c:261
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
_In_ HANDLE hFile
Definition: mswsock.h:90
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
Definition: crypt.c:57
ALG_ID alg
Definition: crypt.c:61
Definition: _hash_fun.h:40
#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
unsigned int ALG_ID
Definition: wincrypt.h:54
#define CALG_SHA_256
Definition: wincrypt.h:2066
static const WCHAR MS_DEF_PROV_W[]
Definition: wincrypt.h:2119
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:59
#define HP_HASHVAL
Definition: wincrypt.h:2387
static const WCHAR providerName[]
Definition: wnet.c:1544
static const WCHAR providerType[]
Definition: wnet.c:2155
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193

Referenced by CryptCATAdminCalcHashFromFileHandle(), and CryptCATAdminCalcHashFromFileHandle2().

◆ create_catinfo()

static HCATINFO create_catinfo ( const WCHAR filename)
static

Definition at line 72 of file crypt.c.

73{
74 struct catinfo *ci;
75
76 if (!(ci = malloc(sizeof(*ci))))
77 {
80 }
82 ci->magic = CATINFO_MAGIC;
83 return ci;
84}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define lstrcpyW
Definition: compat.h:749
#define CATINFO_MAGIC
Definition: crypt.c:42
const char * filename
Definition: ioapi.h:137
Definition: crypt.c:67
DWORD magic
Definition: crypt.c:68
WCHAR file[MAX_PATH]
Definition: crypt.c:69

Referenced by CryptCATAdminEnumCatalogFromHash().

◆ CryptCATAdminAcquireContext()

BOOL WINAPI CryptCATAdminAcquireContext ( HCATADMIN catAdmin,
const GUID sys,
DWORD  dwFlags 
)

Definition at line 101 of file crypt.c.

103{
104 TRACE("%p %s %lx\n", catAdmin, debugstr_guid(sys), dwFlags);
105 return CryptCATAdminAcquireContext2(catAdmin, sys, NULL, NULL, dwFlags);
106}
BOOL WINAPI CryptCATAdminAcquireContext2(HCATADMIN *catAdmin, const GUID *sys, const WCHAR *algorithm, const CERT_STRONG_SIGN_PARA *policy, DWORD dwFlags)
Definition: crypt.c:124
#define debugstr_guid
Definition: kernel32.h:35
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by InitFunctionPtrs(), and pSetupInstallCatalog().

◆ CryptCATAdminAcquireContext2()

BOOL WINAPI CryptCATAdminAcquireContext2 ( HCATADMIN catAdmin,
const GUID sys,
const WCHAR algorithm,
const CERT_STRONG_SIGN_PARA policy,
DWORD  dwFlags 
)

Definition at line 124 of file crypt.c.

126{
127 static const WCHAR catroot[] =
128 {'\\','c','a','t','r','o','o','t',0};
129 static const WCHAR fmt[] =
130 {'%','s','\\','{','%','0','8','x','-','%','0','4','x','-','%','0',
131 '4','x','-','%','0','2','x','%','0','2','x','-','%','0','2','x',
132 '%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x',
133 '%','0','2','x','}',0};
134 static const GUID defsys =
135 {0x127d0a1d,0x4ef2,0x11d1,{0x86,0x08,0x00,0xc0,0x4f,0xc2,0x95,0xee}};
136
137 WCHAR catroot_dir[MAX_PATH];
138 struct catadmin *ca;
139 ALG_ID alg;
140 const WCHAR *providerName;
142
143 TRACE("%p %s %s %p %lx\n", catAdmin, debugstr_guid(sys), debugstr_w(algorithm), policy, dwFlags);
144
145 if (!catAdmin || dwFlags)
146 {
148 return FALSE;
149 }
150
151 if (policy != NULL)
152 FIXME("strong policy parameter is unimplemented\n");
153
155 {
156 alg = CALG_SHA1;
159 }
161 {
165 }
166 else
167 {
169 return FALSE;
170 }
171
172 if (!(ca = malloc(sizeof(*ca))))
173 {
175 return FALSE;
176 }
177
178 ca->alg = alg;
179 ca->providerName = providerName;
180 ca->providerType = providerType;
181
182 GetSystemDirectoryW(catroot_dir, MAX_PATH);
183 lstrcatW(catroot_dir, catroot);
184
185 /* create the directory if it doesn't exist */
186 CreateDirectoryW(catroot_dir, NULL);
187
188 if (!sys) sys = &defsys;
189 swprintf(ca->path, ARRAY_SIZE(ca->path), fmt, catroot_dir, sys->Data1, sys->Data2,
190 sys->Data3, sys->Data4[0], sys->Data4[1], sys->Data4[2],
191 sys->Data4[3], sys->Data4[4], sys->Data4[5], sys->Data4[6],
192 sys->Data4[7]);
193
194 /* create the directory if it doesn't exist */
195 CreateDirectoryW(ca->path, NULL);
196
197 ca->magic = CATADMIN_MAGIC;
198 ca->find = INVALID_HANDLE_VALUE;
199
200 *catAdmin = ca;
201 return TRUE;
202}
WINBASEAPI _Check_return_ _Out_ AppPolicyProcessTerminationMethod * policy
Definition: appmodel.h:73
#define ARRAY_SIZE(A)
Definition: main.h:20
#define BCRYPT_SHA256_ALGORITHM
Definition: bcrypt.h:75
#define BCRYPT_SHA1_ALGORITHM
Definition: bcrypt.h:74
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:58
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2232
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
#define swprintf
Definition: precomp.h:40
#define CATADMIN_MAGIC
Definition: crypt.c:40
#define debugstr_w
Definition: kernel32.h:32
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
static CHAR catroot[MAX_PATH]
Definition: crypt.c:33
Definition: dsound.c:943
#define PROV_RSA_AES
Definition: wincrypt.h:2260
static const WCHAR MS_ENH_RSA_AES_PROV_W[]
Definition: wincrypt.h:2221
#define NTE_BAD_ALGID
Definition: winerror.h:4255

Referenced by CryptCATAdminAcquireContext(), and InitFunctionPtrs().

◆ CryptCATAdminAddCatalog()

HCATINFO WINAPI CryptCATAdminAddCatalog ( HCATADMIN  catAdmin,
PWSTR  catalogFile,
PWSTR  selectBaseName,
DWORD  flags 
)

Definition at line 207 of file crypt.c.

209{
210 static const WCHAR slashW[] = {'\\',0};
211 struct catadmin *ca = catAdmin;
212 struct catinfo *ci;
213 WCHAR *target;
214 DWORD len;
215
216 TRACE("%p %s %s %ld\n", catAdmin, debugstr_w(catalogFile),
217 debugstr_w(selectBaseName), flags);
218
219 if (!selectBaseName)
220 {
221 FIXME("NULL basename not handled\n");
223 return NULL;
224 }
225 if (!ca || ca->magic != CATADMIN_MAGIC || !catalogFile || flags)
226 {
228 return NULL;
229 }
230
231 len = lstrlenW(ca->path) + lstrlenW(selectBaseName) + 2;
232 if (!(target = malloc(len * sizeof(WCHAR))))
233 {
235 return NULL;
236 }
237 lstrcpyW(target, ca->path);
239 lstrcatW(target, selectBaseName);
240
241 if (!CopyFileW(catalogFile, target, FALSE))
242 {
243 free(target);
244 return NULL;
245 }
247
248 if (!(ci = malloc(sizeof(*ci))))
249 {
250 free(target);
252 return NULL;
253 }
254 ci->magic = CATINFO_MAGIC;
255 lstrcpyW(ci->file, target);
256
257 free(target);
258 return ci;
259}
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:365
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:778
static const WCHAR slashW[]
Definition: devenum.c:59
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
Definition: tools.h:99

Referenced by InitFunctionPtrs(), and pSetupInstallCatalog().

◆ CryptCATAdminCalcHashFromFileHandle()

BOOL WINAPI CryptCATAdminCalcHashFromFileHandle ( HANDLE  hFile,
DWORD pcbHash,
BYTE pbHash,
DWORD  dwFlags 
)

Definition at line 424 of file crypt.c.

425{
426 TRACE("%p %p %p %lx\n", hFile, pcbHash, pbHash, dwFlags);
427 return catadmin_calc_hash_from_filehandle(NULL, hFile, pcbHash, pbHash, dwFlags);
428}
static BOOL catadmin_calc_hash_from_filehandle(HCATADMIN catAdmin, HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags)
Definition: crypt.c:335

Referenced by InitFunctionPtrs().

◆ CryptCATAdminCalcHashFromFileHandle2()

BOOL WINAPI CryptCATAdminCalcHashFromFileHandle2 ( HCATADMIN  catAdmin,
HANDLE  hFile,
DWORD pcbHash,
BYTE pbHash,
DWORD  dwFlags 
)

Definition at line 448 of file crypt.c.

450{
451 TRACE("%p %p %p %p %lx\n", catAdmin, hFile, pcbHash, pbHash, dwFlags);
452
453 if (!catAdmin || ((struct catadmin *)catAdmin)->magic != CATADMIN_MAGIC)
454 {
456 return FALSE;
457 }
458
459 return catadmin_calc_hash_from_filehandle(catAdmin, hFile, pcbHash, pbHash, dwFlags);
460}

Referenced by InitFunctionPtrs().

◆ CryptCATAdminEnumCatalogFromHash()

HCATINFO WINAPI CryptCATAdminEnumCatalogFromHash ( HCATADMIN  hCatAdmin,
BYTE pbHash,
DWORD  cbHash,
DWORD  dwFlags,
HCATINFO phPrevCatInfo 
)

Definition at line 466 of file crypt.c.

469{
470 static const WCHAR slashW[] = {'\\',0};
471 static const WCHAR globW[] = {'\\','*','.','c','a','t',0};
472
473 struct catadmin *ca = hCatAdmin;
475 HCATINFO prev = NULL;
476 HCRYPTPROV prov;
477 DWORD size;
478 BOOL ret;
479
480 TRACE("%p %p %ld %lx %p\n", hCatAdmin, pbHash, cbHash, dwFlags, phPrevCatInfo);
481
482 if (!ca || ca->magic != CATADMIN_MAGIC || !pbHash || cbHash != 20 || dwFlags)
483 {
485 return NULL;
486 }
487 if (phPrevCatInfo) prev = *phPrevCatInfo;
488
490 if (!ret) return NULL;
491
492 if (!prev)
493 {
494 WCHAR *path;
495
496 size = lstrlenW(ca->path) * sizeof(WCHAR) + sizeof(globW);
497 if (!(path = malloc(size)))
498 {
499 CryptReleaseContext(prov, 0);
501 return NULL;
502 }
503 lstrcpyW(path, ca->path);
504 lstrcatW(path, globW);
505
506 FindClose(ca->find);
507 ca->find = FindFirstFileW(path, &data);
508
509 free(path);
510 if (ca->find == INVALID_HANDLE_VALUE)
511 {
512 CryptReleaseContext(prov, 0);
513 return NULL;
514 }
515 }
516 else if (!FindNextFileW(ca->find, &data))
517 {
518 CryptCATAdminReleaseCatalogContext(hCatAdmin, prev, 0);
519 CryptReleaseContext(prov, 0);
520 return NULL;
521 }
522
523 while (1)
524 {
527 struct catinfo *ci;
528 HANDLE hcat;
529
530 size = (lstrlenW(ca->path) + lstrlenW(data.cFileName) + 2) * sizeof(WCHAR);
531 if (!(filename = malloc(size)))
532 {
534 return NULL;
535 }
536 lstrcpyW(filename, ca->path);
538 lstrcatW(filename, data.cFileName);
539
540 hcat = CryptCATOpen(filename, CRYPTCAT_OPEN_EXISTING, prov, 0, 0);
541 if (hcat == INVALID_HANDLE_VALUE)
542 {
543 WARN("couldn't open %s (%lu)\n", debugstr_w(filename), GetLastError());
544 continue;
545 }
546 while ((member = CryptCATEnumerateMember(hcat, member)))
547 {
548 if (member->pIndirectData->Digest.cbData != cbHash)
549 {
550 WARN("amount of hash bytes differs: %lu/%lu\n", member->pIndirectData->Digest.cbData, cbHash);
551 continue;
552 }
553 if (!memcmp(member->pIndirectData->Digest.pbData, pbHash, cbHash))
554 {
555 TRACE("file %s matches\n", debugstr_w(data.cFileName));
556
557 CryptCATClose(hcat);
558 CryptReleaseContext(prov, 0);
559 if (!phPrevCatInfo)
560 {
561 FindClose(ca->find);
562 ca->find = INVALID_HANDLE_VALUE;
563 }
565 free(filename);
566 return ci;
567 }
568 }
569 CryptCATClose(hcat);
570 free(filename);
571
572 if (!FindNextFileW(ca->find, &data))
573 {
574 FindClose(ca->find);
575 ca->find = INVALID_HANDLE_VALUE;
576 CryptReleaseContext(prov, 0);
577 return NULL;
578 }
579 }
580 return NULL;
581}
#define WARN(fmt,...)
Definition: precomp.h:61
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
static HCATINFO create_catinfo(const WCHAR *filename)
Definition: crypt.c:72
BOOL WINAPI CryptCATClose(HANDLE hCatalog)
Definition: crypt.c:730
CRYPTCATMEMBER *WINAPI CryptCATEnumerateMember(HANDLE hCatalog, CRYPTCATMEMBER *prev)
Definition: crypt.c:841
BOOL WINAPI CryptCATAdminReleaseCatalogContext(HCATADMIN hCatAdmin, HCATINFO hCatInfo, DWORD dwFlags)
Definition: crypt.c:598
HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv, DWORD dwPublicVersion, DWORD dwEncodingType)
Definition: crypt.c:1092
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
#define CRYPTCAT_OPEN_EXISTING
Definition: mscat.h:42
WCHAR path[MAX_PATH]
Definition: crypt.c:59
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

◆ CryptCATAdminReleaseCatalogContext()

BOOL WINAPI CryptCATAdminReleaseCatalogContext ( HCATADMIN  hCatAdmin,
HCATINFO  hCatInfo,
DWORD  dwFlags 
)

Definition at line 598 of file crypt.c.

601{
602 struct catinfo *ci = hCatInfo;
603 struct catadmin *ca = hCatAdmin;
604
605 TRACE("%p %p %lx\n", hCatAdmin, hCatInfo, dwFlags);
606
607 if (!ca || ca->magic != CATADMIN_MAGIC || !ci || ci->magic != CATINFO_MAGIC)
608 {
610 return FALSE;
611 }
612 /* Ensure compiler doesn't optimize out the assignment with 0. */
613 SecureZeroMemory(&ci->magic, sizeof(ci->magic));
614 free(ci);
615 return TRUE;
616}
#define SecureZeroMemory
Definition: winbase.h:1465

Referenced by CryptCATAdminEnumCatalogFromHash(), InitFunctionPtrs(), and pSetupInstallCatalog().

◆ CryptCATAdminReleaseContext()

BOOL WINAPI CryptCATAdminReleaseContext ( HCATADMIN  hCatAdmin,
DWORD  dwFlags 
)

Definition at line 632 of file crypt.c.

633{
634 struct catadmin *ca = hCatAdmin;
635
636 TRACE("%p %lx\n", hCatAdmin, dwFlags);
637
638 if (!ca || ca->magic != CATADMIN_MAGIC)
639 {
641 return FALSE;
642 }
643 if (ca->find != INVALID_HANDLE_VALUE) FindClose(ca->find);
644 /* Ensure compiler doesn't optimize out the assignment with 0. */
645 SecureZeroMemory(&ca->magic, sizeof(ca->magic));
646 free(ca);
647 return TRUE;
648}

Referenced by InitFunctionPtrs(), and pSetupInstallCatalog().

◆ CryptCATAdminRemoveCatalog()

BOOL WINAPI CryptCATAdminRemoveCatalog ( HCATADMIN  hCatAdmin,
LPCWSTR  pwszCatalogFile,
DWORD  dwFlags 
)

Definition at line 665 of file crypt.c.

666{
667 struct catadmin *ca = hCatAdmin;
668
669 TRACE("%p %s %lx\n", hCatAdmin, debugstr_w(pwszCatalogFile), dwFlags);
670
671 if (!ca || ca->magic != CATADMIN_MAGIC)
672 {
674 return FALSE;
675 }
676
677 /* Only delete when there is a filename and no path */
678 if (pwszCatalogFile && pwszCatalogFile[0] != 0 &&
679 !wcschr(pwszCatalogFile, '\\') && !wcschr(pwszCatalogFile, '/') &&
680 !wcschr(pwszCatalogFile, ':'))
681 {
682 static const WCHAR slashW[] = {'\\',0};
683 WCHAR *target;
684 DWORD len;
685
686 len = lstrlenW(ca->path) + lstrlenW(pwszCatalogFile) + 2;
687 if (!(target = malloc(len * sizeof(WCHAR))))
688 {
690 return FALSE;
691 }
692 lstrcpyW(target, ca->path);
694 lstrcatW(target, pwszCatalogFile);
695
697
698 free(target);
699 }
700
701 return TRUE;
702}
#define wcschr
Definition: compat.h:17
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39

Referenced by InitFunctionPtrs().

◆ CryptCATAdminResolveCatalogPath()

BOOL WINAPI CryptCATAdminResolveCatalogPath ( HCATADMIN  hcatadmin,
WCHAR catalog_file,
CATALOG_INFO info,
DWORD  flags 
)

Definition at line 707 of file crypt.c.

709{
710 static const WCHAR slashW[] = {'\\',0};
711 struct catadmin *ca = hcatadmin;
712
713 TRACE("%p %s %p %lx\n", hcatadmin, debugstr_w(catalog_file), info, flags);
714
715 if (!ca || ca->magic != CATADMIN_MAGIC || !info || info->cbStruct != sizeof(*info) || flags)
716 {
718 return FALSE;
719 }
720 lstrcpyW(info->wszCatalogFile, ca->path);
721 lstrcatW(info->wszCatalogFile, slashW);
722 lstrcatW(info->wszCatalogFile, catalog_file);
723
724 return TRUE;
725}

◆ CryptCATCatalogInfoFromContext()

BOOL WINAPI CryptCATCatalogInfoFromContext ( HCATINFO  hcatinfo,
CATALOG_INFO info,
DWORD  flags 
)

Definition at line 1023 of file crypt.c.

1024{
1025 struct catinfo *ci = hcatinfo;
1026
1027 TRACE("%p, %p, %lx\n", hcatinfo, info, flags);
1028
1029 if (!hcatinfo || hcatinfo == INVALID_HANDLE_VALUE || ci->magic != CATINFO_MAGIC ||
1030 flags || !info || info->cbStruct != sizeof(*info))
1031 {
1033 return FALSE;
1034 }
1035 lstrcpyW(info->wszCatalogFile, ci->file);
1036 return TRUE;
1037}

Referenced by InitFunctionPtrs().

◆ CryptCATCDFClose()

BOOL WINAPI CryptCATCDFClose ( CRYPTCATCDF pCDF)

Definition at line 1234 of file crypt.c.

1235{
1236 FIXME("(%p) stub\n", pCDF);
1237
1238 return FALSE;
1239}

Referenced by InitFunctionPtrs().

◆ CryptCATCDFEnumCatAttributes()

CRYPTCATATTRIBUTE *WINAPI CryptCATCDFEnumCatAttributes ( CRYPTCATCDF pCDF,
CRYPTCATATTRIBUTE pPrevAttr,
PFN_CDF_PARSE_ERROR_CALLBACK  pfnParseError 
)

Definition at line 1244 of file crypt.c.

1247{
1248 FIXME("(%p %p %p) stub\n", pCDF, pPrevAttr, pfnParseError);
1249
1250 return NULL;
1251}

Referenced by InitFunctionPtrs().

◆ CryptCATCDFEnumMembersByCDFTagEx()

LPWSTR WINAPI CryptCATCDFEnumMembersByCDFTagEx ( CRYPTCATCDF pCDF,
LPWSTR  pwszPrevCDFTag,
PFN_CDF_PARSE_ERROR_CALLBACK  pfnParseError,
CRYPTCATMEMBER **  ppMember,
BOOL  fContinueOnError,
LPVOID  pvReserved 
)

Definition at line 1256 of file crypt.c.

1260{
1261 FIXME("(%p %s %p %p %d %p) stub\n", pCDF, debugstr_w(pwszPrevCDFTag), pfnParseError,
1262 ppMember, fContinueOnError, pvReserved);
1263
1264 return NULL;
1265}
static LPCWSTR LPVOID pvReserved
Definition: asmcache.c:749

Referenced by InitFunctionPtrs().

◆ CryptCATCDFOpen()

CRYPTCATCDF *WINAPI CryptCATCDFOpen ( LPWSTR  pwszFilePath,
PFN_CDF_PARSE_ERROR_CALLBACK  pfnParseError 
)

Definition at line 1270 of file crypt.c.

1272{
1273 FIXME("(%s %p) stub\n", debugstr_w(pwszFilePath), pfnParseError);
1274
1275 return NULL;
1276}

Referenced by InitFunctionPtrs().

◆ CryptCATClose()

BOOL WINAPI CryptCATClose ( HANDLE  hCatalog)

Definition at line 730 of file crypt.c.

731{
732 struct cryptcat *cc = hCatalog;
733
734 TRACE("(%p)\n", hCatalog);
735
736 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
737 {
739 return FALSE;
740 }
741 free(cc->attr);
742 free(cc->inner);
743 CryptMsgClose(cc->msg);
744
745 /* Ensure compiler doesn't optimize out the assignment with 0. */
746 SecureZeroMemory(&cc->magic, sizeof(cc->magic));
747 free(cc);
748 return TRUE;
749}
BOOL WINAPI CryptMsgClose(HCRYPTMSG hCryptMsg)
Definition: msg.c:3597
#define CRYPTCAT_MAGIC
Definition: crypt.c:41
uint32_t cc
Definition: isohybrid.c:75
Definition: crypt.c:45

Referenced by CryptCATAdminEnumCatalogFromHash(), and InitFunctionPtrs().

◆ CryptCATEnumerateAttr()

CRYPTCATATTRIBUTE *WINAPI CryptCATEnumerateAttr ( HANDLE  hCatalog,
CRYPTCATMEMBER member,
CRYPTCATATTRIBUTE prev 
)

Definition at line 805 of file crypt.c.

806{
807 struct cryptcat *cc = hCatalog;
808
809 FIXME("%p, %p, %p\n", hCatalog, member, prev);
810
811 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
812 {
814 return NULL;
815 }
817 return NULL;
818}
#define CRYPT_E_NOT_FOUND
Definition: winerror.h:4421

Referenced by InitFunctionPtrs().

◆ CryptCATEnumerateCatAttr()

CRYPTCATATTRIBUTE *WINAPI CryptCATEnumerateCatAttr ( HANDLE  hCatalog,
CRYPTCATATTRIBUTE prev 
)

Definition at line 823 of file crypt.c.

824{
825 struct cryptcat *cc = hCatalog;
826
827 FIXME("%p, %p\n", hCatalog, prev);
828
829 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
830 {
832 return NULL;
833 }
835 return NULL;
836}

Referenced by InitFunctionPtrs().

◆ CryptCATEnumerateMember()

CRYPTCATMEMBER *WINAPI CryptCATEnumerateMember ( HANDLE  hCatalog,
CRYPTCATMEMBER prev 
)

Definition at line 841 of file crypt.c.

842{
843 struct cryptcat *cc = hCatalog;
844 CRYPTCATMEMBER *member = prev;
846 DWORD size, i;
847
848 TRACE("%p, %p\n", hCatalog, prev);
849
850 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
851 {
853 return NULL;
854 }
855
856 /* dumping the contents makes me think that dwReserved is the iteration number */
857 if (!member)
858 {
859 if (!(member = malloc(sizeof(*member))))
860 {
862 return NULL;
863 }
864 member->cbStruct = sizeof(*member);
865 member->pwszFileName = member->pwszReferenceTag = NULL;
866 member->dwReserved = 0;
867 member->hReserved = NULL;
868 member->gSubjectType = cc->subject;
869 member->fdwMemberFlags = 0;
870 member->pIndirectData = NULL;
871 member->dwCertVersion = cc->inner->dwVersion;
872 }
873 else member->dwReserved++;
874
875 if (member->dwReserved >= cc->inner->cCTLEntry)
876 {
878 goto error;
879 }
880
881 /* list them backwards, like native */
882 entry = &cc->inner->rgCTLEntry[cc->inner->cCTLEntry - member->dwReserved - 1];
883
884 member->sEncodedIndirectData.cbData = member->sEncodedMemberInfo.cbData = 0;
885 member->sEncodedIndirectData.pbData = member->sEncodedMemberInfo.pbData = NULL;
886 free(member->pIndirectData);
887 member->pIndirectData = NULL;
888
889 for (i = 0; i < entry->cAttribute; i++)
890 {
891 CRYPT_ATTRIBUTE *attr = entry->rgAttribute + i;
892
893 if (attr->cValue != 1)
894 {
895 ERR("Can't handle attr->cValue of %lu\n", attr->cValue);
896 continue;
897 }
898 if (!strcmp(attr->pszObjId, CAT_MEMBERINFO_OBJID))
899 {
901 BOOL ret;
902
903 member->sEncodedMemberInfo.cbData = attr->rgValue->cbData;
904 member->sEncodedMemberInfo.pbData = attr->rgValue->pbData;
905
906 CryptDecodeObject(cc->encoding, CAT_MEMBERINFO_OBJID, attr->rgValue->pbData, attr->rgValue->cbData, 0, NULL, &size);
907
908 if (!(mi = malloc(size)))
909 {
911 goto error;
912 }
913 ret = CryptDecodeObject(cc->encoding, CAT_MEMBERINFO_OBJID, attr->rgValue->pbData, attr->rgValue->cbData, 0, mi, &size);
914 if (ret)
915 {
917
918 member->dwCertVersion = mi->dwCertVersion;
919 RtlInitUnicodeString(&guid, mi->pwszSubjGuid);
920 if (RtlGUIDFromString(&guid, &member->gSubjectType))
921 {
922 free(mi);
923 goto error;
924 }
925 }
926 free(mi);
927 if (!ret) goto error;
928 }
929 else if (!strcmp(attr->pszObjId, SPC_INDIRECT_DATA_OBJID))
930 {
931 /* SPC_INDIRECT_DATA_CONTENT is equal to SIP_INDIRECT_DATA */
932
933 member->sEncodedIndirectData.cbData = attr->rgValue->cbData;
934 member->sEncodedIndirectData.pbData = attr->rgValue->pbData;
935
936 CryptDecodeObject(cc->encoding, SPC_INDIRECT_DATA_OBJID, attr->rgValue->pbData, attr->rgValue->cbData, 0, NULL, &size);
937
938 if (!(member->pIndirectData = malloc(size)))
939 {
941 goto error;
942 }
943 CryptDecodeObject(cc->encoding, SPC_INDIRECT_DATA_OBJID, attr->rgValue->pbData, attr->rgValue->cbData, 0, member->pIndirectData, &size);
944 }
945 else
946 /* this object id should probably be handled in CryptCATEnumerateAttr */
947 FIXME("unhandled object id \"%s\"\n", attr->pszObjId);
948 }
949
950 if (!member->sEncodedMemberInfo.cbData || !member->sEncodedIndirectData.cbData)
951 {
952 ERR("Corrupted catalog entry?\n");
954 goto error;
955 }
956 size = (2 * member->pIndirectData->Digest.cbData + 1) * sizeof(WCHAR);
957 member->pwszReferenceTag = realloc(member->pwszReferenceTag, size);
958
959 if (!member->pwszReferenceTag)
960 {
962 goto error;
963 }
964 /* FIXME: reference tag is usually the file hash but doesn't have to be */
965 for (i = 0; i < member->pIndirectData->Digest.cbData; i++)
966 {
967 DWORD sub;
968
969 sub = member->pIndirectData->Digest.pbData[i] >> 4;
970 member->pwszReferenceTag[i * 2] = (sub < 10 ? '0' + sub : 'A' + sub - 10);
971 sub = member->pIndirectData->Digest.pbData[i] & 0xf;
972 member->pwszReferenceTag[i * 2 + 1] = (sub < 10 ? '0' + sub : 'A' + sub - 10);
973 }
974 member->pwszReferenceTag[i * 2] = 0;
975 return member;
976
977error:
978 free(member->pIndirectData);
979 free(member->pwszReferenceTag);
980 free(member);
981 return NULL;
982}
#define ERR(fmt,...)
Definition: precomp.h:57
BOOL WINAPI CryptDecodeObject(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo)
Definition: decode.c:6278
#define realloc
Definition: debug_ros.c:6
GUID guid
Definition: version.c:147
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
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
uint32_t entry
Definition: isohybrid.c:63
#define error(str)
Definition: mkdosfs.c:1605
static MONITORINFO mi
Definition: win.c:9400
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
Definition: wincrypt.h:835
Definition: cookie.c:202
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
#define CRYPT_E_ATTRIBUTES_MISSING
Definition: winerror.h:4413
#define CAT_MEMBERINFO_OBJID
Definition: wintrust.h:498
#define SPC_INDIRECT_DATA_OBJID
Definition: wintrust.h:480

Referenced by CryptCATAdminEnumCatalogFromHash(), and InitFunctionPtrs().

◆ CryptCATGetAttrInfo()

CRYPTCATATTRIBUTE *WINAPI CryptCATGetAttrInfo ( HANDLE  hCatalog,
CRYPTCATMEMBER member,
LPWSTR  tag 
)

Definition at line 754 of file crypt.c.

755{
756 struct cryptcat *cc = hCatalog;
757
758 FIXME("%p, %p, %s\n", hCatalog, member, debugstr_w(tag));
759
760 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
761 {
763 return NULL;
764 }
766 return NULL;
767}
Definition: ecma_167.h:138

◆ CryptCATGetCatAttrInfo()

CRYPTCATATTRIBUTE *WINAPI CryptCATGetCatAttrInfo ( HANDLE  hCatalog,
LPWSTR  tag 
)

Definition at line 772 of file crypt.c.

773{
774 struct cryptcat *cc = hCatalog;
775
776 FIXME("%p, %s\n", hCatalog, debugstr_w(tag));
777
778 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
779 {
781 return NULL;
782 }
784 return NULL;
785}

◆ CryptCATGetMemberInfo()

CRYPTCATMEMBER *WINAPI CryptCATGetMemberInfo ( HANDLE  hCatalog,
LPWSTR  tag 
)

Definition at line 787 of file crypt.c.

788{
789 struct cryptcat *cc = hCatalog;
790
791 FIXME("%p, %s\n", hCatalog, debugstr_w(tag));
792
793 if (!hCatalog || hCatalog == INVALID_HANDLE_VALUE || cc->magic != CRYPTCAT_MAGIC)
794 {
796 return NULL;
797 }
799 return NULL;
800}

◆ CryptCATOpen()

HANDLE WINAPI CryptCATOpen ( WCHAR filename,
DWORD  flags,
HCRYPTPROV  hProv,
DWORD  dwPublicVersion,
DWORD  dwEncodingType 
)

Definition at line 1092 of file crypt.c.

1094{
1095 HANDLE file, hmsg;
1096 BYTE *buffer = NULL;
1097 DWORD size, open_mode = OPEN_ALWAYS;
1098 struct cryptcat *cc;
1099 BOOL valid;
1100
1101 TRACE("filename %s, flags %#lx, provider %#Ix, version %#lx, type %#lx\n",
1102 debugstr_w(filename), flags, hProv, dwPublicVersion, dwEncodingType);
1103
1104 if (!filename)
1105 {
1107 return INVALID_HANDLE_VALUE;
1108 }
1109
1110 if (!dwEncodingType) dwEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
1111
1113 open_mode = OPEN_EXISTING;
1115 open_mode = CREATE_ALWAYS;
1116
1119
1121 if (!(buffer = malloc(size)))
1122 {
1125 return INVALID_HANDLE_VALUE;
1126 }
1127 if (!(hmsg = CryptMsgOpenToDecode(dwEncodingType, 0, 0, hProv, NULL, NULL)))
1128 {
1130 free(buffer);
1131 return INVALID_HANDLE_VALUE;
1132 }
1133 if (!size) valid = FALSE;
1134 else if (!ReadFile(file, buffer, size, &size, NULL))
1135 {
1137 free(buffer);
1138 CryptMsgClose(hmsg);
1139 return INVALID_HANDLE_VALUE;
1140 }
1141 else valid = CryptMsgUpdate(hmsg, buffer, size, TRUE);
1142 free(buffer);
1144
1145 size = sizeof(DWORD);
1146 if (!(cc = calloc(1, sizeof(*cc))))
1147 {
1148 CryptMsgClose(hmsg);
1150 return INVALID_HANDLE_VALUE;
1151 }
1152
1153 cc->msg = hmsg;
1154 cc->encoding = dwEncodingType;
1155 if (!valid)
1156 {
1157 cc->magic = CRYPTCAT_MAGIC;
1159 return cc;
1160 }
1161 else if (CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_COUNT_PARAM, 0, &cc->attr_count, &size))
1162 {
1163 DWORD i, sum = 0;
1164 BYTE *p;
1165
1166 for (i = 0; i < cc->attr_count; i++)
1167 {
1169 {
1170 CryptMsgClose(hmsg);
1171 free(cc);
1172 return INVALID_HANDLE_VALUE;
1173 }
1174 sum += size;
1175 }
1176 if (!(cc->attr = malloc(sizeof(*cc->attr) * cc->attr_count + sum)))
1177 {
1178 CryptMsgClose(hmsg);
1179 free(cc);
1181 return INVALID_HANDLE_VALUE;
1182 }
1183 p = (BYTE *)(cc->attr + cc->attr_count);
1184 for (i = 0; i < cc->attr_count; i++)
1185 {
1187 {
1188 CryptMsgClose(hmsg);
1189 free(cc->attr);
1190 free(cc);
1191 return INVALID_HANDLE_VALUE;
1192 }
1194 {
1195 CryptMsgClose(hmsg);
1196 free(cc->attr);
1197 free(cc);
1198 return INVALID_HANDLE_VALUE;
1199 }
1200 p += size;
1201 }
1202 cc->inner = decode_inner_content(hmsg, dwEncodingType, &cc->inner_len);
1203 if (!cc->inner || !CryptSIPRetrieveSubjectGuid(filename, NULL, &cc->subject))
1204 {
1205 CryptMsgClose(hmsg);
1206 free(cc->attr);
1207 free(cc->inner);
1208 free(cc);
1209 return INVALID_HANDLE_VALUE;
1210 }
1211 cc->magic = CRYPTCAT_MAGIC;
1213 return cc;
1214 }
1215 free(cc);
1216 return INVALID_HANDLE_VALUE;
1217}
#define ERROR_SUCCESS
Definition: deptool.c:10
HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, HCRYPTPROV_LEGACY hCryptProv, PCERT_INFO pRecipientInfo, PCMSG_STREAM_INFO pStreamInfo)
Definition: msg.c:3552
BOOL WINAPI CryptMsgGetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, DWORD dwIndex, void *pvData, DWORD *pcbData)
Definition: msg.c:3626
BOOL WINAPI CryptMsgUpdate(HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, BOOL fFinal)
Definition: msg.c:3616
BOOL WINAPI CryptSIPRetrieveSubjectGuid(LPCWSTR FileName, HANDLE hFileIn, GUID *pgSubject)
Definition: sip.c:310
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
static CTL_INFO * decode_inner_content(HANDLE hmsg, DWORD encoding, DWORD *len)
Definition: crypt.c:984
BOOLEAN valid
GLfloat GLfloat p
Definition: glext.h:8902
#define CREATE_ALWAYS
Definition: disk.h:72
#define OPEN_ALWAYS
Definition: disk.h:70
static HCRYPTPROV hProv
Definition: rsaenh.c:32
#define CRYPTCAT_OPEN_CREATENEW
Definition: mscat.h:40
#define DWORD
Definition: nt_native.h:44
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35
#define calloc
Definition: rosglue.h:14
Definition: fci.c:127
#define CMSG_ATTR_CERT_COUNT_PARAM
Definition: wincrypt.h:4116
#define X509_ASN_ENCODING
Definition: wincrypt.h:2501
#define PKCS_7_ASN_ENCODING
Definition: wincrypt.h:2503
#define CMSG_ATTR_CERT_PARAM
Definition: wincrypt.h:4117

Referenced by CryptCATAdminEnumCatalogFromHash(), and InitFunctionPtrs().

◆ CryptCATPersistStore()

BOOL WINAPI CryptCATPersistStore ( HANDLE  catalog)

Definition at line 1081 of file crypt.c.

1082{
1083 FIXME("catalog %p, stub!\n", catalog);
1084
1086 return FALSE;
1087}
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102

◆ CryptCATPutAttrInfo()

CRYPTCATATTRIBUTE *WINAPI CryptCATPutAttrInfo ( HANDLE  catalog,
CRYPTCATMEMBER member,
WCHAR name,
DWORD  flags,
DWORD  size,
BYTE data 
)

Definition at line 1042 of file crypt.c.

1044{
1045 FIXME("catalog %p, member %p, name %s, flags %#lx, size %lu, data %p, stub!\n",
1046 catalog, member, debugstr_w(name), flags, size, data);
1047
1049 return NULL;
1050}
Definition: name.c:39

◆ CryptCATPutCatAttrInfo()

CRYPTCATATTRIBUTE *WINAPI CryptCATPutCatAttrInfo ( HANDLE  catalog,
WCHAR name,
DWORD  flags,
DWORD  size,
BYTE data 
)

Definition at line 1055 of file crypt.c.

1057{
1058 FIXME("catalog %p, name %s, flags %#lx, size %lu, data %p, stub!\n",
1059 catalog, debugstr_w(name), flags, size, data);
1060
1062 return NULL;
1063}

◆ CryptCATPutMemberInfo()

CRYPTCATMEMBER *WINAPI CryptCATPutMemberInfo ( HANDLE  catalog,
WCHAR filename,
WCHAR member,
GUID subject,
DWORD  version,
DWORD  size,
BYTE data 
)

Definition at line 1068 of file crypt.c.

1070{
1071 FIXME("catalog %p, filename %s, member %s, subject %s, version %lu, size %lu, data %p, stub!\n",
1073
1075 return NULL;
1076}
static const WCHAR version[]
Definition: asmname.c:66

◆ CryptSIPCreateIndirectData()

BOOL WINAPI CryptSIPCreateIndirectData ( SIP_SUBJECTINFO pSubjectInfo,
DWORD pcbIndirectData,
SIP_INDIRECT_DATA pIndirectData 
)

Definition at line 1222 of file crypt.c.

1224{
1225 FIXME("(%p %p %p) stub\n", pSubjectInfo, pcbIndirectData, pIndirectData);
1226
1227 return FALSE;
1228}

◆ CryptSIPGetSignedDataMsg()

BOOL WINAPI CryptSIPGetSignedDataMsg ( SIP_SUBJECTINFO pSubjectInfo,
DWORD pdwEncodingType,
DWORD  dwIndex,
DWORD pcbSignedDataMsg,
BYTE pbSignedDataMsg 
)

Definition at line 1625 of file crypt.c.

1627{
1628 BOOL ret;
1629
1630 TRACE("(%p %p %ld %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
1631 pcbSignedDataMsg, pbSignedDataMsg);
1632
1633 if(!pSubjectInfo)
1634 {
1636 return FALSE;
1637 }
1638
1639 if (!memcmp(pSubjectInfo->pgSubjectType, &unknown, sizeof(unknown)))
1640 ret = WINTRUST_GetSignedMsgFromPEFile(pSubjectInfo, pdwEncodingType,
1641 dwIndex, pcbSignedDataMsg, pbSignedDataMsg);
1642 else if (!memcmp(pSubjectInfo->pgSubjectType, &cabGUID, sizeof(cabGUID)))
1643 ret = WINTRUST_GetSignedMsgFromCabFile(pSubjectInfo, pdwEncodingType,
1644 dwIndex, pcbSignedDataMsg, pbSignedDataMsg);
1645 else if (!memcmp(pSubjectInfo->pgSubjectType, &catGUID, sizeof(catGUID)))
1646 ret = WINTRUST_GetSignedMsgFromCatFile(pSubjectInfo, pdwEncodingType,
1647 dwIndex, pcbSignedDataMsg, pbSignedDataMsg);
1648 else
1649 {
1650 FIXME("unimplemented for subject type %s\n",
1651 debugstr_guid(pSubjectInfo->pgSubjectType));
1652 ret = FALSE;
1653 }
1654
1655 TRACE("returning %d\n", ret);
1656 return ret;
1657}
static const GUID unknown
Definition: crypt.c:1615
static BOOL WINTRUST_GetSignedMsgFromCabFile(SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
Definition: crypt.c:1437
static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
Definition: crypt.c:1278
static const GUID catGUID
Definition: crypt.c:1619
static BOOL WINTRUST_GetSignedMsgFromCatFile(SIP_SUBJECTINFO *pSubjectInfo, DWORD *pdwEncodingType, DWORD dwIndex, DWORD *pcbSignedDataMsg, BYTE *pbSignedDataMsg)
Definition: crypt.c:1579
static const GUID cabGUID
Definition: crypt.c:1617
GUID * pgSubjectType
Definition: mssip.h:52

◆ CryptSIPPutSignedDataMsg()

BOOL WINAPI CryptSIPPutSignedDataMsg ( SIP_SUBJECTINFO pSubjectInfo,
DWORD  pdwEncodingType,
DWORD pdwIndex,
DWORD  cbSignedDataMsg,
BYTE pbSignedDataMsg 
)

Definition at line 1662 of file crypt.c.

1664{
1665 TRACE("(%p %ld %p %ld %p)\n", pSubjectInfo, pdwEncodingType, pdwIndex,
1666 cbSignedDataMsg, pbSignedDataMsg);
1667
1668 if(!pSubjectInfo) {
1670 return FALSE;
1671 }
1672
1673 if(!memcmp(pSubjectInfo->pgSubjectType, &unknown, sizeof(unknown)))
1674 return WINTRUST_PutSignedMsgToPEFile(pSubjectInfo, pdwEncodingType,
1675 pdwIndex, cbSignedDataMsg, pbSignedDataMsg);
1676 else
1677 FIXME("unimplemented for subject type %s\n",
1678 debugstr_guid(pSubjectInfo->pgSubjectType));
1679
1680 return FALSE;
1681}
static BOOL WINTRUST_PutSignedMsgToPEFile(SIP_SUBJECTINFO *pSubjectInfo, DWORD pdwEncodingType, DWORD *pdwIndex, DWORD cbSignedDataMsg, BYTE *pbSignedDataMsg)
Definition: crypt.c:1369

◆ CryptSIPRemoveSignedDataMsg()

BOOL WINAPI CryptSIPRemoveSignedDataMsg ( SIP_SUBJECTINFO pSubjectInfo,
DWORD  dwIndex 
)

Definition at line 1686 of file crypt.c.

1688{
1689 FIXME("(%p %ld) stub\n", pSubjectInfo, dwIndex);
1690
1691 return FALSE;
1692}

◆ CryptSIPVerifyIndirectData()

BOOL WINAPI CryptSIPVerifyIndirectData ( SIP_SUBJECTINFO pSubjectInfo,
SIP_INDIRECT_DATA pIndirectData 
)

Definition at line 1697 of file crypt.c.

1699{
1700 FIXME("(%p %p) stub\n", pSubjectInfo, pIndirectData);
1701
1702 return FALSE;
1703}

◆ decode_inner_content()

static CTL_INFO * decode_inner_content ( HANDLE  hmsg,
DWORD  encoding,
DWORD len 
)
static

Definition at line 984 of file crypt.c.

985{
986 DWORD size;
987 LPSTR oid = NULL;
988 BYTE *buffer = NULL;
989 CTL_INFO *inner = NULL;
990
992 if (!(oid = malloc(size)))
993 {
995 return NULL;
996 }
997 if (!CryptMsgGetParam(hmsg, CMSG_INNER_CONTENT_TYPE_PARAM, 0, oid, &size)) goto out;
998 if (!CryptMsgGetParam(hmsg, CMSG_CONTENT_PARAM, 0, NULL, &size)) goto out;
999 if (!(buffer = malloc(size)))
1000 {
1002 goto out;
1003 }
1004 if (!CryptMsgGetParam(hmsg, CMSG_CONTENT_PARAM, 0, buffer, &size)) goto out;
1005 if (!CryptDecodeObject(encoding, oid, buffer, size, 0, NULL, &size)) goto out;
1006 if (!(inner = malloc(size)))
1007 {
1009 goto out;
1010 }
1011 if (!CryptDecodeObject(encoding, oid, buffer, size, 0, inner, &size)) goto out;
1012 *len = size;
1013
1014out:
1015 free(oid);
1016 free(buffer);
1017 return inner;
1018}
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define CMSG_INNER_CONTENT_TYPE_PARAM
Definition: wincrypt.h:4093
#define CMSG_CONTENT_PARAM
Definition: wincrypt.h:4091
char * LPSTR
Definition: xmlstorage.h:182

Referenced by CryptCATOpen().

◆ pe_image_hash()

static BOOL pe_image_hash ( HANDLE  file,
HCRYPTHASH  hash 
)
static

Definition at line 261 of file crypt.c.

262{
263 UINT32 size, offset, file_size, sig_pos;
265 BYTE *view;
267 BOOL ret = FALSE;
268
269 if ((file_size = GetFileSize( file, NULL )) == INVALID_FILE_SIZE) return FALSE;
270
272 return FALSE;
273
274 if (!(view = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 )) || !(nt = ImageNtHeader( view ))) goto done;
275
277 {
278 const IMAGE_NT_HEADERS64 *nt64 = (const IMAGE_NT_HEADERS64 *)nt;
279
280 /* offset from start of file to checksum */
281 offset = (BYTE *)&nt64->OptionalHeader.CheckSum - view;
282
283 /* area between checksum and security directory entry */
286
289 }
291 {
292 const IMAGE_NT_HEADERS32 *nt32 = (const IMAGE_NT_HEADERS32 *)nt;
293
294 /* offset from start of file to checksum */
295 offset = (BYTE *)&nt32->OptionalHeader.CheckSum - view;
296
297 /* area between checksum and security directory entry */
300
303 }
304 else goto done;
305
306 if (!CryptHashData( hash, view, offset, 0 )) goto done;
307 offset += sizeof(DWORD); /* skip checksum */
308 if (!CryptHashData( hash, view + offset, size, 0 )) goto done;
309
310 offset += size + sizeof(IMAGE_DATA_DIRECTORY); /* skip security entry */
311 if (offset > file_size) goto done;
312 if (sig_pos)
313 {
314 if (sig_pos < offset) goto done;
315 if (sig_pos > file_size) goto done;
316 size = sig_pos - offset; /* exclude signature */
317 }
318 else size = file_size - offset;
319
320 if (!CryptHashData( hash, view + offset, size, 0 )) goto done;
321 ret = TRUE;
322
323 if (!sig_pos && (size = file_size % 8))
324 {
325 static const BYTE pad[7];
326 ret = CryptHashData( hash, pad, 8 - size, 0 );
327 }
328
329done:
332 return ret;
333}
PIMAGE_NT_HEADERS WINAPI ImageNtHeader(_In_ PVOID)
PIMAGE_NT_HEADERS nt
Definition: delayimp.cpp:445
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
struct _IMAGE_DATA_DIRECTORY IMAGE_DATA_DIRECTORY
GLintptr offset
Definition: glext.h:5920
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC
Definition: ntimage.h:376
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC
Definition: ntimage.h:377
#define IMAGE_DIRECTORY_ENTRY_SECURITY
Definition: pedump.c:263
static unsigned int file_size
Definition: regtests2xml.c:47
IMAGE_OPTIONAL_HEADER64 OptionalHeader
Definition: ntimage.h:396
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntimage.h:370
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint32_t UINT32
Definition: typedefs.h:59
#define INVALID_FILE_SIZE
Definition: winbase.h:528
#define IMAGE_FILE_SECURITY_DIRECTORY
Definition: winnt_old.h:676

Referenced by catadmin_calc_hash_from_filehandle().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( wintrust  )

◆ WINTRUST_GetSignedMsgFromCabFile()

static BOOL WINTRUST_GetSignedMsgFromCabFile ( SIP_SUBJECTINFO pSubjectInfo,
DWORD pdwEncodingType,
DWORD  dwIndex,
DWORD pcbSignedDataMsg,
BYTE pbSignedDataMsg 
)
static

Definition at line 1437 of file crypt.c.

1440{
1441 int header_resv;
1442 LONG base_offset, cabsize;
1443 USHORT flags;
1444 BYTE buf[64];
1445 DWORD cert_offset, cert_size, dwRead;
1446
1447 TRACE("(%p %p %ld %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
1448 pcbSignedDataMsg, pbSignedDataMsg);
1449
1450 /* get basic offset & size info */
1451 base_offset = SetFilePointer(pSubjectInfo->hFile, 0L, NULL, SEEK_CUR);
1452
1453 if (SetFilePointer(pSubjectInfo->hFile, 0, NULL, SEEK_END) == INVALID_SET_FILE_POINTER)
1454 {
1455 TRACE("seek error\n");
1456 return FALSE;
1457 }
1458
1459 cabsize = SetFilePointer(pSubjectInfo->hFile, 0L, NULL, SEEK_CUR);
1460 if ((cabsize == -1) || (base_offset == -1) ||
1462 {
1463 TRACE("seek error\n");
1464 return FALSE;
1465 }
1466
1467 /* read in the CFHEADER */
1468 if (!ReadFile(pSubjectInfo->hFile, buf, cfhead_SIZEOF, &dwRead, NULL) ||
1469 dwRead != cfhead_SIZEOF)
1470 {
1471 TRACE("reading header failed\n");
1472 return FALSE;
1473 }
1474
1475 /* check basic MSCF signature */
1476 if (EndGetI32(buf+cfhead_Signature) != 0x4643534d)
1477 {
1478 WARN("cabinet signature not present\n");
1479 return FALSE;
1480 }
1481
1482 /* Ignore the number of folders and files and the set and cabinet IDs */
1483
1484 /* check the header revision */
1485 if ((buf[cfhead_MajorVersion] > 1) ||
1487 {
1488 WARN("cabinet format version > 1.3\n");
1489 return FALSE;
1490 }
1491
1492 /* pull the flags out */
1494
1496 {
1497 TRACE("no header present, not signed\n");
1498 return FALSE;
1499 }
1500
1501 if (!ReadFile(pSubjectInfo->hFile, buf, cfheadext_SIZEOF, &dwRead, NULL) ||
1502 dwRead != cfheadext_SIZEOF)
1503 {
1504 ERR("bunk reserve-sizes?\n");
1505 return FALSE;
1506 }
1507
1508 header_resv = EndGetI16(buf+cfheadext_HeaderReserved);
1509 if (!header_resv)
1510 {
1511 TRACE("no header_resv, not signed\n");
1512 return FALSE;
1513 }
1514 else if (header_resv < cfsigninfo_SIZEOF)
1515 {
1516 TRACE("header_resv too small, not signed\n");
1517 return FALSE;
1518 }
1519
1520 if (header_resv > 60000)
1521 {
1522 WARN("WARNING; header reserved space > 60000\n");
1523 }
1524
1525 if (!ReadFile(pSubjectInfo->hFile, buf, cfsigninfo_SIZEOF, &dwRead, NULL) ||
1526 dwRead != cfsigninfo_SIZEOF)
1527 {
1528 ERR("couldn't read reserve\n");
1529 return FALSE;
1530 }
1531
1532 cert_offset = EndGetI32(buf+cfsigninfo_CertOffset);
1533 TRACE("cert_offset: %ld\n", cert_offset);
1534 cert_size = EndGetI32(buf+cfsigninfo_CertSize);
1535 TRACE("cert_size: %ld\n", cert_size);
1536
1537 /* The redundant checks are to avoid wraparound */
1538 if (cert_offset > cabsize || cert_size > cabsize ||
1539 cert_offset + cert_size > cabsize)
1540 {
1541 WARN("offset beyond file, not attempting to read\n");
1542 return FALSE;
1543 }
1544
1545 SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET);
1546 if (!pbSignedDataMsg)
1547 {
1548 *pcbSignedDataMsg = cert_size;
1549 return TRUE;
1550 }
1551 if (*pcbSignedDataMsg < cert_size)
1552 {
1553 *pcbSignedDataMsg = cert_size;
1555 return FALSE;
1556 }
1557 if (SetFilePointer(pSubjectInfo->hFile, cert_offset, NULL, SEEK_SET) == INVALID_SET_FILE_POINTER)
1558 {
1559 ERR("couldn't seek to cert location\n");
1560 return FALSE;
1561 }
1562 if (!ReadFile(pSubjectInfo->hFile, pbSignedDataMsg, cert_size, &dwRead,
1563 NULL) || dwRead != cert_size)
1564 {
1565 ERR("couldn't read cert\n");
1566 SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET);
1567 return FALSE;
1568 }
1569 /* The encoding of the files I've seen appears to be in ASN.1
1570 * format, and there isn't a field indicating the type, so assume it
1571 * always is.
1572 */
1573 *pdwEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
1574 /* Restore base offset */
1575 SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET);
1576 return TRUE;
1577}
#define SEEK_END
Definition: cabinet.c:29
#define INVALID_SET_FILE_POINTER
Definition: compat.h:732
#define SetFilePointer
Definition: compat.h:743
#define SEEK_CUR
Definition: stdio.h:44
#define cfheadext_HeaderReserved
Definition: crypt.c:1412
#define cfheadRESERVE_PRESENT
Definition: crypt.c:1419
#define cfhead_Signature
Definition: crypt.c:1406
#define cfsigninfo_CertSize
Definition: crypt.c:1415
#define cfhead_MajorVersion
Definition: crypt.c:1409
#define cfsigninfo_CertOffset
Definition: crypt.c:1414
#define EndGetI16(a)
Definition: crypt.c:1423
#define cfhead_SIZEOF
Definition: crypt.c:1411
#define cfhead_MinorVersion
Definition: crypt.c:1408
#define EndGetI32(a)
Definition: crypt.c:1422
#define cfheadext_SIZEOF
Definition: crypt.c:1413
#define cfsigninfo_SIZEOF
Definition: crypt.c:1416
#define cfhead_Flags
Definition: crypt.c:1410
#define L(x)
Definition: resources.c:13
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define SEEK_SET
Definition: jmemansi.c:26
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
HANDLE hFile
Definition: mssip.h:53

Referenced by CryptSIPGetSignedDataMsg().

◆ WINTRUST_GetSignedMsgFromCatFile()

static BOOL WINTRUST_GetSignedMsgFromCatFile ( SIP_SUBJECTINFO pSubjectInfo,
DWORD pdwEncodingType,
DWORD  dwIndex,
DWORD pcbSignedDataMsg,
BYTE pbSignedDataMsg 
)
static

Definition at line 1579 of file crypt.c.

1582{
1583 BOOL ret;
1584
1585 TRACE("(%p %p %ld %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
1586 pcbSignedDataMsg, pbSignedDataMsg);
1587
1588 if (!pbSignedDataMsg)
1589 {
1590 *pcbSignedDataMsg = GetFileSize(pSubjectInfo->hFile, NULL);
1591 ret = TRUE;
1592 }
1593 else
1594 {
1595 DWORD len = GetFileSize(pSubjectInfo->hFile, NULL);
1596
1597 if (*pcbSignedDataMsg < len)
1598 {
1599 *pcbSignedDataMsg = len;
1601 ret = FALSE;
1602 }
1603 else
1604 {
1605 ret = ReadFile(pSubjectInfo->hFile, pbSignedDataMsg, len,
1606 pcbSignedDataMsg, NULL);
1607 if (ret)
1608 *pdwEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
1609 }
1610 }
1611 return ret;
1612}

Referenced by CryptSIPGetSignedDataMsg().

◆ WINTRUST_GetSignedMsgFromPEFile()

static BOOL WINTRUST_GetSignedMsgFromPEFile ( SIP_SUBJECTINFO pSubjectInfo,
DWORD pdwEncodingType,
DWORD  dwIndex,
DWORD pcbSignedDataMsg,
BYTE pbSignedDataMsg 
)
static

Definition at line 1278 of file crypt.c.

1281{
1282 BOOL ret;
1283 WIN_CERTIFICATE *pCert = NULL;
1284 HANDLE file;
1285
1286 TRACE("(%p %p %ld %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
1287 pcbSignedDataMsg, pbSignedDataMsg);
1288
1289 if(pSubjectInfo->hFile && pSubjectInfo->hFile!=INVALID_HANDLE_VALUE)
1290 file = pSubjectInfo->hFile;
1291 else
1292 {
1293 file = CreateFileW(pSubjectInfo->pwsFileName, GENERIC_READ,
1296 return FALSE;
1297 }
1298
1299 if (!pbSignedDataMsg)
1300 {
1302
1303 /* app hasn't passed buffer, just get the length */
1304 ret = ImageGetCertificateHeader(file, dwIndex, &cert);
1305 if (ret)
1306 {
1307 switch (cert.wCertificateType)
1308 {
1309 case WIN_CERT_TYPE_X509:
1311 *pcbSignedDataMsg = cert.dwLength;
1312 break;
1313 default:
1314 WARN("unknown certificate type %d\n", cert.wCertificateType);
1315 ret = FALSE;
1316 }
1317 }
1318 }
1319 else
1320 {
1321 DWORD len = 0;
1322
1323 ret = ImageGetCertificateData(file, dwIndex, NULL, &len);
1325 goto error;
1326 pCert = malloc(len);
1327 if (!pCert)
1328 {
1329 ret = FALSE;
1330 goto error;
1331 }
1332 ret = ImageGetCertificateData(file, dwIndex, pCert, &len);
1333 if (!ret)
1334 goto error;
1335 pCert->dwLength -= FIELD_OFFSET(WIN_CERTIFICATE, bCertificate);
1336 if (*pcbSignedDataMsg < pCert->dwLength)
1337 {
1338 *pcbSignedDataMsg = pCert->dwLength;
1340 ret = FALSE;
1341 }
1342 else
1343 {
1344 memcpy(pbSignedDataMsg, pCert->bCertificate, pCert->dwLength);
1345 *pcbSignedDataMsg = pCert->dwLength;
1346 switch (pCert->wCertificateType)
1347 {
1348 case WIN_CERT_TYPE_X509:
1349 *pdwEncodingType = X509_ASN_ENCODING;
1350 break;
1352 *pdwEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
1353 break;
1354 default:
1355 WARN("don't know what to do for encoding type %d\n",
1356 pCert->wCertificateType);
1357 *pdwEncodingType = 0;
1358 ret = FALSE;
1359 }
1360 }
1361 }
1362error:
1363 if(pSubjectInfo->hFile != file)
1365 free(pCert);
1366 return ret;
1367}
static DWORD DWORD * dwLength
Definition: fusion.c:86
BOOL WINAPI ImageGetCertificateData(HANDLE handle, DWORD Index, LPWIN_CERTIFICATE Certificate, PDWORD RequiredLength)
Definition: integrity.c:553
BOOL WINAPI ImageGetCertificateHeader(HANDLE handle, DWORD index, LPWIN_CERTIFICATE pCert)
Definition: integrity.c:604
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static BYTE cert[]
Definition: msg.c:1374
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
LPCWSTR pwsFileName
Definition: mssip.h:54
UINT16 wCertificateType
#define WIN_CERT_TYPE_X509
Definition: wintrust.h:625
#define WIN_CERT_TYPE_PKCS_SIGNED_DATA
Definition: wintrust.h:626

Referenced by CryptSIPGetSignedDataMsg().

◆ WINTRUST_PutSignedMsgToPEFile()

static BOOL WINTRUST_PutSignedMsgToPEFile ( SIP_SUBJECTINFO pSubjectInfo,
DWORD  pdwEncodingType,
DWORD pdwIndex,
DWORD  cbSignedDataMsg,
BYTE pbSignedDataMsg 
)
static

Definition at line 1369 of file crypt.c.

1371{
1373 HANDLE file;
1374 DWORD size;
1375 BOOL ret;
1376
1377 if(pSubjectInfo->hFile && pSubjectInfo->hFile!=INVALID_HANDLE_VALUE)
1378 file = pSubjectInfo->hFile;
1379 else
1380 {
1384 return FALSE;
1385 }
1386
1387 /* int aligned WIN_CERTIFICATE structure with cbSignedDataMsg+1 bytes of data */
1388 size = FIELD_OFFSET(WIN_CERTIFICATE, bCertificate[cbSignedDataMsg+4]) & (~3);
1389 cert = calloc(1, size);
1390 if(!cert)
1391 return FALSE;
1392
1393 cert->dwLength = size;
1394 cert->wRevision = WIN_CERT_REVISION_2_0;
1395 cert->wCertificateType = WIN_CERT_TYPE_PKCS_SIGNED_DATA;
1396 memcpy(cert->bCertificate, pbSignedDataMsg, cbSignedDataMsg);
1397 ret = ImageAddCertificate(file, cert, pdwIndex);
1398
1399 free(cert);
1400 if(file != pSubjectInfo->hFile)
1402 return ret;
1403}
BOOL WINAPI ImageAddCertificate(HANDLE FileHandle, LPWIN_CERTIFICATE Certificate, PDWORD Index)
Definition: integrity.c:380
#define GENERIC_WRITE
Definition: nt_native.h:90
#define WIN_CERT_REVISION_2_0
Definition: wintrust.h:623

Referenced by CryptSIPPutSignedDataMsg().

Variable Documentation

◆ cabGUID

const GUID cabGUID
static
Initial value:
= { 0xC689AABA, 0x8E78, 0x11D0, { 0x8C,0x47,
0x00,0xC0,0x4F,0xC2,0x95,0xEE } }

Definition at line 1617 of file crypt.c.

Referenced by CryptSIPGetSignedDataMsg(), CryptSIPRetrieveSubjectGuid(), and test_SIPRetrieveSubjectGUID().

◆ catGUID

const GUID catGUID
static
Initial value:
= { 0xDE351A43, 0x8E59, 0x11D0, { 0x8C,0x47,
0x00,0xC0,0x4F,0xC2,0x95,0xEE }}

Definition at line 1619 of file crypt.c.

Referenced by CryptSIPGetSignedDataMsg(), CryptSIPRetrieveSubjectGuid(), and IsCatalogFile().

◆ unknown

const GUID unknown
static
Initial value:
= { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,
0x00,0xC0,0x4F,0xC2,0x95,0xEE } }

Definition at line 1615 of file crypt.c.

Referenced by CryptSIPGetSignedDataMsg(), CryptSIPPutSignedDataMsg(), and test_context().