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