X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fed25519%2Fecdsa.c;h=8dee1246a05b3d3c64ce012d7f0d036fbe91055c;hb=1022812ed4b5c70162f2f0a9d9a96c716c936408;hp=78e24fe6aaa99f28bf97d4ff9e20d9bbb5c39e73;hpb=3a316823b971396a428f020f401b9fe41252d98d;p=tinc diff --git a/src/ed25519/ecdsa.c b/src/ed25519/ecdsa.c index 78e24fe6..8dee1246 100644 --- a/src/ed25519/ecdsa.c +++ b/src/ed25519/ecdsa.c @@ -35,17 +35,18 @@ typedef struct { // Get and set ECDSA keys // ecdsa_t *ecdsa_set_base64_public_key(const char *p) { - int len = strlen(p); + size_t len = strlen(p); if(len != 43) { - logger(DEBUG_ALWAYS, LOG_ERR, "Invalid size %d for public key!", len); + logger(DEBUG_ALWAYS, LOG_ERR, "Invalid size %zu for public key!", len); return 0; } 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(DEBUG_ALWAYS, LOG_ERR, "Invalid format of public key! len = %zu", len); free(ecdsa); return 0; } @@ -62,26 +63,33 @@ char *ecdsa_get_base64_public_key(ecdsa_t *ecdsa) { // Read PEM ECDSA keys -static bool read_pem(FILE *fp, const char *type, void *buf, size_t size) { +static bool read_pem(FILE *fp, const char *type, void *vbuf, size_t size) { char line[1024]; bool data = false; size_t typelen = strlen(type); + char *buf = vbuf; while(fgets(line, sizeof(line), fp)) { if(!data) { - if(strncmp(line, "-----BEGIN ", 11)) + if(strncmp(line, "-----BEGIN ", 11)) { continue; - if(strncmp(line + 11, type, typelen)) + } + + if(strncmp(line + 11, type, typelen)) { continue; + } + data = true; continue; } - if(!strncmp(line, "-----END ", 9)) + if(!strncmp(line, "-----END ", 9)) { break; + } size_t linelen = strcspn(line, "\r\n"); size_t len = b64decode(line, line, linelen); + if(!len) { logger(DEBUG_ALWAYS, LOG_ERR, "Invalid base64 data in PEM file\n"); errno = EINVAL; @@ -106,6 +114,7 @@ static bool read_pem(FILE *fp, const char *type, void *buf, size_t size) { } else { errno = ENOENT; } + return false; } @@ -114,21 +123,28 @@ static bool read_pem(FILE *fp, const char *type, void *buf, size_t size) { ecdsa_t *ecdsa_read_pem_public_key(FILE *fp) { ecdsa_t *ecdsa = xzalloc(sizeof(*ecdsa)); - if(read_pem(fp, "ED25519 PUBLIC KEY", ecdsa->public, sizeof(ecdsa->public))) + + if(read_pem(fp, "ED25519 PUBLIC KEY", ecdsa->public, sizeof(ecdsa->public))) { return ecdsa; + } + free(ecdsa); return 0; } ecdsa_t *ecdsa_read_pem_private_key(FILE *fp) { ecdsa_t *ecdsa = xmalloc(sizeof(*ecdsa)); - if(read_pem(fp, "ED25519 PRIVATE KEY", ecdsa->private, sizeof(*ecdsa))) + + if(read_pem(fp, "ED25519 PRIVATE KEY", ecdsa->private, sizeof(*ecdsa))) { return ecdsa; + } + free(ecdsa); return 0; } size_t ecdsa_size(ecdsa_t *ecdsa) { + (void)ecdsa; return 64; }