X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Fdigest.c;h=9c3ab1e8e88ff1efd1500539ce351794bb5d5b6a;hb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;hp=8d97e3bf9ed345c53e5db8dc7949297e06920c65;hpb=ee34ac3d6125b7d1f41afa82c7e30f0a7205546c;p=tinc diff --git a/src/openssl/digest.c b/src/openssl/digest.c index 8d97e3bf..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(!ctx) { + abort(); + } - if(!EVP_DigestInit(&ctx, digest->digest) - || !EVP_DigestUpdate(&ctx, indata, inlen) - || !EVP_DigestFinal(&ctx, tmpdata, NULL)) { + 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,17 +120,29 @@ bool digest_verify(digest_t *digest, const void *indata, size_t inlen, const voi } int digest_get_nid(const digest_t *digest) { - return digest->digest ? digest->digest->type : 0; + if(!digest || !digest->digest) { + return 0; + } + + return EVP_MD_type(digest->digest); } size_t digest_keylength(const digest_t *digest) { - return digest->digest->md_size; + if(!digest || !digest->digest) { + return 0; + } + + return EVP_MD_size(digest->digest); } size_t digest_length(const digest_t *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; }