/ tools / brssl.c
brssl.c
  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  
 42  static void
 43  usage(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  
 57  int
 58  main(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  }