LCOV - code coverage report
Current view: top level - hmac - hmac.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 69 73 94.5 %
Date: 2014-08-02 Functions: 9 9 100.0 %
Branches: 28 58 48.3 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/hmac/hmac.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : 
      59                 :            : #define OPENSSL_FIPSAPI
      60                 :            : 
      61                 :            : #include <stdio.h>
      62                 :            : #include <stdlib.h>
      63                 :            : #include <string.h>
      64                 :            : #include "cryptlib.h"
      65                 :            : #include <openssl/hmac.h>
      66                 :            : 
      67                 :      17814 : int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
      68                 :            :                   const EVP_MD *md, ENGINE *impl)
      69                 :            :         {
      70                 :      17814 :         int i,j,reset=0;
      71                 :            :         unsigned char pad[HMAC_MAX_MD_CBLOCK];
      72                 :            : 
      73         [ +  - ]:      17814 :         if (md != NULL)
      74                 :            :                 {
      75                 :      17814 :                 reset=1;
      76                 :      17814 :                 ctx->md=md;
      77                 :            :                 }
      78                 :            :         else
      79                 :          0 :                 md=ctx->md;
      80                 :            : 
      81         [ +  - ]:      17814 :         if (key != NULL)
      82                 :            :                 {
      83                 :      17814 :                 reset=1;
      84                 :      17814 :                 j=M_EVP_MD_block_size(md);
      85         [ -  + ]:      17814 :                 OPENSSL_assert(j <= (int)sizeof(ctx->key));
      86         [ -  + ]:      17814 :                 if (j < len)
      87                 :            :                         {
      88         [ #  # ]:          0 :                         if (!EVP_DigestInit_ex(&ctx->md_ctx,md, impl))
      89                 :            :                                 goto err;
      90         [ #  # ]:          0 :                         if (!EVP_DigestUpdate(&ctx->md_ctx,key,len))
      91                 :            :                                 goto err;
      92         [ #  # ]:          0 :                         if (!EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key,
      93                 :            :                                 &ctx->key_length))
      94                 :            :                                 goto err;
      95                 :            :                         }
      96                 :            :                 else
      97                 :            :                         {
      98         [ -  + ]:      17814 :                         OPENSSL_assert(len>=0 && len<=(int)sizeof(ctx->key));
      99                 :      17814 :                         memcpy(ctx->key,key,len);
     100                 :      17814 :                         ctx->key_length=len;
     101                 :            :                         }
     102         [ +  - ]:      17814 :                 if(ctx->key_length != HMAC_MAX_MD_CBLOCK)
     103                 :      17814 :                         memset(&ctx->key[ctx->key_length], 0,
     104                 :      17814 :                                 HMAC_MAX_MD_CBLOCK - ctx->key_length);
     105                 :            :                 }
     106                 :            : 
     107         [ +  - ]:      17814 :         if (reset)      
     108                 :            :                 {
     109         [ +  + ]:    2298006 :                 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
     110                 :    2280192 :                         pad[i]=0x36^ctx->key[i];
     111         [ +  - ]:      17814 :                 if (!EVP_DigestInit_ex(&ctx->i_ctx,md, impl))
     112                 :            :                         goto err;
     113         [ +  - ]:      17814 :                 if (!EVP_DigestUpdate(&ctx->i_ctx,pad,M_EVP_MD_block_size(md)))
     114                 :            :                         goto err;
     115                 :            : 
     116         [ +  + ]:    2298006 :                 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
     117                 :    2280192 :                         pad[i]=0x5c^ctx->key[i];
     118         [ +  - ]:      17814 :                 if (!EVP_DigestInit_ex(&ctx->o_ctx,md, impl))
     119                 :            :                         goto err;
     120         [ +  - ]:      17814 :                 if (!EVP_DigestUpdate(&ctx->o_ctx,pad,M_EVP_MD_block_size(md)))
     121                 :            :                         goto err;
     122                 :            :                 }
     123         [ -  + ]:      17814 :         if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx))
     124                 :            :                         goto err;
     125                 :            :         return 1;
     126                 :            :         err:
     127                 :            :         return 0;
     128                 :            :         }
     129                 :            : 
     130                 :          4 : int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md)
     131                 :            :         {
     132         [ +  - ]:          4 :         if(key && md)
     133                 :          4 :             HMAC_CTX_init(ctx);
     134                 :          4 :         return HMAC_Init_ex(ctx,key,len,md, NULL);
     135                 :            :         }
     136                 :            : 
     137                 :     275149 : int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len)
     138                 :            :         {
     139                 :     275149 :         return EVP_DigestUpdate(&ctx->md_ctx,data,len);
     140                 :            :         }
     141                 :            : 
     142                 :     147494 : int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len)
     143                 :            :         {
     144                 :            :         unsigned int i;
     145                 :            :         unsigned char buf[EVP_MAX_MD_SIZE];
     146                 :            : 
     147         [ +  - ]:     147494 :         if (!EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i))
     148                 :            :                 goto err;
     149         [ +  - ]:     147494 :         if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx))
     150                 :            :                 goto err;
     151         [ +  - ]:     147494 :         if (!EVP_DigestUpdate(&ctx->md_ctx,buf,i))
     152                 :            :                 goto err;
     153         [ -  + ]:     147494 :         if (!EVP_DigestFinal_ex(&ctx->md_ctx,md,len))
     154                 :            :                 goto err;
     155                 :            :         return 1;
     156                 :            :         err:
     157                 :            :         return 0;
     158                 :            :         }
     159                 :            : 
     160                 :     689439 : void HMAC_CTX_init(HMAC_CTX *ctx)
     161                 :            :         {
     162                 :     689439 :         EVP_MD_CTX_init(&ctx->i_ctx);
     163                 :     689439 :         EVP_MD_CTX_init(&ctx->o_ctx);
     164                 :     689439 :         EVP_MD_CTX_init(&ctx->md_ctx);
     165                 :     689439 :         }
     166                 :            : 
     167                 :     248261 : int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)
     168                 :            :         {
     169                 :     248261 :         HMAC_CTX_init(dctx);
     170         [ +  - ]:     248261 :         if (!EVP_MD_CTX_copy_ex(&dctx->i_ctx, &sctx->i_ctx))
     171                 :            :                 goto err;
     172         [ +  - ]:     248261 :         if (!EVP_MD_CTX_copy_ex(&dctx->o_ctx, &sctx->o_ctx))
     173                 :            :                 goto err;
     174         [ +  - ]:     248261 :         if (!EVP_MD_CTX_copy_ex(&dctx->md_ctx, &sctx->md_ctx))
     175                 :            :                 goto err;
     176                 :     248261 :         memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK);
     177                 :     248261 :         dctx->key_length = sctx->key_length;
     178                 :     248261 :         dctx->md = sctx->md;
     179                 :     248261 :         return 1;
     180                 :            :         err:
     181                 :            :         return 0;
     182                 :            :         }
     183                 :            : 
     184                 :     283043 : void HMAC_CTX_cleanup(HMAC_CTX *ctx)
     185                 :            :         {
     186                 :     283043 :         EVP_MD_CTX_cleanup(&ctx->i_ctx);
     187                 :     283043 :         EVP_MD_CTX_cleanup(&ctx->o_ctx);
     188                 :     283043 :         EVP_MD_CTX_cleanup(&ctx->md_ctx);
     189                 :            :         memset(ctx,0,sizeof *ctx);
     190                 :     283043 :         }
     191                 :            : 
     192                 :          4 : unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
     193                 :            :                     const unsigned char *d, size_t n, unsigned char *md,
     194                 :            :                     unsigned int *md_len)
     195                 :            :         {
     196                 :            :         HMAC_CTX c;
     197                 :            :         static unsigned char m[EVP_MAX_MD_SIZE];
     198                 :            : 
     199         [ +  - ]:          4 :         if (md == NULL) md=m;
     200                 :          4 :         HMAC_CTX_init(&c);
     201         [ +  - ]:          4 :         if (!HMAC_Init(&c,key,key_len,evp_md))
     202                 :            :                 goto err;
     203         [ +  - ]:          4 :         if (!HMAC_Update(&c,d,n))
     204                 :            :                 goto err;
     205         [ +  - ]:          4 :         if (!HMAC_Final(&c,md,md_len))
     206                 :            :                 goto err;
     207                 :          4 :         HMAC_CTX_cleanup(&c);
     208                 :          4 :         return md;
     209                 :            :         err:
     210                 :            :         return NULL;
     211                 :            :         }
     212                 :            : 
     213                 :      16968 : void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags)
     214                 :            :         {
     215                 :      16968 :         M_EVP_MD_CTX_set_flags(&ctx->i_ctx, flags);
     216                 :      16968 :         M_EVP_MD_CTX_set_flags(&ctx->o_ctx, flags);
     217                 :      16968 :         M_EVP_MD_CTX_set_flags(&ctx->md_ctx, flags);
     218                 :      16968 :         }

Generated by: LCOV version 1.9