X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Fdigest.c;h=9c3ab1e8e88ff1efd1500539ce351794bb5d5b6a;hb=a0baeddb8aa745007d0302ed06247cabb8facb32;hp=0e600b9d07d31a0e83bfcecab08809442fbd467d;hpb=52f64cdf954a525bf7de1c5f9d3be60dfbe220b5;p=tinc diff --git a/src/openssl/digest.c b/src/openssl/digest.c index 0e600b9d..9c3ab1e8 100644 --- a/src/openssl/digest.c +++ b/src/openssl/digest.c @@ -1,6 +1,6 @@ /* digest.c -- Digest handling - Copyright (C) 2007-2013 Guus Sliepen + Copyright (C) 2007-2016 Guus Sliepen 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 @@ -29,15 +29,16 @@ #include "../logger.h" static digest_t *digest_open(const EVP_MD *evp_md, int maclength) { - digest_t *digest = xzalloc(sizeof *digest); + digest_t *digest = xzalloc(sizeof(*digest)); digest->digest = evp_md; int digestlen = EVP_MD_size(digest->digest); - if(maclength > digestlen || maclength < 0) + if(maclength > digestlen || maclength < 0) { digest->maclength = digestlen; - else + } else { digest->maclength = maclength; + } return digest; } @@ -64,10 +65,6 @@ digest_t *digest_open_by_nid(int nid, int maclength) { return digest_open(evp_md, maclength); } -digest_t *digest_open_sha1(int maclength) { - return digest_open(EVP_sha1(), maclength); -} - bool digest_set_key(digest_t *digest, const void *key, size_t len) { digest->key = xrealloc(digest->key, len); memcpy(digest->key, key, len); @@ -76,8 +73,9 @@ bool digest_set_key(digest_t *digest, const void *key, size_t len) { } void digest_close(digest_t *digest) { - if(!digest) + if(!digest) { return; + } free(digest->key); free(digest); @@ -93,14 +91,21 @@ bool digest_create(digest_t *digest, const void *indata, size_t inlen, void *out return false; } } else { - EVP_MD_CTX ctx; + EVP_MD_CTX *ctx = EVP_MD_CTX_create(); - if(!EVP_DigestInit(&ctx, digest->digest) - || !EVP_DigestUpdate(&ctx, indata, inlen) - || !EVP_DigestFinal(&ctx, tmpdata, NULL)) { + if(!ctx) { + abort(); + } + + if(!EVP_DigestInit(ctx, digest->digest) + || !EVP_DigestUpdate(ctx, indata, inlen) + || !EVP_DigestFinal(ctx, tmpdata, NULL)) { logger(DEBUG_ALWAYS, LOG_DEBUG, "Error creating digest: %s", ERR_error_string(ERR_get_error(), NULL)); + EVP_MD_CTX_destroy(ctx); return false; } + + EVP_MD_CTX_destroy(ctx); } memcpy(outdata, tmpdata, digest->maclength); @@ -115,26 +120,29 @@ bool digest_verify(digest_t *digest, const void *indata, size_t inlen, const voi } int digest_get_nid(const digest_t *digest) { - if(!digest || !digest->digest) + if(!digest || !digest->digest) { return 0; + } - return digest->digest->type; + return EVP_MD_type(digest->digest); } size_t digest_keylength(const digest_t *digest) { - if(!digest || !digest->digest) + if(!digest || !digest->digest) { return 0; + } - return digest->digest->md_size; + return EVP_MD_size(digest->digest); } size_t digest_length(const digest_t *digest) { - if(!digest) + if(!digest) { return 0; + } return digest->maclength; } bool digest_active(const digest_t *digest) { - return digest && digest->digest && digest->digest->type != 0; + return digest && digest->digest && EVP_MD_type(digest->digest) != 0; }