LCOV - code coverage report
Current view: top level - crypto - hmac.c (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 102 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 9 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: hmac.c,v 1.4 2016/09/19 18:09:40 tedu Exp $   */
       2             : 
       3             : /*-
       4             :  * Copyright (c) 2008 Damien Bergamini <damien.bergamini@free.fr>
       5             :  *
       6             :  * Permission to use, copy, modify, and distribute this software for any
       7             :  * purpose with or without fee is hereby granted, provided that the above
       8             :  * copyright notice and this permission notice appear in all copies.
       9             :  *
      10             :  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      11             :  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      12             :  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      13             :  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      14             :  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      15             :  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      16             :  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      17             :  */
      18             : 
      19             : /*
      20             :  * This code implements the HMAC algorithm described in RFC 2104 using
      21             :  * the MD5, SHA1 and SHA-256 hash functions.
      22             :  */
      23             : 
      24             : #include <sys/param.h>
      25             : #include <sys/systm.h>
      26             : 
      27             : #include <crypto/md5.h>
      28             : #include <crypto/sha1.h>
      29             : #include <crypto/sha2.h>
      30             : #include <crypto/hmac.h>
      31             : 
      32             : void
      33           0 : HMAC_MD5_Init(HMAC_MD5_CTX *ctx, const u_int8_t *key, u_int key_len)
      34             : {
      35           0 :         u_int8_t k_ipad[MD5_BLOCK_LENGTH];
      36             :         int i;
      37             : 
      38           0 :         if (key_len > MD5_BLOCK_LENGTH) {
      39           0 :                 MD5Init(&ctx->ctx);
      40           0 :                 MD5Update(&ctx->ctx, key, key_len);
      41           0 :                 MD5Final(ctx->key, &ctx->ctx);
      42           0 :                 ctx->key_len = MD5_DIGEST_LENGTH;
      43           0 :         } else {
      44           0 :                 bcopy(key, ctx->key, key_len);
      45           0 :                 ctx->key_len = key_len;
      46             :         }
      47             : 
      48           0 :         bzero(k_ipad, MD5_BLOCK_LENGTH);
      49           0 :         memcpy(k_ipad, ctx->key, ctx->key_len);
      50           0 :         for (i = 0; i < MD5_BLOCK_LENGTH; i++)
      51           0 :                 k_ipad[i] ^= 0x36;
      52             : 
      53           0 :         MD5Init(&ctx->ctx);
      54           0 :         MD5Update(&ctx->ctx, k_ipad, MD5_BLOCK_LENGTH);
      55             : 
      56           0 :         explicit_bzero(k_ipad, sizeof k_ipad);
      57           0 : }
      58             : 
      59             : void
      60           0 : HMAC_MD5_Update(HMAC_MD5_CTX *ctx, const u_int8_t *data, u_int len)
      61             : {
      62           0 :         MD5Update(&ctx->ctx, data, len);
      63           0 : }
      64             : 
      65             : void
      66           0 : HMAC_MD5_Final(u_int8_t digest[MD5_DIGEST_LENGTH], HMAC_MD5_CTX *ctx)
      67             : {
      68           0 :         u_int8_t k_opad[MD5_BLOCK_LENGTH];
      69             :         int i;
      70             : 
      71           0 :         MD5Final(digest, &ctx->ctx);
      72             : 
      73           0 :         bzero(k_opad, MD5_BLOCK_LENGTH);
      74           0 :         memcpy(k_opad, ctx->key, ctx->key_len);
      75           0 :         for (i = 0; i < MD5_BLOCK_LENGTH; i++)
      76           0 :                 k_opad[i] ^= 0x5c;
      77             : 
      78           0 :         MD5Init(&ctx->ctx);
      79           0 :         MD5Update(&ctx->ctx, k_opad, MD5_BLOCK_LENGTH);
      80           0 :         MD5Update(&ctx->ctx, digest, MD5_DIGEST_LENGTH);
      81           0 :         MD5Final(digest, &ctx->ctx);
      82             : 
      83           0 :         explicit_bzero(k_opad, sizeof k_opad);
      84           0 : }
      85             : 
      86             : void
      87           0 : HMAC_SHA1_Init(HMAC_SHA1_CTX *ctx, const u_int8_t *key, u_int key_len)
      88             : {
      89           0 :         u_int8_t k_ipad[SHA1_BLOCK_LENGTH];
      90             :         int i;
      91             : 
      92           0 :         if (key_len > SHA1_BLOCK_LENGTH) {
      93           0 :                 SHA1Init(&ctx->ctx);
      94           0 :                 SHA1Update(&ctx->ctx, key, key_len);
      95           0 :                 SHA1Final(ctx->key, &ctx->ctx);
      96           0 :                 ctx->key_len = SHA1_DIGEST_LENGTH;
      97           0 :         } else {
      98           0 :                 bcopy(key, ctx->key, key_len);
      99           0 :                 ctx->key_len = key_len;
     100             :         }
     101             : 
     102           0 :         bzero(k_ipad, SHA1_BLOCK_LENGTH);
     103           0 :         memcpy(k_ipad, ctx->key, ctx->key_len);
     104           0 :         for (i = 0; i < SHA1_BLOCK_LENGTH; i++)
     105           0 :                 k_ipad[i] ^= 0x36;
     106             : 
     107           0 :         SHA1Init(&ctx->ctx);
     108           0 :         SHA1Update(&ctx->ctx, k_ipad, SHA1_BLOCK_LENGTH);
     109             : 
     110           0 :         explicit_bzero(k_ipad, sizeof k_ipad);
     111           0 : }
     112             : 
     113             : void
     114           0 : HMAC_SHA1_Update(HMAC_SHA1_CTX *ctx, const u_int8_t *data, u_int len)
     115             : {
     116           0 :         SHA1Update(&ctx->ctx, data, len);
     117           0 : }
     118             : 
     119             : void
     120           0 : HMAC_SHA1_Final(u_int8_t digest[SHA1_DIGEST_LENGTH], HMAC_SHA1_CTX *ctx)
     121             : {
     122           0 :         u_int8_t k_opad[SHA1_BLOCK_LENGTH];
     123             :         int i;
     124             : 
     125           0 :         SHA1Final(digest, &ctx->ctx);
     126             : 
     127           0 :         bzero(k_opad, SHA1_BLOCK_LENGTH);
     128           0 :         memcpy(k_opad, ctx->key, ctx->key_len);
     129           0 :         for (i = 0; i < SHA1_BLOCK_LENGTH; i++)
     130           0 :                 k_opad[i] ^= 0x5c;
     131             : 
     132           0 :         SHA1Init(&ctx->ctx);
     133           0 :         SHA1Update(&ctx->ctx, k_opad, SHA1_BLOCK_LENGTH);
     134           0 :         SHA1Update(&ctx->ctx, digest, SHA1_DIGEST_LENGTH);
     135           0 :         SHA1Final(digest, &ctx->ctx);
     136             : 
     137           0 :         explicit_bzero(k_opad, sizeof k_opad);
     138           0 : }
     139             : 
     140             : void
     141           0 : HMAC_SHA256_Init(HMAC_SHA256_CTX *ctx, const u_int8_t *key, u_int key_len)
     142             : {
     143           0 :         u_int8_t k_ipad[SHA256_BLOCK_LENGTH];
     144             :         int i;
     145             : 
     146           0 :         if (key_len > SHA256_BLOCK_LENGTH) {
     147           0 :                 SHA256Init(&ctx->ctx);
     148           0 :                 SHA256Update(&ctx->ctx, key, key_len);
     149           0 :                 SHA256Final(ctx->key, &ctx->ctx);
     150           0 :                 ctx->key_len = SHA256_DIGEST_LENGTH;
     151           0 :         } else {
     152           0 :                 bcopy(key, ctx->key, key_len);
     153           0 :                 ctx->key_len = key_len;
     154             :         }
     155             : 
     156           0 :         bzero(k_ipad, SHA256_BLOCK_LENGTH);
     157           0 :         memcpy(k_ipad, ctx->key, ctx->key_len);
     158           0 :         for (i = 0; i < SHA256_BLOCK_LENGTH; i++)
     159           0 :                 k_ipad[i] ^= 0x36;
     160             : 
     161           0 :         SHA256Init(&ctx->ctx);
     162           0 :         SHA256Update(&ctx->ctx, k_ipad, SHA256_BLOCK_LENGTH);
     163             : 
     164           0 :         explicit_bzero(k_ipad, sizeof k_ipad);
     165           0 : }
     166             : 
     167             : void
     168           0 : HMAC_SHA256_Update(HMAC_SHA256_CTX *ctx, const u_int8_t *data, u_int len)
     169             : {
     170           0 :         SHA256Update(&ctx->ctx, data, len);
     171           0 : }
     172             : 
     173             : void
     174           0 : HMAC_SHA256_Final(u_int8_t digest[SHA256_DIGEST_LENGTH], HMAC_SHA256_CTX *ctx)
     175             : {
     176           0 :         u_int8_t k_opad[SHA256_BLOCK_LENGTH];
     177             :         int i;
     178             : 
     179           0 :         SHA256Final(digest, &ctx->ctx);
     180             : 
     181           0 :         bzero(k_opad, SHA256_BLOCK_LENGTH);
     182           0 :         memcpy(k_opad, ctx->key, ctx->key_len);
     183           0 :         for (i = 0; i < SHA256_BLOCK_LENGTH; i++)
     184           0 :                 k_opad[i] ^= 0x5c;
     185             : 
     186           0 :         SHA256Init(&ctx->ctx);
     187           0 :         SHA256Update(&ctx->ctx, k_opad, SHA256_BLOCK_LENGTH);
     188           0 :         SHA256Update(&ctx->ctx, digest, SHA256_DIGEST_LENGTH);
     189           0 :         SHA256Final(digest, &ctx->ctx);
     190             : 
     191           0 :         explicit_bzero(k_opad, sizeof k_opad);
     192           0 : }

Generated by: LCOV version 1.13