1*5af82120Sclaudio /*	$Id: test-cert.c,v 1.24 2024/04/22 05:54:01 claudio Exp $ */
2ee4ffdb6Sclaudio /*
3ee4ffdb6Sclaudio  * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
4ee4ffdb6Sclaudio  *
5ee4ffdb6Sclaudio  * Permission to use, copy, modify, and distribute this software for any
6ee4ffdb6Sclaudio  * purpose with or without fee is hereby granted, provided that the above
7ee4ffdb6Sclaudio  * copyright notice and this permission notice appear in all copies.
8ee4ffdb6Sclaudio  *
9ee4ffdb6Sclaudio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10ee4ffdb6Sclaudio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11ee4ffdb6Sclaudio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12ee4ffdb6Sclaudio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13ee4ffdb6Sclaudio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14ee4ffdb6Sclaudio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15ee4ffdb6Sclaudio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16ee4ffdb6Sclaudio  */
17ee4ffdb6Sclaudio 
18ee4ffdb6Sclaudio #include <sys/socket.h>
19ee4ffdb6Sclaudio #include <arpa/inet.h>
20ee4ffdb6Sclaudio 
21ee4ffdb6Sclaudio #include <assert.h>
22ee4ffdb6Sclaudio #include <err.h>
23ee4ffdb6Sclaudio #include <inttypes.h>
24ee4ffdb6Sclaudio #include <stdio.h>
25ee4ffdb6Sclaudio #include <stdlib.h>
26ee4ffdb6Sclaudio #include <string.h>
27ee4ffdb6Sclaudio #include <unistd.h>
28ee4ffdb6Sclaudio 
29ee4ffdb6Sclaudio #include <openssl/err.h>
308e90a319Sjsing #include <openssl/evp.h>
318e90a319Sjsing #include <openssl/x509v3.h>
32ee4ffdb6Sclaudio 
33ee4ffdb6Sclaudio #include "extern.h"
34ee4ffdb6Sclaudio 
3558099f30Stb int outformats;
36b3ce63a9Sbluhm int verbose;
3784f3eaedSjob int filemode;
38*5af82120Sclaudio int experimental;
39b3ce63a9Sbluhm 
40ee4ffdb6Sclaudio int
main(int argc,char * argv[])41ee4ffdb6Sclaudio main(int argc, char *argv[])
42ee4ffdb6Sclaudio {
43ee4ffdb6Sclaudio 	int		 c, i, verb = 0, ta = 0;
44ee4ffdb6Sclaudio 	struct cert	*p;
45ee4ffdb6Sclaudio 
468e90a319Sjsing 	ERR_load_crypto_strings();
478e90a319Sjsing 	OpenSSL_add_all_ciphers();
488e90a319Sjsing 	OpenSSL_add_all_digests();
49a4e47d98Sclaudio 	x509_init_oid();
50ee4ffdb6Sclaudio 
51ee4ffdb6Sclaudio 	while ((c = getopt(argc, argv, "tv")) != -1)
52ee4ffdb6Sclaudio 		switch (c) {
53ee4ffdb6Sclaudio 		case 't':
54ee4ffdb6Sclaudio 			ta = 1;
55ee4ffdb6Sclaudio 			break;
56ee4ffdb6Sclaudio 		case 'v':
57ee4ffdb6Sclaudio 			verb++;
58ee4ffdb6Sclaudio 			break;
59ee4ffdb6Sclaudio 		default:
60ee4ffdb6Sclaudio 			errx(1, "bad argument %c", c);
61ee4ffdb6Sclaudio 		}
62ee4ffdb6Sclaudio 
63ee4ffdb6Sclaudio 	argv += optind;
64ee4ffdb6Sclaudio 	argc -= optind;
65ee4ffdb6Sclaudio 
66ee4ffdb6Sclaudio 	if (argc == 0)
67ee4ffdb6Sclaudio 		errx(1, "argument missing");
68ee4ffdb6Sclaudio 
69d568913cStb 	if (ta) {
70d568913cStb 		if (argc % 2)
71d568913cStb 			errx(1, "need even number of arguments");
72d568913cStb 
73d568913cStb 		for (i = 0; i < argc; i += 2) {
74d568913cStb 			const char	*cert_path = argv[i];
75d568913cStb 			const char	*tal_path = argv[i + 1];
76d568913cStb 			char		*buf;
77db11ffcfSclaudio 			size_t		 len;
78d568913cStb 			struct tal	*tal;
79d568913cStb 
80db11ffcfSclaudio 			buf = load_file(tal_path, &len);
81db11ffcfSclaudio 			tal = tal_parse(tal_path, buf, len);
82d568913cStb 			free(buf);
83d568913cStb 			if (tal == NULL)
84d568913cStb 				break;
85d568913cStb 
86db11ffcfSclaudio 			buf = load_file(cert_path, &len);
87e9515988Sclaudio 			p = cert_parse_pre(cert_path, buf, len);
88db11ffcfSclaudio 			free(buf);
89e9515988Sclaudio 			if (p == NULL)
90e9515988Sclaudio 				break;
91e9515988Sclaudio 			p = ta_parse(cert_path, p, tal->pkey, tal->pkeysz);
92d568913cStb 			tal_free(tal);
93d568913cStb 			if (p == NULL)
94d568913cStb 				break;
95d568913cStb 
96d568913cStb 			if (verb)
97d568913cStb 				cert_print(p);
98d568913cStb 			cert_free(p);
99d568913cStb 		}
100d568913cStb 	} else {
101ee4ffdb6Sclaudio 		for (i = 0; i < argc; i++) {
102db11ffcfSclaudio 			char		*buf;
103db11ffcfSclaudio 			size_t		 len;
104db11ffcfSclaudio 
105db11ffcfSclaudio 			buf = load_file(argv[i], &len);
106e9515988Sclaudio 			p = cert_parse_pre(argv[i], buf, len);
107e9515988Sclaudio 			free(buf);
108e9515988Sclaudio 			if (p == NULL)
109e9515988Sclaudio 				break;
110e9515988Sclaudio 			p = cert_parse(argv[i], p);
111ee4ffdb6Sclaudio 			if (p == NULL)
112ee4ffdb6Sclaudio 				break;
113ee4ffdb6Sclaudio 			if (verb)
114ee4ffdb6Sclaudio 				cert_print(p);
115ee4ffdb6Sclaudio 			cert_free(p);
116ee4ffdb6Sclaudio 		}
117d568913cStb 	}
118ee4ffdb6Sclaudio 
119ee4ffdb6Sclaudio 	EVP_cleanup();
120ee4ffdb6Sclaudio 	CRYPTO_cleanup_all_ex_data();
121ee4ffdb6Sclaudio 	ERR_free_strings();
122ee4ffdb6Sclaudio 
123ee4ffdb6Sclaudio 	if (i < argc)
124ee4ffdb6Sclaudio 		errx(1, "test failed for %s", argv[i]);
125ee4ffdb6Sclaudio 
126ee4ffdb6Sclaudio 	printf("OK\n");
127ee4ffdb6Sclaudio 	return 0;
128ee4ffdb6Sclaudio }
1290876134dSclaudio 
1300876134dSclaudio time_t
get_current_time(void)1310876134dSclaudio get_current_time(void)
1320876134dSclaudio {
1330876134dSclaudio 	return time(NULL);
1340876134dSclaudio }
135