Reformat all code using astyle.
[tinc] / src / openssl / rsa.c
1 /*
2     rsa.c -- RSA key handling
3     Copyright (C) 2007-2013 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 <openssl/pem.h>
23 #include <openssl/err.h>
24
25 #define TINC_RSA_INTERNAL
26 typedef RSA rsa_t;
27
28 #include "../logger.h"
29 #include "../rsa.h"
30
31 // Set RSA keys
32
33 #ifndef HAVE_RSA_SET0_KEY
34 int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) {
35         BN_free(r->n);
36         r->n = n;
37         BN_free(r->e);
38         r->e = e;
39         BN_free(r->d);
40         r->d = d;
41         return 1;
42 }
43 #endif
44
45 rsa_t *rsa_set_hex_public_key(char *n, char *e) {
46         BIGNUM *bn_n = NULL;
47         BIGNUM *bn_e = NULL;
48
49         if(BN_hex2bn(&bn_n, n) != strlen(n) || BN_hex2bn(&bn_e, e) != strlen(e)) {
50                 BN_free(bn_e);
51                 BN_free(bn_n);
52                 return false;
53         }
54
55         rsa_t *rsa = RSA_new();
56
57         if(!rsa) {
58                 return NULL;
59         }
60
61         RSA_set0_key(rsa, bn_n, bn_e, NULL);
62
63         return rsa;
64 }
65
66 rsa_t *rsa_set_hex_private_key(char *n, char *e, char *d) {
67         BIGNUM *bn_n = NULL;
68         BIGNUM *bn_e = NULL;
69         BIGNUM *bn_d = NULL;
70
71         if(BN_hex2bn(&bn_n, n) != strlen(n) || BN_hex2bn(&bn_e, e) != strlen(e) || BN_hex2bn(&bn_d, d) != strlen(d)) {
72                 BN_free(bn_d);
73                 BN_free(bn_e);
74                 BN_free(bn_n);
75                 return false;
76         }
77
78         rsa_t *rsa = RSA_new();
79
80         if(!rsa) {
81                 return NULL;
82         }
83
84         RSA_set0_key(rsa, bn_n, bn_e, bn_d);
85
86         return rsa;
87 }
88
89 // Read PEM RSA keys
90
91 rsa_t *rsa_read_pem_public_key(FILE *fp) {
92         rsa_t *rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL);
93
94         if(!rsa) {
95                 rewind(fp);
96                 rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
97         }
98
99         if(!rsa) {
100                 logger(DEBUG_ALWAYS, LOG_ERR, "Unable to read RSA public key: %s", ERR_error_string(ERR_get_error(), NULL));
101         }
102
103         return rsa;
104 }
105
106 rsa_t *rsa_read_pem_private_key(FILE *fp) {
107         rsa_t *rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
108
109         if(!rsa) {
110                 logger(DEBUG_ALWAYS, LOG_ERR, "Unable to read RSA private key: %s", ERR_error_string(ERR_get_error(), NULL));
111         }
112
113         return rsa;
114 }
115
116 size_t rsa_size(rsa_t *rsa) {
117         return RSA_size(rsa);
118 }
119
120 bool rsa_public_encrypt(rsa_t *rsa, void *in, size_t len, void *out) {
121         if(RSA_public_encrypt(len, in, out, rsa, RSA_NO_PADDING) == len) {
122                 return true;
123         }
124
125         logger(DEBUG_ALWAYS, LOG_ERR, "Unable to perform RSA encryption: %s", ERR_error_string(ERR_get_error(), NULL));
126         return false;
127 }
128
129 bool rsa_private_decrypt(rsa_t *rsa, void *in, size_t len, void *out) {
130         if(RSA_private_decrypt(len, in, out, rsa, RSA_NO_PADDING) == len) {
131                 return true;
132         }
133
134         logger(DEBUG_ALWAYS, LOG_ERR, "Unable to perform RSA decryption: %s", ERR_error_string(ERR_get_error(), NULL));
135         return false;
136 }
137
138 bool rsa_active(rsa_t *rsa) {
139         return rsa;
140 }
141
142 void rsa_free(rsa_t *rsa) {
143         if(rsa) {
144                 RSA_free(rsa);
145         }
146 }