diff options
author | job <> | 2023-04-26 22:05:36 +0000 |
---|---|---|
committer | job <> | 2023-04-26 22:05:36 +0000 |
commit | 9e5354a856698168e0ccefb926b2133d07e98a88 (patch) | |
tree | f80d08c413f760aed4a0b479417c8467ff5b9f44 /src | |
parent | 579a9ae17665973834db0e2ae5583470829ff525 (diff) | |
download | openbsd-9e5354a856698168e0ccefb926b2133d07e98a88.tar.gz openbsd-9e5354a856698168e0ccefb926b2133d07e98a88.tar.bz2 openbsd-9e5354a856698168e0ccefb926b2133d07e98a88.zip |
Add test for invalidation of DER cache for X509_CRL_* setter functions
The program won't exit with a non-zero exit code if X509_CRL_set_*
tests fail, as the relevant bits haven't been committed to libcrypto yet.
Diffstat (limited to 'src')
-rw-r--r-- | src/regress/lib/libcrypto/x509/x509_asn1.c | 186 |
1 files changed, 171 insertions, 15 deletions
diff --git a/src/regress/lib/libcrypto/x509/x509_asn1.c b/src/regress/lib/libcrypto/x509/x509_asn1.c index b6b251f104..ed50bc6177 100644 --- a/src/regress/lib/libcrypto/x509/x509_asn1.c +++ b/src/regress/lib/libcrypto/x509/x509_asn1.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_asn1.c,v 1.8 2023/04/26 21:30:12 job Exp $ */ | 1 | /* $OpenBSD: x509_asn1.c,v 1.9 2023/04/26 22:05:36 job Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2023 Job Snijders <job@openbsd.org> | 3 | * Copyright (c) 2023 Job Snijders <job@openbsd.org> |
4 | * | 4 | * |
@@ -40,6 +40,10 @@ static const struct fnnames { | |||
40 | { "X509_set_notBefore", X509_set_notBefore }, | 40 | { "X509_set_notBefore", X509_set_notBefore }, |
41 | { "X509_set_notAfter", X509_set_notAfter }, | 41 | { "X509_set_notAfter", X509_set_notAfter }, |
42 | { "X509_set_pubkey", X509_set_pubkey }, | 42 | { "X509_set_pubkey", X509_set_pubkey }, |
43 | { "X509_CRL_set_version", X509_CRL_set_version }, | ||
44 | { "X509_CRL_set_issuer_name", X509_CRL_set_issuer_name }, | ||
45 | { "X509_CRL_set_lastUpdate", X509_CRL_set_lastUpdate }, | ||
46 | { "X509_CRL_set_nextUpdate", X509_CRL_set_nextUpdate }, | ||
43 | { NULL, NULL } | 47 | { NULL, NULL } |
44 | }; | 48 | }; |
45 | 49 | ||
@@ -145,15 +149,91 @@ x509_compare(char *f, X509 *a, const unsigned char *der, long dersz) | |||
145 | return rc; | 149 | return rc; |
146 | } | 150 | } |
147 | 151 | ||
148 | int | 152 | static void |
149 | main(void) | 153 | x509_crl_setup(unsigned char **der, unsigned char **der2, X509_CRL **xc, |
154 | long dersz, long *der2sz) | ||
155 | { | ||
156 | const unsigned char *cpder; | ||
157 | |||
158 | cpder = *der; | ||
159 | if ((*xc = d2i_X509_CRL(NULL, &cpder, dersz)) == NULL) | ||
160 | errx(1, "d2i_X509"); | ||
161 | if ((*der2sz = i2d_X509_CRL(*xc, der2)) <= 0) | ||
162 | errx(1, "i2d_X509"); | ||
163 | } | ||
164 | |||
165 | static void | ||
166 | x509_crl_cleanup(X509_CRL **xc, unsigned char **der) | ||
167 | { | ||
168 | X509_CRL_free(*xc); | ||
169 | *xc = NULL; | ||
170 | free(*der); | ||
171 | *der = NULL; | ||
172 | } | ||
173 | |||
174 | static void | ||
175 | x509_crl_set_name(int (*f)(X509_CRL *, X509_NAME *), X509_CRL **xc, | ||
176 | const unsigned char *n) | ||
177 | { | ||
178 | X509_NAME *xn; | ||
179 | |||
180 | if ((xn = X509_NAME_new()) == NULL) | ||
181 | err(1, NULL); | ||
182 | if (!X509_NAME_add_entry_by_txt(xn, "C", MBSTRING_ASC, n, -1, -1, 0)) | ||
183 | errx(1, "X509_NAME_add_entry_by_txt"); | ||
184 | if (!f(*xc, xn)) | ||
185 | lookup_and_err(f); | ||
186 | |||
187 | X509_NAME_free(xn); | ||
188 | } | ||
189 | |||
190 | static void | ||
191 | x509_crl_set_time(int (*f)(X509_CRL *, const ASN1_TIME *), X509_CRL **xc, int t) | ||
192 | { | ||
193 | ASN1_TIME *at; | ||
194 | |||
195 | if ((at = ASN1_TIME_new()) == NULL) | ||
196 | err(1, NULL); | ||
197 | if ((at = X509_gmtime_adj(NULL, t)) == NULL) | ||
198 | errx(1, "X509_gmtime_adj"); | ||
199 | if (!f(*xc, at)) | ||
200 | lookup_and_err(f); | ||
201 | |||
202 | ASN1_TIME_free(at); | ||
203 | } | ||
204 | |||
205 | static int | ||
206 | x509_crl_compare(char *f, X509_CRL *ac, const unsigned char *der, long dersz) | ||
207 | { | ||
208 | unsigned char *der_test = NULL; | ||
209 | long der_testsz; | ||
210 | int rc = 0; | ||
211 | |||
212 | if ((der_testsz = i2d_X509_CRL(ac, &der_test)) <= 0) | ||
213 | errx(1, "i2d_X509_CRL"); | ||
214 | |||
215 | if (dersz == der_testsz) { | ||
216 | if (memcmp(der, der_test, dersz) == 0) { | ||
217 | warnx("%s() didn't invalidate DER cache", f); | ||
218 | rc = 1; | ||
219 | } else | ||
220 | warnx("%s() OK", f); | ||
221 | } else | ||
222 | warnx("%s() OK", f); | ||
223 | |||
224 | free(der_test); | ||
225 | return rc; | ||
226 | } | ||
227 | |||
228 | static int | ||
229 | test_x509_setters(void) | ||
150 | { | 230 | { |
151 | EVP_PKEY *pkey = NULL; | 231 | EVP_PKEY *pkey = NULL; |
152 | EVP_PKEY_CTX *pkey_ctx = NULL; | 232 | EVP_PKEY_CTX *pkey_ctx = NULL; |
153 | X509 *a, *x; | 233 | X509 *a, *x; |
154 | unsigned char *der = NULL, *der2 = NULL; | 234 | unsigned char *der = NULL, *der2 = NULL; |
155 | long dersz, der2sz; | 235 | long dersz, der2sz; |
156 | int ret = 0; | 236 | int failed = 0; |
157 | 237 | ||
158 | if ((x = X509_new()) == NULL) | 238 | if ((x = X509_new()) == NULL) |
159 | err(1, NULL); | 239 | err(1, NULL); |
@@ -185,37 +265,37 @@ main(void) | |||
185 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 265 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
186 | if (!X509_set_version(a, 2)) | 266 | if (!X509_set_version(a, 2)) |
187 | errx(1, "X509_set_version"); | 267 | errx(1, "X509_set_version"); |
188 | ret += x509_compare("X509_set_version", a, der2, der2sz); | 268 | failed |= x509_compare("X509_set_version", a, der2, der2sz); |
189 | x509_cleanup(&a, &der2); | 269 | x509_cleanup(&a, &der2); |
190 | 270 | ||
191 | /* test X509_set_serialNumber */ | 271 | /* test X509_set_serialNumber */ |
192 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 272 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
193 | x509_set_integer(X509_set_serialNumber, &a, 2); | 273 | x509_set_integer(X509_set_serialNumber, &a, 2); |
194 | ret += x509_compare("X509_set_serialNumber", a, der2, der2sz); | 274 | failed |= x509_compare("X509_set_serialNumber", a, der2, der2sz); |
195 | x509_cleanup(&a, &der2); | 275 | x509_cleanup(&a, &der2); |
196 | 276 | ||
197 | /* test X509_set_issuer_name */ | 277 | /* test X509_set_issuer_name */ |
198 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 278 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
199 | x509_set_name(X509_set_issuer_name, &a, "DE"); | 279 | x509_set_name(X509_set_issuer_name, &a, "DE"); |
200 | ret += x509_compare("X509_set_issuer_name", a, der2, der2sz); | 280 | failed |= x509_compare("X509_set_issuer_name", a, der2, der2sz); |
201 | x509_cleanup(&a, &der2); | 281 | x509_cleanup(&a, &der2); |
202 | 282 | ||
203 | /* test X509_set_subject_name */ | 283 | /* test X509_set_subject_name */ |
204 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 284 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
205 | x509_set_name(X509_set_subject_name, &a, "FR"); | 285 | x509_set_name(X509_set_subject_name, &a, "FR"); |
206 | ret += x509_compare("X509_set_subject_name", a, der2, der2sz); | 286 | failed |= x509_compare("X509_set_subject_name", a, der2, der2sz); |
207 | x509_cleanup(&a, &der2); | 287 | x509_cleanup(&a, &der2); |
208 | 288 | ||
209 | /* test X509_set_notBefore */ | 289 | /* test X509_set_notBefore */ |
210 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 290 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
211 | x509_set_time(X509_set_notBefore, &a, 120); | 291 | x509_set_time(X509_set_notBefore, &a, 120); |
212 | ret += x509_compare("X509_set_notBefore", a, der2, der2sz); | 292 | failed |= x509_compare("X509_set_notBefore", a, der2, der2sz); |
213 | x509_cleanup(&a, &der2); | 293 | x509_cleanup(&a, &der2); |
214 | 294 | ||
215 | /* test X509_set_notAfter */ | 295 | /* test X509_set_notAfter */ |
216 | x509_setup(&der, &der2, &a, dersz, &der2sz); | 296 | x509_setup(&der, &der2, &a, dersz, &der2sz); |
217 | x509_set_time(X509_set_notAfter, &a, 180); | 297 | x509_set_time(X509_set_notAfter, &a, 180); |
218 | ret += x509_compare("X509_set_notAfter", a, der2, der2sz); | 298 | failed |= x509_compare("X509_set_notAfter", a, der2, der2sz); |
219 | x509_cleanup(&a, &der2); | 299 | x509_cleanup(&a, &der2); |
220 | 300 | ||
221 | /* test X509_set_pubkey */ | 301 | /* test X509_set_pubkey */ |
@@ -226,13 +306,89 @@ main(void) | |||
226 | errx(1, "X509_set_pubkey"); | 306 | errx(1, "X509_set_pubkey"); |
227 | EVP_PKEY_CTX_free(pkey_ctx); | 307 | EVP_PKEY_CTX_free(pkey_ctx); |
228 | EVP_PKEY_free(pkey); | 308 | EVP_PKEY_free(pkey); |
229 | ret += x509_compare("X509_set_pubkey", a, der2, der2sz); | 309 | pkey_ctx = NULL; |
230 | x509_cleanup(&a, &der2); | 310 | pkey = NULL; |
311 | failed |= x509_compare("X509_set_pubkey", a, der2, der2sz); | ||
231 | 312 | ||
313 | x509_cleanup(&a, &der2); | ||
232 | X509_free(x); | 314 | X509_free(x); |
233 | free(der); | 315 | free(der); |
234 | 316 | ||
235 | if (ret) | 317 | return failed; |
236 | return 1; | 318 | } |
237 | return 0; | 319 | |
320 | static int | ||
321 | test_x509_crl_setters(void) | ||
322 | { | ||
323 | EVP_PKEY *pkey = NULL; | ||
324 | EVP_PKEY_CTX *pkey_ctx = NULL; | ||
325 | X509_CRL *ac, *xc; | ||
326 | unsigned char *der = NULL, *der2 = NULL; | ||
327 | long dersz, der2sz; | ||
328 | int failed = 0; | ||
329 | |||
330 | if ((xc = X509_CRL_new()) == NULL) | ||
331 | err(1, NULL); | ||
332 | |||
333 | if ((pkey_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)) == NULL) | ||
334 | errx(1, "EVP_PKEY_CTX_new_id"); | ||
335 | if (EVP_PKEY_keygen_init(pkey_ctx) != 1) | ||
336 | errx(1, "EVP_PKEY_keygen_init"); | ||
337 | if (EVP_PKEY_CTX_set_rsa_keygen_bits(pkey_ctx, 2048) <= 0) | ||
338 | errx(1, "EVP_PKEY_CTX_set_rsa_keygen_bits"); | ||
339 | if (EVP_PKEY_keygen(pkey_ctx, &pkey) <= 0) | ||
340 | errx(1, "EVP_PKEY_keygen"); | ||
341 | |||
342 | x509_crl_set_time(X509_CRL_set_lastUpdate, &xc, 0); | ||
343 | x509_crl_set_time(X509_CRL_set_nextUpdate, &xc, 60); | ||
344 | x509_crl_set_name(X509_CRL_set_issuer_name, &xc, "NL"); | ||
345 | |||
346 | // one time creation of the original DER | ||
347 | if (!X509_CRL_sign(xc, pkey, EVP_sha256())) | ||
348 | errx(1, "X509_CRL_sign"); | ||
349 | EVP_PKEY_free(pkey); | ||
350 | EVP_PKEY_CTX_free(pkey_ctx); | ||
351 | if ((dersz = i2d_X509_CRL(xc, &der)) <= 0) | ||
352 | errx(1, "i2d_X509_CRL"); | ||
353 | |||
354 | /* test X509_CRL_set_version */ | ||
355 | x509_crl_setup(&der, &der2, &ac, dersz, &der2sz); | ||
356 | if (!X509_CRL_set_version(ac, 1)) | ||
357 | errx(1, "X509_CRL_set_version"); | ||
358 | failed |= x509_crl_compare("X509_CRL_set_version", ac, der2, der2sz); | ||
359 | x509_crl_cleanup(&ac, &der2); | ||
360 | |||
361 | /* test X509_CRL_set_issuer_name */ | ||
362 | x509_crl_setup(&der, &der2, &ac, dersz, &der2sz); | ||
363 | x509_crl_set_name(X509_CRL_set_issuer_name, &ac, "DE"); | ||
364 | failed |= x509_crl_compare("X509_CRL_set_issuer_name", ac, der2, | ||
365 | der2sz); | ||
366 | x509_crl_cleanup(&ac, &der2); | ||
367 | |||
368 | /* test X509_CRL_set_lastUpdate */ | ||
369 | x509_crl_setup(&der, &der2, &ac, dersz, &der2sz); | ||
370 | x509_crl_set_time(X509_CRL_set_lastUpdate, &ac, 120); | ||
371 | failed |= x509_crl_compare("X509_set_notBefore", ac, der2, der2sz); | ||
372 | x509_crl_cleanup(&ac, &der2); | ||
373 | |||
374 | /* test X509_CRL_set_nextUpdate */ | ||
375 | x509_crl_setup(&der, &der2, &ac, dersz, &der2sz); | ||
376 | x509_crl_set_time(X509_CRL_set_nextUpdate, &ac, 180); | ||
377 | failed |= x509_crl_compare("X509_set_notAfter", ac, der2, der2sz); | ||
378 | x509_crl_cleanup(&ac, &der2); | ||
379 | |||
380 | X509_CRL_free(xc); | ||
381 | free(der); | ||
382 | |||
383 | return failed; | ||
384 | } | ||
385 | |||
386 | int main(void) | ||
387 | { | ||
388 | int failed = 0; | ||
389 | |||
390 | failed |= test_x509_setters(); | ||
391 | /* failed |= */ test_x509_crl_setters(); | ||
392 | |||
393 | return failed; | ||
238 | } | 394 | } |