2 * Miscellaneous crypt32 tests
4 * Copyright 2005 Juan Lang
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/test.h"
30 static void test_findAttribute(void)
33 BYTE blobbin[] = {0x02,0x01,0x01};
34 static CHAR oid[] = "1.2.3";
35 CRYPT_ATTR_BLOB blobs[] = { { sizeof blobbin, blobbin }, };
36 CRYPT_ATTRIBUTE attr = { oid, sizeof(blobs) / sizeof(blobs[0]), blobs };
38 /* returns NULL, last error not set */
39 SetLastError(0xdeadbeef);
40 ret = CertFindAttribute(NULL, 0, NULL);
41 ok(ret == NULL, "Expected failure\n");
42 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
45 SetLastError(0xdeadbeef);
46 ret = CertFindAttribute(NULL, 1, NULL);
48 /* returns NULL, last error is ERROR_INVALID_PARAMETER */
49 SetLastError(0xdeadbeef);
50 ret = CertFindAttribute(NULL, 1, &attr);
51 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
52 "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
54 /* returns NULL, last error not set */
55 SetLastError(0xdeadbeef);
56 ret = CertFindAttribute("bogus", 1, &attr);
57 ok(ret == NULL, "Expected failure\n");
58 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
60 /* returns NULL, last error not set */
61 SetLastError(0xdeadbeef);
62 ret = CertFindAttribute("1.2.4", 1, &attr);
63 ok(ret == NULL, "Expected failure\n");
64 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
66 /* succeeds, last error not set */
67 SetLastError(0xdeadbeef);
68 ret = CertFindAttribute("1.2.3", 1, &attr);
69 ok(ret != NULL, "CertFindAttribute failed: %08lx\n", GetLastError());
72 static void test_findExtension(void)
75 static CHAR oid[] = "1.2.3";
76 BYTE blobbin[] = {0x02,0x01,0x01};
77 CERT_EXTENSION ext = { oid, TRUE, { sizeof blobbin, blobbin } };
79 /* returns NULL, last error not set */
80 SetLastError(0xdeadbeef);
81 ret = CertFindExtension(NULL, 0, NULL);
82 ok(ret == NULL, "Expected failure\n");
83 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
86 SetLastError(0xdeadbeef);
87 ret = CertFindExtension(NULL, 1, NULL);
89 /* returns NULL, last error is ERROR_INVALID_PARAMETER */
90 SetLastError(0xdeadbeef);
91 ret = CertFindExtension(NULL, 1, &ext);
92 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
93 "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
95 /* returns NULL, last error not set */
96 SetLastError(0xdeadbeef);
97 ret = CertFindExtension("bogus", 1, &ext);
98 ok(ret == NULL, "Expected failure\n");
99 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
101 /* returns NULL, last error not set */
102 SetLastError(0xdeadbeef);
103 ret = CertFindExtension("1.2.4", 1, &ext);
104 ok(ret == NULL, "Expected failure\n");
105 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
107 /* succeeds, last error not set */
108 SetLastError(0xdeadbeef);
109 ret = CertFindExtension("1.2.3", 1, &ext);
110 ok(ret != NULL, "CertFindExtension failed: %08lx\n", GetLastError());
113 static void test_findRDNAttr(void)
116 static CHAR oid[] = "1.2.3";
117 BYTE bin[] = { 0x16,0x09,'J','u','a','n',' ','L','a','n','g' };
118 CERT_RDN_ATTR attrs[] = {
119 { oid, CERT_RDN_IA5_STRING, { sizeof bin, bin } },
122 { sizeof(attrs) / sizeof(attrs[0]), attrs },
124 CERT_NAME_INFO nameInfo = { sizeof(rdns) / sizeof(rdns[0]), rdns };
127 SetLastError(0xdeadbeef);
128 ret = CertFindRDNAttr(NULL, NULL);
130 /* returns NULL, last error is ERROR_INVALID_PARAMETER */
131 SetLastError(0xdeadbeef);
132 ret = CertFindRDNAttr(NULL, &nameInfo);
133 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
134 "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
136 /* returns NULL, last error not set */
137 SetLastError(0xdeadbeef);
138 ret = CertFindRDNAttr("bogus", &nameInfo);
139 ok(ret == NULL, "Expected failure\n");
140 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
142 /* returns NULL, last error not set */
143 SetLastError(0xdeadbeef);
144 ret = CertFindRDNAttr("1.2.4", &nameInfo);
145 ok(ret == NULL, "Expected failure\n");
146 ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
148 /* succeeds, last error not set */
149 SetLastError(0xdeadbeef);
150 ret = CertFindRDNAttr("1.2.3", &nameInfo);
151 ok(ret != NULL, "CertFindRDNAttr failed: %08lx\n", GetLastError());
154 static void test_verifyTimeValidity(void)
158 CERT_INFO info = { 0 };
161 GetSystemTime(&sysTime);
162 SystemTimeToFileTime(&sysTime, &fileTime);
164 ret = CertVerifyTimeValidity(NULL, NULL);
165 ret = CertVerifyTimeValidity(&fileTime, NULL);
167 /* Check with 0 NotBefore and NotAfter */
168 ret = CertVerifyTimeValidity(&fileTime, &info);
169 ok(ret == 1, "Expected 1, got %ld\n", ret);
170 memcpy(&info.NotAfter, &fileTime, sizeof(info.NotAfter));
171 /* Check with NotAfter equal to comparison time */
172 ret = CertVerifyTimeValidity(&fileTime, &info);
173 ok(ret == 0, "Expected 0, got %ld\n", ret);
174 /* Check with NotBefore after comparison time */
175 memcpy(&info.NotBefore, &fileTime, sizeof(info.NotBefore));
176 info.NotBefore.dwLowDateTime += 5000;
177 ret = CertVerifyTimeValidity(&fileTime, &info);
178 ok(ret == -1, "Expected -1, got %ld\n", ret);
181 static void test_cryptAllocate(void)
185 buf = CryptMemAlloc(0);
186 ok(buf != NULL, "CryptMemAlloc failed: %08lx\n", GetLastError());
188 buf = CryptMemRealloc(NULL, 0);
189 ok(!buf, "Expected NULL\n");
190 buf = CryptMemAlloc(0);
191 buf = CryptMemRealloc(buf, 1);
192 ok(buf != NULL, "CryptMemRealloc failed: %08lx\n", GetLastError());
196 typedef DWORD (WINAPI *I_CryptAllocTlsFunc)(void);
197 typedef LPVOID (WINAPI *I_CryptDetachTlsFunc)(DWORD dwTlsIndex);
198 typedef LPVOID (WINAPI *I_CryptGetTlsFunc)(DWORD dwTlsIndex);
199 typedef BOOL (WINAPI *I_CryptSetTlsFunc)(DWORD dwTlsIndex, LPVOID lpTlsValue);
200 typedef BOOL (WINAPI *I_CryptFreeTlsFunc)(DWORD dwTlsIndex, DWORD unknown);
202 static I_CryptAllocTlsFunc pI_CryptAllocTls;
203 static I_CryptDetachTlsFunc pI_CryptDetachTls;
204 static I_CryptGetTlsFunc pI_CryptGetTls;
205 static I_CryptSetTlsFunc pI_CryptSetTls;
206 static I_CryptFreeTlsFunc pI_CryptFreeTls;
208 static void test_cryptTls(void)
210 HMODULE lib = LoadLibraryA("crypt32.dll");
217 pI_CryptAllocTls = (I_CryptAllocTlsFunc)GetProcAddress(lib,
219 pI_CryptDetachTls = (I_CryptDetachTlsFunc)GetProcAddress(lib,
221 pI_CryptGetTls = (I_CryptGetTlsFunc)GetProcAddress(lib,
223 pI_CryptSetTls = (I_CryptSetTlsFunc)GetProcAddress(lib,
225 pI_CryptFreeTls = (I_CryptFreeTlsFunc)GetProcAddress(lib,
228 /* One normal pass */
229 index = pI_CryptAllocTls();
230 ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
235 ptr = pI_CryptGetTls(index);
236 ok(!ptr, "Expected NULL\n");
237 ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
238 ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
239 ptr = pI_CryptGetTls(index);
240 ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
242 ret = pI_CryptFreeTls(index, 1);
244 ret = pI_CryptFreeTls(index, 0);
245 ok(ret, "I_CryptFreeTls failed: %08lx\n", GetLastError());
246 ret = pI_CryptFreeTls(index, 0);
247 /* Not sure if this fails because TlsFree should fail, so leave as
250 todo_wine ok(!ret && GetLastError() == E_INVALIDARG,
251 "Expected E_INVALIDARG, got %08lx\n", GetLastError());
253 /* Similar pass, check I_CryptDetachTls */
254 index = pI_CryptAllocTls();
255 ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
260 ptr = pI_CryptGetTls(index);
261 ok(!ptr, "Expected NULL\n");
262 ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
263 ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
264 ptr = pI_CryptGetTls(index);
265 ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
266 ptr = pI_CryptDetachTls(index);
267 ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
268 ptr = pI_CryptGetTls(index);
269 ok(!ptr, "Expected NULL\n");
277 test_findAttribute();
278 test_findExtension();
280 test_verifyTimeValidity();
281 test_cryptAllocate();