libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

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 }