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