md5_ext.c (2866B)
1 /* 2 This file is part of GNU libmicrohttpd 3 Copyright (C) 2022-2023 Evgeny Grin (Karlson2k) 4 5 GNU libmicrohttpd is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with GNU libmicrohttpd. 17 If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 /** 21 * @file microhttpd/md5_ext.c 22 * @brief Wrapper for MD5 calculation performed by TLS library 23 * @author Karlson2k (Evgeny Grin) 24 */ 25 26 #include <gnutls/crypto.h> 27 #include "md5_ext.h" 28 #include "mhd_assert.h" 29 30 31 /** 32 * Initialise structure for MD5 calculation, allocate resources. 33 * 34 * This function must not be called more than one time for @a ctx. 35 * 36 * @param ctx the calculation context 37 */ 38 void 39 MHD_MD5_init_one_time (struct Md5CtxExt *ctx) 40 { 41 ctx->handle = NULL; 42 ctx->ext_error = gnutls_hash_init (&ctx->handle, 43 GNUTLS_DIG_MD5); 44 if ((0 != ctx->ext_error) && (NULL != ctx->handle)) 45 { 46 /* GnuTLS may return initialisation error and set the handle at the 47 same time. Such handle cannot be used for calculations. 48 Note: GnuTLS may also return an error and NOT set the handle. */ 49 gnutls_free (ctx->handle); 50 ctx->handle = NULL; 51 } 52 53 /* If handle is NULL, the error must be set */ 54 mhd_assert ((NULL != ctx->handle) || (0 != ctx->ext_error)); 55 /* If error is set, the handle must be NULL */ 56 mhd_assert ((0 == ctx->ext_error) || (NULL == ctx->handle)); 57 } 58 59 60 /** 61 * Process portion of bytes. 62 * 63 * @param ctx the calculation context 64 * @param data bytes to add to hash 65 * @param length number of bytes in @a data 66 */ 67 void 68 MHD_MD5_update (struct Md5CtxExt *ctx, 69 const uint8_t *data, 70 size_t length) 71 { 72 if (0 == ctx->ext_error) 73 ctx->ext_error = gnutls_hash (ctx->handle, data, length); 74 } 75 76 77 /** 78 * Finalise MD5 calculation, return digest, reset hash calculation. 79 * 80 * @param ctx the calculation context 81 * @param[out] digest set to the hash, must be #MD5_DIGEST_SIZE bytes 82 */ 83 void 84 MHD_MD5_finish_reset (struct Md5CtxExt *ctx, 85 uint8_t digest[MD5_DIGEST_SIZE]) 86 { 87 if (0 == ctx->ext_error) 88 gnutls_hash_output (ctx->handle, digest); 89 } 90 91 92 /** 93 * Free allocated resources. 94 * 95 * @param ctx the calculation context 96 */ 97 void 98 MHD_MD5_deinit (struct Md5CtxExt *ctx) 99 { 100 if (NULL != ctx->handle) 101 gnutls_hash_deinit (ctx->handle, NULL); 102 }