xref: /freebsd-src/contrib/bearssl/tools/brssl.c (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty #include <stdio.h>
26*0957b409SSimon J. Gerraty #include <stdlib.h>
27*0957b409SSimon J. Gerraty #include <string.h>
28*0957b409SSimon J. Gerraty #include <stdint.h>
29*0957b409SSimon J. Gerraty #include <errno.h>
30*0957b409SSimon J. Gerraty 
31*0957b409SSimon J. Gerraty /*
32*0957b409SSimon J. Gerraty  * Network stuff on Windows requires some specific code.
33*0957b409SSimon J. Gerraty  */
34*0957b409SSimon J. Gerraty #ifdef _WIN32
35*0957b409SSimon J. Gerraty #include <winsock2.h>
36*0957b409SSimon J. Gerraty #include <ws2tcpip.h>
37*0957b409SSimon J. Gerraty #pragma comment(lib, "Ws2_32.lib")
38*0957b409SSimon J. Gerraty #endif
39*0957b409SSimon J. Gerraty 
40*0957b409SSimon J. Gerraty #include "brssl.h"
41*0957b409SSimon J. Gerraty 
42*0957b409SSimon J. Gerraty static void
usage(void)43*0957b409SSimon J. Gerraty usage(void)
44*0957b409SSimon J. Gerraty {
45*0957b409SSimon J. Gerraty 	fprintf(stderr, "usage: brssl command [ options ]\n");
46*0957b409SSimon J. Gerraty 	fprintf(stderr, "available commands:\n");
47*0957b409SSimon J. Gerraty 	fprintf(stderr, "   client       run SSL client\n");
48*0957b409SSimon J. Gerraty 	fprintf(stderr, "   server       run SSL server\n");
49*0957b409SSimon J. Gerraty 	fprintf(stderr, "   verify       verify certificate chain\n");
50*0957b409SSimon J. Gerraty 	fprintf(stderr, "   skey         decode private key\n");
51*0957b409SSimon J. Gerraty 	fprintf(stderr, "   ta           decode trust anchors\n");
52*0957b409SSimon J. Gerraty 	fprintf(stderr, "   chain        make C code for certificate chains\n");
53*0957b409SSimon J. Gerraty 	fprintf(stderr, "   twrch        run the Twrch protocol\n");
54*0957b409SSimon J. Gerraty 	fprintf(stderr, "   impl         report on implementations\n");
55*0957b409SSimon J. Gerraty }
56*0957b409SSimon J. Gerraty 
57*0957b409SSimon J. Gerraty int
main(int argc,char * argv[])58*0957b409SSimon J. Gerraty main(int argc, char *argv[])
59*0957b409SSimon J. Gerraty {
60*0957b409SSimon J. Gerraty 	char *cmd;
61*0957b409SSimon J. Gerraty 
62*0957b409SSimon J. Gerraty 	if (argc < 2) {
63*0957b409SSimon J. Gerraty 		usage();
64*0957b409SSimon J. Gerraty 		return EXIT_FAILURE;
65*0957b409SSimon J. Gerraty 	}
66*0957b409SSimon J. Gerraty #ifdef _WIN32
67*0957b409SSimon J. Gerraty 	{
68*0957b409SSimon J. Gerraty 		WSADATA wd;
69*0957b409SSimon J. Gerraty 		int r;
70*0957b409SSimon J. Gerraty 
71*0957b409SSimon J. Gerraty 		r = WSAStartup(MAKEWORD(2, 2), &wd);
72*0957b409SSimon J. Gerraty 		if (r != 0) {
73*0957b409SSimon J. Gerraty 			fprintf(stderr, "WARNING: network initialisation"
74*0957b409SSimon J. Gerraty 				" failed (WSAStartup() returned %d)\n", r);
75*0957b409SSimon J. Gerraty 		}
76*0957b409SSimon J. Gerraty 	}
77*0957b409SSimon J. Gerraty #endif
78*0957b409SSimon J. Gerraty 	cmd = argv[1];
79*0957b409SSimon J. Gerraty 	if (eqstr(cmd, "client")) {
80*0957b409SSimon J. Gerraty 		if (do_client(argc - 2, argv + 2) < 0) {
81*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
82*0957b409SSimon J. Gerraty 		}
83*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "server")) {
84*0957b409SSimon J. Gerraty 		if (do_server(argc - 2, argv + 2) < 0) {
85*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
86*0957b409SSimon J. Gerraty 		}
87*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "verify")) {
88*0957b409SSimon J. Gerraty 		if (do_verify(argc - 2, argv + 2) < 0) {
89*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
90*0957b409SSimon J. Gerraty 		}
91*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "skey")) {
92*0957b409SSimon J. Gerraty 		if (do_skey(argc - 2, argv + 2) < 0) {
93*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
94*0957b409SSimon J. Gerraty 		}
95*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "ta")) {
96*0957b409SSimon J. Gerraty 		if (do_ta(argc - 2, argv + 2) < 0) {
97*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
98*0957b409SSimon J. Gerraty 		}
99*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "chain")) {
100*0957b409SSimon J. Gerraty 		if (do_chain(argc - 2, argv + 2) < 0) {
101*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
102*0957b409SSimon J. Gerraty 		}
103*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "twrch")) {
104*0957b409SSimon J. Gerraty 		int ret;
105*0957b409SSimon J. Gerraty 
106*0957b409SSimon J. Gerraty 		ret = do_twrch(argc - 2, argv + 2);
107*0957b409SSimon J. Gerraty 		if (ret < 0) {
108*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
109*0957b409SSimon J. Gerraty 		} else {
110*0957b409SSimon J. Gerraty 			return ret;
111*0957b409SSimon J. Gerraty 		}
112*0957b409SSimon J. Gerraty 	} else if (eqstr(cmd, "impl")) {
113*0957b409SSimon J. Gerraty 		if (do_impl(argc - 2, argv + 2) < 0) {
114*0957b409SSimon J. Gerraty 			return EXIT_FAILURE;
115*0957b409SSimon J. Gerraty 		}
116*0957b409SSimon J. Gerraty 	} else {
117*0957b409SSimon J. Gerraty 		fprintf(stderr, "unknown command: '%s'\n", cmd);
118*0957b409SSimon J. Gerraty 		usage();
119*0957b409SSimon J. Gerraty 		return EXIT_FAILURE;
120*0957b409SSimon J. Gerraty 	}
121*0957b409SSimon J. Gerraty 	return 0;
122*0957b409SSimon J. Gerraty }
123