Refactor crypto RNG; add getrandom() support
[tinc] / src / ed25519 / ecdsagen.c
index 4184573..bc14fd2 100644 (file)
 
 #include "ed25519.h"
 
-#define __TINC_ECDSA_INTERNAL__
+#define TINC_ECDSA_INTERNAL
 typedef struct {
        uint8_t private[64];
        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);
 
        return ecdsa;
@@ -46,10 +46,28 @@ ecdsa_t *ecdsa_generate(void) {
 
 // Write PEM ECDSA keys
 
+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_tinc(buf, base64, todo);
+               fprintf(fp, "%s\n", base64);
+               buf += todo;
+               size -= todo;
+       }
+
+       fprintf(fp, "-----END %s-----\n", type);
+       return !ferror(fp);
+}
+
 bool ecdsa_write_pem_public_key(ecdsa_t *ecdsa, FILE *fp) {
-       return fwrite(ecdsa->public, sizeof ecdsa->public, 1, fp) == 1;
+       return write_pem(fp, "ED25519 PUBLIC KEY", ecdsa->public, sizeof(ecdsa->public));
 }
 
 bool ecdsa_write_pem_private_key(ecdsa_t *ecdsa, FILE *fp) {
-       return fwrite(ecdsa, sizeof *ecdsa, 1, fp) == 1;
+       return write_pem(fp, "ED25519 PRIVATE KEY", ecdsa->private, sizeof(*ecdsa));
 }