GitHub CI: update list of container images
[tinc] / src / sptps_keypair.c
1 /*
2     sptps_test.c -- Simple Peer-to-Peer Security test program
3     Copyright (C) 2011-2022 Guus Sliepen <guus@tinc-vpn.org>,
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "system.h"
21
22 #include "crypto.h"
23 #include "random.h"
24 #include "ecdsagen.h"
25 #include "logger.h"
26 #include "names.h"
27
28 void logger(debug_t level, int priority, const char *format, ...) {
29         (void)level;
30         (void)priority;
31         va_list ap;
32
33         va_start(ap, format);
34         vfprintf(stderr, format, ap);
35         va_end(ap);
36
37         fputc('\n', stderr);
38 }
39
40 static void usage(void) {
41         fprintf(stderr, "Usage: %s [options] private_key_file public_key_file\n\n", program_name);
42         fprintf(stderr, "Valid options are:\n"
43                 "  --help  Display this help and exit.\n"
44                 "\n");
45         fprintf(stderr, "Report bugs to tinc@tinc-vpn.org.\n");
46 }
47
48 typedef enum option_t {
49         OPT_BAD_OPTION  = '?',
50         OPT_LONG_OPTION =  0,
51
52         OPT_HELP        = 255,
53 } option_t;
54
55 static struct option const long_options[] = {
56         {"help", no_argument, NULL, OPT_HELP},
57         {NULL,   0,           NULL, 0}
58 };
59
60 static int generate_keypair(char *argv[]) {
61         ecdsa_t *key = ecdsa_generate();
62
63         if(!key) {
64                 return 1;
65         }
66
67         FILE *fp = fopen(argv[1], "w");
68
69         if(fp) {
70                 if(!ecdsa_write_pem_private_key(key, fp)) {
71                         fprintf(stderr, "Could not write ECDSA private key\n");
72                         ecdsa_free(key);
73                         return 1;
74                 }
75
76                 fclose(fp);
77         } else {
78                 fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[1], strerror(errno));
79                 ecdsa_free(key);
80                 return 1;
81         }
82
83         fp = fopen(argv[2], "w");
84
85         if(fp) {
86                 if(!ecdsa_write_pem_public_key(key, fp)) {
87                         fprintf(stderr, "Could not write ECDSA public key\n");
88                 }
89
90                 ecdsa_free(key);
91                 fclose(fp);
92                 return 0;
93         } else {
94                 fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[2], strerror(errno));
95                 ecdsa_free(key);
96                 return 1;
97         }
98 }
99
100 int main(int argc, char *argv[]) {
101         program_name = argv[0];
102         int r;
103         int option_index = 0;
104
105         while((r = getopt_long(argc, argv, "", long_options, &option_index)) != EOF) {
106                 switch((option_t) r) {
107                 case OPT_LONG_OPTION:
108                         break;
109
110                 case OPT_BAD_OPTION:
111                         usage();
112                         return 1;
113
114                 case OPT_HELP:
115                         usage();
116                         return 0;
117
118                 default:
119                         break;
120                 }
121         }
122
123         argc -= optind - 1;
124         argv += optind - 1;
125
126         if(argc != 3) {
127                 fprintf(stderr, "Wrong number of arguments.\n");
128                 usage();
129                 return 1;
130         }
131
132         random_init();
133         crypto_init();
134
135         int result = generate_keypair(argv);
136
137         random_exit();
138
139         return result;
140 }