summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjob <>2023-04-26 22:05:36 +0000
committerjob <>2023-04-26 22:05:36 +0000
commit9e5354a856698168e0ccefb926b2133d07e98a88 (patch)
treef80d08c413f760aed4a0b479417c8467ff5b9f44 /src
parent579a9ae17665973834db0e2ae5583470829ff525 (diff)
downloadopenbsd-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.c186
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
148int 152static void
149main(void) 153x509_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
165static void
166x509_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
174static void
175x509_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
190static void
191x509_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
205static int
206x509_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
228static int
229test_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
320static int
321test_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
386int 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}