]> git.meshlink.io Git - meshlink/blobdiff - src/ed25519/ecdsa.c
Avoid allocating packet buffers unnecessarily.
[meshlink] / src / ed25519 / ecdsa.c
index 4515131a0cd1c9c56648d5fd7e6dd622618a827f..7cab5f2a46f7476f15e439da805832ae9b9fc93b 100644 (file)
@@ -1,6 +1,6 @@
 /*
     ecdsa.c -- ECDSA key handling
-    Copyright (C) 2011-2013 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2014-2017 Guus Sliepen <guus@meshlink.io>
 
     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
@@ -21,7 +21,7 @@
 
 #include "ed25519.h"
 
-#define __TINC_ECDSA_INTERNAL__
+#define __MESHLINK_ECDSA_INTERNAL__
 typedef struct {
        uint8_t private[64];
        uint8_t public[32];
@@ -38,14 +38,15 @@ ecdsa_t *ecdsa_set_base64_public_key(const char *p) {
        int len = strlen(p);
 
        if(len != 43) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Invalid size %d for public key!", len);
+               logger(NULL, MESHLINK_ERROR, "Invalid size %d for public key!", len);
                return 0;
        }
 
-       ecdsa_t *ecdsa = xzalloc(sizeof *ecdsa);
+       ecdsa_t *ecdsa = xzalloc(sizeof * ecdsa);
        len = b64decode(p, ecdsa->public, len);
+
        if(len != 32) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Invalid format of public key! len = %d", len);
+               logger(NULL, MESHLINK_ERROR, "Invalid format of public key! len = %d", len);
                free(ecdsa);
                return 0;
        }
@@ -53,6 +54,12 @@ ecdsa_t *ecdsa_set_base64_public_key(const char *p) {
        return ecdsa;
 }
 
+ecdsa_t *ecdsa_set_public_key(const void *p) {
+       ecdsa_t *ecdsa = xzalloc(sizeof(*ecdsa));
+       memcpy(ecdsa->public, p, sizeof ecdsa->public);
+       return ecdsa;
+}
+
 char *ecdsa_get_base64_public_key(ecdsa_t *ecdsa) {
        char *base64 = xmalloc(44);
        b64encode(ecdsa->public, base64, sizeof ecdsa->public);
@@ -60,25 +67,46 @@ char *ecdsa_get_base64_public_key(ecdsa_t *ecdsa) {
        return base64;
 }
 
+const void *ecdsa_get_public_key(ecdsa_t *ecdsa) {
+       return ecdsa->public;
+}
+
+ecdsa_t *ecdsa_set_private_key(const void *p) {
+       ecdsa_t *ecdsa = xzalloc(sizeof(*ecdsa));
+       memcpy(ecdsa->private, p, sizeof(*ecdsa));
+       return ecdsa;
+}
+
+const void *ecdsa_get_private_key(ecdsa_t *ecdsa) {
+       return ecdsa->private;
+}
+
 // Read PEM ECDSA keys
 
 ecdsa_t *ecdsa_read_pem_public_key(FILE *fp) {
-       ecdsa_t *ecdsa = xzalloc(sizeof *ecdsa);
-       if(fread(ecdsa->public, sizeof ecdsa->public, 1, fp) == 1)
+       ecdsa_t *ecdsa = xzalloc(sizeof(*ecdsa));
+
+       if(fread(ecdsa->public, sizeof ecdsa->public, 1, fp) == 1) {
                return ecdsa;
+       }
+
        free(ecdsa);
        return 0;
 }
 
 ecdsa_t *ecdsa_read_pem_private_key(FILE *fp) {
-       ecdsa_t *ecdsa = xmalloc(sizeof *ecdsa);
-       if(fread(ecdsa, sizeof *ecdsa, 1, fp) == 1)
+       ecdsa_t *ecdsa = xmalloc(sizeof * ecdsa);
+
+       if(fread(ecdsa, sizeof * ecdsa, 1, fp) == 1) {
                return ecdsa;
+       }
+
        free(ecdsa);
        return 0;
 }
 
 size_t ecdsa_size(ecdsa_t *ecdsa) {
+       (void)ecdsa;
        return 64;
 }