Extract filesystem-related functions into fs.c
[tinc] / src / keys.c
index 0485c76..1bd5907 100644 (file)
@@ -5,7 +5,7 @@
 #include "names.h"
 #include "xalloc.h"
 #include "ecdsa.h"
-#include "utils.h"
+#include "fs.h"
 
 bool disable_old_keys(const char *filename, const char *what) {
        char tmpfile[PATH_MAX] = "";
@@ -134,6 +134,7 @@ ecdsa_t *read_ecdsa_private_key(splay_tree_t *config_tree, char **keyfile) {
        if(fstat(fileno(fp), &s)) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Could not stat Ed25519 private key file `%s': %s'", fname, strerror(errno));
                free(fname);
+               fclose(fp);
                return false;
        }
 
@@ -161,11 +162,7 @@ ecdsa_t *read_ecdsa_private_key(splay_tree_t *config_tree, char **keyfile) {
        return key;
 }
 
-bool read_ecdsa_public_key(ecdsa_t **ecdsa, splay_tree_t **config_tree, const char *name) {
-       if(ecdsa_active(*ecdsa)) {
-               return true;
-       }
-
+ecdsa_t *read_ecdsa_public_key(splay_tree_t **config_tree, const char *name) {
        FILE *fp;
        char *fname;
        char *p;
@@ -174,16 +171,16 @@ bool read_ecdsa_public_key(ecdsa_t **ecdsa, splay_tree_t **config_tree, const ch
                *config_tree = create_configuration();
 
                if(!read_host_config(*config_tree, name, true)) {
-                       return false;
+                       return NULL;
                }
        }
 
        /* First, check for simple Ed25519PublicKey statement */
 
        if(get_config_string(lookup_config(*config_tree, "Ed25519PublicKey"), &p)) {
-               *ecdsa = ecdsa_set_base64_public_key(p);
+               ecdsa_t *ecdsa = ecdsa_set_base64_public_key(p);
                free(p);
-               return *ecdsa != NULL;
+               return ecdsa;
        }
 
        /* Else, check for Ed25519PublicKeyFile statement and read it */
@@ -198,19 +195,19 @@ bool read_ecdsa_public_key(ecdsa_t **ecdsa, splay_tree_t **config_tree, const ch
                logger(DEBUG_ALWAYS, LOG_ERR, "Error reading Ed25519 public key file `%s': %s",
                       fname, strerror(errno));
                free(fname);
-               return false;
+               return NULL;
        }
 
-       *ecdsa = ecdsa_read_pem_public_key(fp);
+       ecdsa_t *ecdsa = ecdsa_read_pem_public_key(fp);
 
-       if(!*ecdsa && errno != ENOENT) {
+       if(!ecdsa && errno != ENOENT) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Parsing Ed25519 public key file `%s' failed.", fname);
        }
 
        fclose(fp);
        free(fname);
 
-       return *ecdsa != NULL;
+       return ecdsa;
 }
 
 #ifndef DISABLE_LEGACY
@@ -227,13 +224,13 @@ rsa_t *read_rsa_private_key(splay_tree_t *config_tree, char **keyfile) {
        if(get_config_string(rsa_priv_conf, &d)) {
                if(!get_config_string(lookup_config(config_tree, "PublicKey"), &n)) {
                        logger(DEBUG_ALWAYS, LOG_ERR, "PrivateKey used but no PublicKey found!");
-                       free(d);
+                       free_string(d);
                        return NULL;
                }
 
                key = rsa_set_hex_private_key(n, "FFFF", d);
                free(n);
-               free(d);
+               free_string(d);
 
                if(key && keyfile && rsa_priv_conf->file) {
                        *keyfile = xstrdup(rsa_priv_conf->file);
@@ -268,6 +265,7 @@ rsa_t *read_rsa_private_key(splay_tree_t *config_tree, char **keyfile) {
        if(fstat(fileno(fp), &s)) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Could not stat RSA private key file `%s': %s'", fname, strerror(errno));
                free(fname);
+               fclose(fp);
                return NULL;
        }
 
@@ -295,7 +293,7 @@ rsa_t *read_rsa_private_key(splay_tree_t *config_tree, char **keyfile) {
        return key;
 }
 
-bool read_rsa_public_key(rsa_t **rsa, splay_tree_t *config_tree, const char *name) {
+rsa_t *read_rsa_public_key(splay_tree_t *config_tree, const char *name) {
        FILE *fp;
        char *fname;
        char *n;
@@ -303,9 +301,9 @@ bool read_rsa_public_key(rsa_t **rsa, splay_tree_t *config_tree, const char *nam
        /* First, check for simple PublicKey statement */
 
        if(get_config_string(lookup_config(config_tree, "PublicKey"), &n)) {
-               *rsa = rsa_set_hex_public_key(n, "FFFF");
+               rsa_t *rsa = rsa_set_hex_public_key(n, "FFFF");
                free(n);
-               return *rsa != NULL;
+               return rsa;
        }
 
        /* Else, check for PublicKeyFile statement and read it */
@@ -319,18 +317,18 @@ bool read_rsa_public_key(rsa_t **rsa, splay_tree_t *config_tree, const char *nam
        if(!fp) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Error reading RSA public key file `%s': %s", fname, strerror(errno));
                free(fname);
-               return false;
+               return NULL;
        }
 
-       *rsa = rsa_read_pem_public_key(fp);
+       rsa_t *rsa = rsa_read_pem_public_key(fp);
        fclose(fp);
 
-       if(!*rsa) {
+       if(!rsa) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Reading RSA public key file `%s' failed: %s", fname, strerror(errno));
        }
 
        free(fname);
 
-       return *rsa != NULL;
+       return rsa;
 }
 #endif