Opennet Firmware
 Alle Dateien Funktionen Variablen Gruppen Seiten
px5g_create_csr.patch
gehe zur Dokumentation dieser Datei
1 Provide additional "csr" action for px5g.
2 
3 Signed-off-by: Lars Kruse <devel@sumpfralle.de>
4 
5 --- a/openwrt/package/utils/px5g-standalone/src/px5g.c
6 +++ b/openwrt/package/utils/px5g-standalone/src/px5g.c
7 @@ -75,23 +75,23 @@ int rsakey(char **arg) {
8  return 0;
9  }
10 
11 -int selfsigned(char **arg) {
12 +// prepare an x509 object for "selfsigned" or "csr"
13 +int prepare_x509(char **arg, rsa_context *rsa_ptr, x509_raw *cert_ptr, int *flag_ptr, char **certpath) {
14  havege_state hs;
15 - rsa_context rsa;
16  x509_node node;
17 
18  char *subject = "";
19  unsigned int ksize = 512;
20  int exp = 65537;
21  unsigned int days = 30;
22 - char *keypath = NULL, *certpath = NULL;
23 - int flag = X509_OUTPUT_PEM;
24 + char *keypath = NULL;
25  time_t from = time(NULL), to;
26  char fstr[20], tstr[20];
27 + *flag_ptr = X509_OUTPUT_PEM;
28 
29  while (*arg && **arg == '-') {
30  if (!strcmp(*arg, "-der")) {
31 - flag = X509_OUTPUT_DER;
32 + *flag_ptr = X509_OUTPUT_DER;
33  } else if (!strcmp(*arg, "-newkey") && arg[1]) {
34  if (strncmp(arg[1], "rsa:", 4)) {
35  fprintf(stderr, "error: invalid algorithm");
36 @@ -106,7 +106,7 @@ int selfsigned(char **arg) {
37  keypath = arg[1];
38  arg++;
39  } else if (!strcmp(*arg, "-out") && arg[1]) {
40 - certpath = arg[1];
41 + *certpath = arg[1];
42  arg++;
43  } else if (!strcmp(*arg, "-subj") && arg[1]) {
44  if (arg[1][0] != '/' || strchr(arg[1], ';')) {
45 @@ -140,16 +140,16 @@ int selfsigned(char **arg) {
46  }
47 
48  havege_init(&hs);
49 - rsa_init(&rsa, RSA_PKCS_V15, 0, havege_rand, &hs);
50 + rsa_init(rsa_ptr, RSA_PKCS_V15, 0, havege_rand, &hs);
51  x509write_init_node(&node);
52  fprintf(stderr, "Generating RSA private key, %i bit long modulus\n", ksize);
53 - if (rsa_gen_key(&rsa, ksize, exp)) {
54 + if (rsa_gen_key(rsa_ptr, ksize, exp)) {
55  fprintf(stderr, "error: key generation failed\n");
56  return 1;
57  }
58 
59  if (keypath) {
60 - if (x509write_keyfile(&rsa, keypath, flag)) {
61 + if (x509write_keyfile(rsa_ptr, keypath, *flag_ptr)) {
62  fprintf(stderr, "error: I/O error\n");
63  return 1;
64  }
65 @@ -162,15 +162,29 @@ int selfsigned(char **arg) {
66  to = INT_MAX;
67  strftime(tstr, sizeof(tstr), "%F %H:%M:%S", gmtime(&to));
68 
69 - x509_raw cert;
70 - x509write_init_raw(&cert);
71 - x509write_add_pubkey(&cert, &rsa);
72 - x509write_add_subject(&cert, (unsigned char*)subject);
73 - x509write_add_validity(&cert, (unsigned char*)fstr, (unsigned char*)tstr);
74 - fprintf(stderr, "Generating selfsigned certificate with subject '%s'"
75 + x509write_init_raw(cert_ptr);
76 + x509write_add_pubkey(cert_ptr, rsa_ptr);
77 + x509write_add_subject(cert_ptr, (unsigned char*)subject);
78 + x509write_add_validity(cert_ptr, (unsigned char*)fstr, (unsigned char*)tstr);
79 + fprintf(stderr, "Generating x509 object with subject '%s'"
80  " and validity %s-%s\n", subject, fstr, tstr);
81 + return 0;
82 +}
83 +
84 +int selfsigned(char **arg) {
85 + x509_raw cert;
86 + rsa_context rsa;
87 + int flag;
88 + char *certpath = NULL;
89 +
90 + if (prepare_x509(arg, &rsa, &cert, &flag, &certpath)) {
91 + fprintf(stderr, "error: preparing x509 object failed\n");
92 + return 1;
93 + }
94 +
95  if (x509write_create_selfsign(&cert, &rsa)) {
96  fprintf(stderr, "error: certificate generation failed\n");
97 + return 1;
98  }
99 
100  if (x509write_crtfile(&cert, (unsigned char*)certpath, flag)) {
101 @@ -183,6 +197,32 @@ int selfsigned(char **arg) {
102  return 0;
103  }
104 
105 +int csr(char **arg) {
106 + x509_raw csr;
107 + rsa_context rsa;
108 + int flag;
109 + char *csrpath = NULL;
110 +
111 + if (prepare_x509(arg, &rsa, &csr, &flag, &csrpath)) {
112 + fprintf(stderr, "error: preparing x509 object failed\n");
113 + return 1;
114 + }
115 +
116 + if (x509write_create_csr(&csr, &rsa)) {
117 + fprintf(stderr, "error: CSR generation failed\n");
118 + return 1;
119 + }
120 +
121 + if (x509write_csrfile(&csr, (unsigned char*)csrpath, flag)) {
122 + fprintf(stderr, "error: I/O error\n");
123 + return 1;
124 + }
125 +
126 + x509write_free_raw(&csr);
127 + rsa_free(&rsa);
128 + return 0;
129 +}
130 +
131  int main(int argc, char *argv[]) {
132  if (!argv[1]) {
133  //Usage
134 @@ -190,11 +230,13 @@ int main(int argc, char *argv[]) {
135  return rsakey(argv+2);
136  } else if (!strcmp(argv[1], "selfsigned")) {
137  return selfsigned(argv+2);
138 + } else if (!strcmp(argv[1], "csr")) {
139 + return csr(argv+2);
140  }
141 
142  fprintf(stderr,
143  "PX5G X.509 Certificate Generator Utility v" PX5G_VERSION "\n" PX5G_COPY
144  "\nbased on PolarSSL by Christophe Devine and Paul Bakker\n\n");
145 - fprintf(stderr, "Usage: %s [rsakey|selfsigned]\n", *argv);
146 + fprintf(stderr, "Usage: %s [rsakey|selfsigned|csr]\n", *argv);
147  return 1;
148  }