Wipe (some) secrets from memory after use
[tinc] / src / ed25519 / ecdsagen.c
index 23ef6e9..1edc945 100644 (file)
@@ -27,45 +27,50 @@ typedef struct {
        uint8_t public[32];
 } ecdsa_t;
 
-#include "../crypto.h"
 #include "../ecdsagen.h"
 #include "../utils.h"
 #include "../xalloc.h"
+#include "../random.h"
 
 // Generate ECDSA key
 
 ecdsa_t *ecdsa_generate(void) {
-       ecdsa_t *ecdsa = xzalloc(sizeof *ecdsa);
+       ecdsa_t *ecdsa = xzalloc(sizeof(*ecdsa));
 
        uint8_t seed[32];
-       randomize(seed, sizeof seed);
+       randomize(seed, sizeof(seed));
        ed25519_create_keypair(ecdsa->public, ecdsa->private, seed);
+       memzero(seed, sizeof(seed));
 
        return ecdsa;
 }
 
 // Write PEM ECDSA keys
 
-static bool write_pem(FILE *fp, const char *type, void *buf, size_t size) {
+static bool write_pem(FILE *fp, const char *type, void *vbuf, size_t size) {
        fprintf(fp, "-----BEGIN %s-----\n", type);
 
+       char *buf = vbuf;
        char base64[65];
+
        while(size) {
                size_t todo = size > 48 ? 48 : size;
-               b64encode(buf, base64, todo);
+               b64encode_tinc(buf, base64, todo);
                fprintf(fp, "%s\n", base64);
                buf += todo;
                size -= todo;
        }
 
+       memzero(base64, sizeof(base64));
+
        fprintf(fp, "-----END %s-----\n", type);
        return !ferror(fp);
 }
 
 bool ecdsa_write_pem_public_key(ecdsa_t *ecdsa, FILE *fp) {
-       return write_pem(fp, "ED25519 PUBLIC KEY", ecdsa->public, sizeof ecdsa->public);
+       return write_pem(fp, "ED25519 PUBLIC KEY", ecdsa->public, sizeof(ecdsa->public));
 }
 
 bool ecdsa_write_pem_private_key(ecdsa_t *ecdsa, FILE *fp) {
-       return write_pem(fp, "ED25519 PRIVATE KEY", ecdsa->private, sizeof *ecdsa);
+       return write_pem(fp, "ED25519 PRIVATE KEY", ecdsa->private, sizeof(*ecdsa));
 }