2 * Copyright 2002 Mike McCormack for CodeWeavers
3 * Copyright 2005 Juan Lang
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "crypt32_private.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(crypt
);
35 static HCRYPTPROV hDefProv
;
37 BOOL WINAPI
DllMain(HINSTANCE hInstance
, DWORD fdwReason
, PVOID pvReserved
)
41 case DLL_PROCESS_ATTACH
:
42 CRYPT_InitFunctionSets();
44 case DLL_PROCESS_DETACH
:
45 CRYPT_FreeFunctionSets();
46 if (hDefProv
) CryptReleaseContext(hDefProv
, 0);
52 HCRYPTPROV
CRYPT_GetDefaultProvider(void)
55 CryptAcquireContextW(&hDefProv
, NULL
, MS_ENHANCED_PROV_W
,
56 PROV_RSA_FULL
, CRYPT_VERIFYCONTEXT
);
60 typedef void * HLRUCACHE
;
62 /* this function is called by Internet Explorer when it is about to verify a
63 * downloaded component. The first parameter appears to be a pointer to an
64 * unknown type, native fails unless it points to a buffer of at least 20 bytes.
65 * The second parameter appears to be an out parameter, whatever it's set to is
66 * passed (by cryptnet.dll) to I_CryptFlushLruCache.
68 BOOL WINAPI
I_CryptCreateLruCache(void *unknown
, HLRUCACHE
*out
)
70 FIXME("(%p, %p): stub!\n", unknown
, out
);
71 *out
= (void *)0xbaadf00d;
75 BOOL WINAPI
I_CryptFindLruEntryData(DWORD unk0
, DWORD unk1
, DWORD unk2
)
77 FIXME("(%08lx, %08lx, %08lx): stub!\n", unk0
, unk1
, unk2
);
81 DWORD WINAPI
I_CryptFlushLruCache(HLRUCACHE h
, DWORD unk0
, DWORD unk1
)
83 FIXME("(%p, %08lx, %08lx): stub!\n", h
, unk0
, unk1
);
87 HLRUCACHE WINAPI
I_CryptFreeLruCache(HLRUCACHE h
, DWORD unk0
, DWORD unk1
)
89 FIXME("(%p, %08lx, %08lx): stub!\n", h
, unk0
, unk1
);
93 BOOL WINAPI
CryptSIPRemoveProvider(GUID
*pgProv
)
99 /* convert a guid to a wide character string */
100 static void CRYPT_guid2wstr( LPGUID guid
, LPWSTR wstr
)
104 sprintf(str
, "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
105 guid
->Data1
, guid
->Data2
, guid
->Data3
,
106 guid
->Data4
[0], guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3],
107 guid
->Data4
[4], guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7] );
108 MultiByteToWideChar( CP_ACP
, 0, str
, -1, wstr
, 40 );
112 * Helper for CryptSIPAddProvider
114 * Add a registry key containing a dll name and function under
115 * "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\<func>\\<guid>"
117 static LONG
CRYPT_SIPWriteFunction( LPGUID guid
, LPCWSTR szKey
,
118 LPCWSTR szDll
, LPCWSTR szFunction
)
120 static const WCHAR szOID
[] = {
121 'S','o','f','t','w','a','r','e','\\',
122 'M','i','c','r','o','s','o','f','t','\\',
123 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
125 'E','n','c','o','d','i','n','g','T','y','p','e',' ','0','\\',
126 'C','r','y','p','t','S','I','P','D','l','l', 0 };
127 static const WCHAR szBackSlash
[] = { '\\', 0 };
128 static const WCHAR szDllName
[] = { 'D','l','l',0 };
129 static const WCHAR szFuncName
[] = { 'F','u','n','c','N','a','m','e',0 };
130 WCHAR szFullKey
[ 0x100 ];
135 return ERROR_SUCCESS
;
137 /* max length of szFullKey depends on our code only, so we won't overrun */
138 lstrcpyW( szFullKey
, szOID
);
139 lstrcatW( szFullKey
, szKey
);
140 lstrcatW( szFullKey
, szBackSlash
);
141 CRYPT_guid2wstr( guid
, &szFullKey
[ lstrlenW( szFullKey
) ] );
142 lstrcatW( szFullKey
, szBackSlash
);
144 TRACE("key is %s\n", debugstr_w( szFullKey
) );
146 r
= RegCreateKeyW( HKEY_LOCAL_MACHINE
, szFullKey
, &hKey
);
147 if( r
!= ERROR_SUCCESS
)
150 /* write the values */
151 RegSetValueExW( hKey
, szFuncName
, 0, REG_SZ
, (const BYTE
*) szFunction
,
152 ( lstrlenW( szFunction
) + 1 ) * sizeof (WCHAR
) );
153 RegSetValueExW( hKey
, szDllName
, 0, REG_SZ
, (const BYTE
*) szDll
,
154 ( lstrlenW( szDll
) + 1) * sizeof (WCHAR
) );
158 return ERROR_SUCCESS
;
161 BOOL WINAPI
CryptSIPAddProvider(SIP_ADD_NEWPROVIDER
*psNewProv
)
163 static const WCHAR szCreate
[] = {
164 'C','r','e','a','t','e',
165 'I','n','d','i','r','e','c','t','D','a','t','a',0};
166 static const WCHAR szGetSigned
[] = {
167 'G','e','t','S','i','g','n','e','d','D','a','t','a','M','s','g',0};
168 static const WCHAR szIsMyFile
[] = {
169 'I','s','M','y','F','i','l','e','T','y','p','e', 0 };
170 static const WCHAR szPutSigned
[] = {
171 'P','u','t','S','i','g','n','e','d','D','a','t','a','M','s','g',0};
172 static const WCHAR szRemoveSigned
[] = {
173 'R','e','m','o','v','e',
174 'S','i','g','n','e','d','D','a','t','a','M','s','g',0};
175 static const WCHAR szVerify
[] = {
176 'V','e','r','i','f','y',
177 'I','n','d','i','r','e','c','t','D','a','t','a',0};
179 TRACE("%p\n", psNewProv
);
184 TRACE("%s %s %s %s\n",
185 debugstr_guid( psNewProv
->pgSubject
),
186 debugstr_w( psNewProv
->pwszDLLFileName
),
187 debugstr_w( psNewProv
->pwszMagicNumber
),
188 debugstr_w( psNewProv
->pwszIsFunctionName
) );
190 #define CRYPT_SIPADDPROV( key, field ) \
191 CRYPT_SIPWriteFunction( psNewProv->pgSubject, key, \
192 psNewProv->pwszDLLFileName, psNewProv->field)
194 CRYPT_SIPADDPROV( szGetSigned
, pwszGetFuncName
);
195 CRYPT_SIPADDPROV( szPutSigned
, pwszPutFuncName
);
196 CRYPT_SIPADDPROV( szCreate
, pwszCreateFuncName
);
197 CRYPT_SIPADDPROV( szVerify
, pwszVerifyFuncName
);
198 CRYPT_SIPADDPROV( szRemoveSigned
, pwszRemoveFuncName
);
199 CRYPT_SIPADDPROV( szIsMyFile
, pwszIsFunctionNameFmt2
);
201 #undef CRYPT_SIPADDPROV
206 BOOL WINAPI CryptSIPRetrieveSubjectGuid
207 (LPCWSTR FileName
, HANDLE hFileIn
, GUID
*pgSubject
)
213 BOOL WINAPI CryptSIPLoad
214 (const GUID
*pgSubject
, DWORD dwFlags
, SIP_DISPATCH_INFO
*pSipDispatch
)
226 static const struct OIDToAlgID oidToAlgID
[] = {
227 { szOID_RSA_RSA
, CALG_RSA_KEYX
},
228 { szOID_RSA_MD2RSA
, CALG_MD2
},
229 { szOID_RSA_MD4RSA
, CALG_MD4
},
230 { szOID_RSA_MD5RSA
, CALG_MD5
},
231 { szOID_RSA_SHA1RSA
, CALG_SHA
},
232 { szOID_RSA_DH
, CALG_DH_SF
},
233 { szOID_RSA_SMIMEalgESDH
, CALG_DH_EPHEM
},
234 { szOID_RSA_SMIMEalgCMS3DESwrap
, CALG_3DES
},
235 { szOID_RSA_SMIMEalgCMSRC2wrap
, CALG_RC2
},
236 { szOID_RSA_MD2
, CALG_MD2
},
237 { szOID_RSA_MD4
, CALG_MD4
},
238 { szOID_RSA_MD5
, CALG_MD5
},
239 { szOID_RSA_RC2CBC
, CALG_RC2
},
240 { szOID_RSA_RC4
, CALG_RC4
},
241 { szOID_RSA_DES_EDE3_CBC
, CALG_3DES
},
242 { szOID_ANSI_X942_DH
, CALG_DH_SF
},
243 { szOID_X957_DSA
, CALG_DSS_SIGN
},
244 { szOID_X957_SHA1DSA
, CALG_SHA
},
245 { szOID_OIWSEC_md4RSA
, CALG_MD4
},
246 { szOID_OIWSEC_md5RSA
, CALG_MD5
},
247 { szOID_OIWSEC_md4RSA2
, CALG_MD4
},
248 { szOID_OIWSEC_desCBC
, CALG_DES
},
249 { szOID_OIWSEC_dsa
, CALG_DSS_SIGN
},
250 { szOID_OIWSEC_shaDSA
, CALG_SHA
},
251 { szOID_OIWSEC_shaRSA
, CALG_SHA
},
252 { szOID_OIWSEC_sha
, CALG_SHA
},
253 { szOID_OIWSEC_rsaXchg
, CALG_RSA_KEYX
},
254 { szOID_OIWSEC_sha1
, CALG_SHA
},
255 { szOID_OIWSEC_dsaSHA1
, CALG_SHA
},
256 { szOID_OIWSEC_sha1RSASign
, CALG_SHA
},
257 { szOID_OIWDIR_md2RSA
, CALG_MD2
},
258 { szOID_INFOSEC_mosaicUpdatedSig
, CALG_SHA
},
259 { szOID_INFOSEC_mosaicKMandUpdSig
, CALG_DSS_SIGN
},
262 LPCSTR WINAPI
CertAlgIdToOID(DWORD dwAlgId
)
267 return szOID_RSA_RSA
;
269 return szOID_RSA_SMIMEalgESDH
;
271 return szOID_RSA_MD2
;
273 return szOID_RSA_MD4
;
275 return szOID_RSA_MD5
;
277 return szOID_RSA_RC2CBC
;
279 return szOID_RSA_RC4
;
281 return szOID_RSA_DES_EDE3_CBC
;
283 return szOID_ANSI_X942_DH
;
285 return szOID_X957_DSA
;
287 return szOID_OIWSEC_desCBC
;
289 return szOID_OIWSEC_sha1
;
295 DWORD WINAPI
CertOIDToAlgId(LPCSTR pszObjId
)
301 for (i
= 0; i
< sizeof(oidToAlgID
) / sizeof(oidToAlgID
[0]); i
++)
303 if (!strcmp(pszObjId
, oidToAlgID
[i
].oid
))
304 return oidToAlgID
[i
].algID
;
310 LPVOID WINAPI
CryptMemAlloc(ULONG cbSize
)
312 return HeapAlloc(GetProcessHeap(), 0, cbSize
);
315 LPVOID WINAPI
CryptMemRealloc(LPVOID pv
, ULONG cbSize
)
317 return HeapReAlloc(GetProcessHeap(), 0, pv
, cbSize
);
320 VOID WINAPI
CryptMemFree(LPVOID pv
)
322 HeapFree(GetProcessHeap(), 0, pv
);
325 DWORD WINAPI
I_CryptAllocTls(void)
330 LPVOID WINAPI
I_CryptDetachTls(DWORD dwTlsIndex
)
334 ret
= TlsGetValue(dwTlsIndex
);
335 TlsSetValue(dwTlsIndex
, NULL
);
339 LPVOID WINAPI
I_CryptGetTls(DWORD dwTlsIndex
)
341 return TlsGetValue(dwTlsIndex
);
344 BOOL WINAPI
I_CryptSetTls(DWORD dwTlsIndex
, LPVOID lpTlsValue
)
346 return TlsSetValue(dwTlsIndex
, lpTlsValue
);
349 BOOL WINAPI
I_CryptFreeTls(DWORD dwTlsIndex
, DWORD unknown
)
351 TRACE("(%ld, %ld)\n", dwTlsIndex
, unknown
);
352 return TlsFree(dwTlsIndex
);