X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fsptps_keypair.c;h=97d51895a4377c1506743e4c55cde8de5c4564b5;hb=e62fd508158749a0d55eae06c2e361df5d6da6e0;hp=f66a77111b3fdc10ade81619c5ced6007e619cfd;hpb=27acb5d04792f2da70e937543de9110e16aae21c;p=tinc diff --git a/src/sptps_keypair.c b/src/sptps_keypair.c index f66a7711..97d51895 100644 --- a/src/sptps_keypair.c +++ b/src/sptps_keypair.c @@ -1,6 +1,6 @@ /* sptps_test.c -- Simple Peer-to-Peer Security test program - Copyright (C) 2011-2013 Guus Sliepen , + Copyright (C) 2011-2022 Guus Sliepen , This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,47 +19,104 @@ #include "system.h" -#include - #include "crypto.h" +#include "random.h" #include "ecdsagen.h" -#include "utils.h" +#include "logger.h" +#include "names.h" + +void logger(debug_t level, int priority, const char *format, ...) { + (void)level; + (void)priority; + va_list ap; -static char *program_name; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + + fputc('\n', stderr); +} -static void usage() { +static void usage(void) { fprintf(stderr, "Usage: %s [options] private_key_file public_key_file\n\n", program_name); fprintf(stderr, "Valid options are:\n" - " --help Display this help and exit.\n" - "\n"); + " --help Display this help and exit.\n" + "\n"); fprintf(stderr, "Report bugs to tinc@tinc-vpn.org.\n"); } +typedef enum option_t { + OPT_BAD_OPTION = '?', + OPT_LONG_OPTION = 0, + + OPT_HELP = 255, +} option_t; + static struct option const long_options[] = { - {"help", no_argument, NULL, 1}, - {NULL, 0, NULL, 0} + {"help", no_argument, NULL, OPT_HELP}, + {NULL, 0, NULL, 0} }; +static int generate_keypair(char *argv[]) { + ecdsa_t *key = ecdsa_generate(); + + if(!key) { + return 1; + } + + FILE *fp = fopen(argv[1], "w"); + + if(fp) { + if(!ecdsa_write_pem_private_key(key, fp)) { + fprintf(stderr, "Could not write ECDSA private key\n"); + ecdsa_free(key); + return 1; + } + + fclose(fp); + } else { + fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[1], strerror(errno)); + ecdsa_free(key); + return 1; + } + + fp = fopen(argv[2], "w"); + + if(fp) { + if(!ecdsa_write_pem_public_key(key, fp)) { + fprintf(stderr, "Could not write ECDSA public key\n"); + } + + ecdsa_free(key); + fclose(fp); + return 0; + } else { + fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[2], strerror(errno)); + ecdsa_free(key); + return 1; + } +} + int main(int argc, char *argv[]) { program_name = argv[0]; int r; int option_index = 0; while((r = getopt_long(argc, argv, "", long_options, &option_index)) != EOF) { - switch (r) { - case 0: /* long option */ - break; + switch((option_t) r) { + case OPT_LONG_OPTION: + break; - case '?': /* wrong options */ - usage(); - return 1; + case OPT_BAD_OPTION: + usage(); + return 1; - case 1: /* help */ - usage(); - return 0; + case OPT_HELP: + usage(); + return 0; - default: - break; + default: + break; } } @@ -72,29 +129,12 @@ int main(int argc, char *argv[]) { return 1; } + random_init(); crypto_init(); - ecdsa_t *key = ecdsa_generate(); - if(!key) - return 1; - - FILE *fp = fopen(argv[1], "w"); - if(fp) { - ecdsa_write_pem_private_key(key, fp); - fclose(fp); - } else { - fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[1], strerror(errno)); - return 1; - } + int result = generate_keypair(argv); - fp = fopen(argv[2], "w"); - if(fp) { - ecdsa_write_pem_public_key(key, fp); - fclose(fp); - } else { - fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[2], strerror(errno)); - return 1; - } + random_exit(); - return 0; + return result; }