LCOV - code coverage report
Current view: top level - lib - hmac.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 144 144 100.0 %
Date: 2016-06-07 Functions: 8 8 100.0 %
Branches: 27 34 79.4 %

           Branch data     Line data    Source code
       1                 :            : /**
       2                 :            :  * \file lib/hmac.c
       3                 :            :  *
       4                 :            :  * \brief Provide HMAC support to SPA communications
       5                 :            :  */
       6                 :            : 
       7                 :            : /*  Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
       8                 :            :  *  Copyright (C) 2009-2015 fwknop developers and contributors. For a full
       9                 :            :  *  list of contributors, see the file 'CREDITS'.
      10                 :            :  *
      11                 :            :  *  License (GNU General Public License):
      12                 :            :  *
      13                 :            :  *  This program is free software; you can redistribute it and/or
      14                 :            :  *  modify it under the terms of the GNU General Public License
      15                 :            :  *  as published by the Free Software Foundation; either version 2
      16                 :            :  *  of the License, or (at your option) any later version.
      17                 :            :  *
      18                 :            :  *  This program is distributed in the hope that it will be useful,
      19                 :            :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      20                 :            :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      21                 :            :  *  GNU General Public License for more details.
      22                 :            :  *
      23                 :            :  *  You should have received a copy of the GNU General Public License
      24                 :            :  *  along with this program; if not, write to the Free Software
      25                 :            :  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
      26                 :            :  *  USA
      27                 :            :  *
      28                 :            :  *****************************************************************************
      29                 :            : */
      30                 :            : 
      31                 :            : #include "hmac.h"
      32                 :            : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
      33                 :            : DECLARE_TEST_SUITE(hmac_test, "hmac functions test suite");
      34                 :            : #endif /* LCOV_EXCL_STOP */
      35                 :            : 
      36                 :            : /**
      37                 :            :  * /brief populate the inner and outer pads
      38                 :            :  *
      39                 :            :  *
      40                 :            :  */
      41                 :            : static void
      42                 :    1522888 : pad_init(unsigned char *inner_pad, unsigned char *outer_pad,
      43                 :            :         const unsigned char * const key, const int key_len)
      44                 :            : {
      45                 :    1522888 :     int i = 0;
      46                 :            : 
      47         [ +  + ]:   50247648 :     for (i=0; i < MAX_DIGEST_BLOCK_LEN && i < key_len; i++) {
      48                 :   48724760 :         inner_pad[i] = key[i] ^ 0x36;
      49                 :   48724760 :         outer_pad[i] = key[i] ^ 0x5c;
      50                 :            :     }
      51                 :            : 
      52         [ +  - ]:    1522888 :     if(i < MAX_DIGEST_BLOCK_LEN)
      53                 :            :     {
      54         [ +  + ]:  159910896 :         while(i < MAX_DIGEST_BLOCK_LEN)
      55                 :            :         {
      56                 :  158388008 :             inner_pad[i] = 0x36;
      57                 :  158388008 :             outer_pad[i] = 0x5c;
      58                 :  158388008 :             i++;
      59                 :            :         }
      60                 :            :     }
      61                 :    1522888 :     return;
      62                 :            : }
      63                 :            : 
      64                 :            : int
      65                 :         58 : hmac_md5(const char *msg, const unsigned int msg_len,
      66                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
      67                 :            : {
      68                 :         58 :     unsigned char inner_hash[MD5_DIGEST_LEN] = {0};
      69                 :         58 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
      70                 :         58 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
      71                 :         58 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
      72                 :         58 :     unsigned char padded_hash[MD5_BLOCK_LEN + MD5_DIGEST_LEN + 1] = {0};
      73                 :         58 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
      74                 :         58 :     int final_len = hmac_key_len;
      75                 :            : 
      76         [ +  - ]:         58 :     if (padded_msg == NULL)
      77                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
      78                 :            :         
      79         [ +  + ]:         58 :     if(MD5_BLOCK_LEN < hmac_key_len)
      80                 :            :     {
      81                 :            :         /* Calculate the digest of the key
      82                 :            :         */
      83                 :          5 :         md5(final_key, (unsigned char *)hmac_key, final_len);
      84                 :          5 :         final_len = MD5_DIGEST_LEN;
      85                 :            :     }
      86                 :            :     else
      87                 :            :     {
      88                 :         53 :         memcpy(final_key, hmac_key, hmac_key_len);
      89                 :            :     }
      90                 :         58 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
      91                 :            : 
      92                 :            :     //The first step is to hash the inner_pad + message
      93                 :            :     memcpy(padded_msg, block_inner_pad, MD5_BLOCK_LEN);
      94                 :         58 :     memcpy(padded_msg + MD5_BLOCK_LEN, msg, msg_len);
      95                 :            : 
      96                 :            :     //Calculate the inner hash
      97                 :         58 :     md5(inner_hash, padded_msg, msg_len + MD5_BLOCK_LEN);
      98                 :            : 
      99                 :            :     //Then hash the outer pad + inner hash
     100                 :            :     memcpy(padded_hash, block_outer_pad, MD5_BLOCK_LEN);
     101                 :            :     memcpy(padded_hash + MD5_BLOCK_LEN, inner_hash, MD5_DIGEST_LEN);
     102                 :            : 
     103                 :            :     //the outer hash is the final hmac
     104                 :         58 :     md5(hmac, padded_hash, MD5_BLOCK_LEN + MD5_DIGEST_LEN);
     105                 :            : 
     106                 :         58 :     free(padded_msg);
     107                 :         58 :     return FKO_SUCCESS;
     108                 :            : }
     109                 :            : 
     110                 :            : int
     111                 :         96 : hmac_sha1(const char *msg, const unsigned int msg_len,
     112                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     113                 :            : {
     114                 :         96 :     unsigned char inner_hash[SHA1_DIGEST_LEN] = {0};
     115                 :         96 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     116                 :         96 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     117                 :         96 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     118                 :         96 :     unsigned char padded_hash[SHA1_BLOCK_LEN + SHA1_DIGEST_LEN + 1] = {0};
     119                 :         96 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     120                 :         96 :     int final_len = hmac_key_len;
     121                 :            : 
     122         [ +  - ]:         96 :     if (padded_msg == NULL)
     123                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     124                 :            : 
     125         [ +  + ]:         96 :     if(SHA1_BLOCK_LEN < hmac_key_len)
     126                 :            :     {
     127                 :            :         /* Calculate the digest of the key
     128                 :            :         */
     129                 :          5 :         sha1(final_key, (unsigned char *)hmac_key, final_len);
     130                 :          5 :         final_len = SHA1_DIGEST_LEN;
     131                 :            :     }
     132                 :            :     else
     133                 :            :     {
     134                 :         91 :         memcpy(final_key, hmac_key, hmac_key_len);
     135                 :            :     }
     136                 :         96 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     137                 :            : 
     138                 :            :     //The first step is to hash the inner_pad + message
     139                 :            :     memcpy(padded_msg, block_inner_pad, SHA1_BLOCK_LEN);
     140                 :         96 :     memcpy(padded_msg + SHA1_BLOCK_LEN, msg, msg_len);
     141                 :            : 
     142                 :            :     //Calculate the inner hash
     143                 :         96 :     sha1(inner_hash, padded_msg, msg_len + SHA1_BLOCK_LEN);
     144                 :            : 
     145                 :            :     //Then hash the outer pad + inner hash
     146                 :            :     memcpy(padded_hash, block_outer_pad, SHA1_BLOCK_LEN);
     147                 :            :     memcpy(padded_hash + SHA1_BLOCK_LEN, inner_hash, SHA1_DIGEST_LEN);
     148                 :            : 
     149                 :            :     //the outer hash is the final hmac
     150                 :         96 :     sha1(hmac, padded_hash, SHA1_BLOCK_LEN + SHA1_DIGEST_LEN);
     151                 :            : 
     152                 :         96 :     free(padded_msg);
     153                 :         96 :     return FKO_SUCCESS;
     154                 :            : }
     155                 :            : 
     156                 :            : int
     157                 :    1522603 : hmac_sha256(const char *msg, const unsigned int msg_len,
     158                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     159                 :            : {
     160                 :    1522603 :     unsigned char inner_hash[SHA256_DIGEST_LEN] = {0};
     161                 :    1522603 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     162                 :    1522603 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     163                 :    1522603 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     164                 :    1522603 :     unsigned char padded_hash[SHA256_BLOCK_LEN + SHA256_DIGEST_LEN + 1] = {0};
     165                 :    1522603 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     166                 :    1522603 :     int final_len = hmac_key_len;
     167                 :            : 
     168         [ +  + ]:    1522603 :     if (padded_msg == NULL)
     169                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     170                 :            : 
     171         [ +  + ]:    1522582 :     if(SHA256_BLOCK_LEN < hmac_key_len)
     172                 :            :     {
     173                 :            :         /* Calculate the digest of the key
     174                 :            :         */
     175                 :    1503556 :         sha256(final_key, (unsigned char *)hmac_key, final_len);
     176                 :    1503556 :         final_len = SHA256_DIGEST_LEN;
     177                 :            :     }
     178                 :            :     else
     179                 :            :     {
     180                 :      19026 :         memcpy(final_key, hmac_key, hmac_key_len);
     181                 :            :     }
     182                 :    1522582 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     183                 :            : 
     184                 :            :     //The first step is to hash the inner_pad + message
     185                 :            :     memcpy(padded_msg, block_inner_pad, SHA256_BLOCK_LEN);
     186                 :    1522582 :     memcpy(padded_msg + SHA256_BLOCK_LEN, msg, msg_len);
     187                 :            : 
     188                 :            :     //Calculate the inner hash
     189                 :    1522582 :     sha256(inner_hash, padded_msg, msg_len + SHA256_BLOCK_LEN);
     190                 :            : 
     191                 :            :     //Then hash the outer pad + inner hash
     192                 :            :     memcpy(padded_hash, block_outer_pad, SHA256_BLOCK_LEN);
     193                 :            :     memcpy(padded_hash + SHA256_BLOCK_LEN, inner_hash, SHA256_DIGEST_LEN);
     194                 :            : 
     195                 :            :     //the outer hash is the final hmac
     196                 :    1522582 :     sha256(hmac, padded_hash, SHA256_BLOCK_LEN + SHA256_DIGEST_LEN);
     197                 :            : 
     198                 :    1522582 :     free(padded_msg);
     199                 :    1522582 :     return FKO_SUCCESS;
     200                 :            : }
     201                 :            : 
     202                 :            : int
     203                 :         58 : hmac_sha384(const char *msg, const unsigned int msg_len,
     204                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     205                 :            : {
     206                 :         58 :     unsigned char inner_hash[SHA384_DIGEST_LEN] = {0};
     207                 :         58 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     208                 :         58 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     209                 :         58 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     210                 :         58 :     unsigned char padded_hash[SHA384_BLOCK_LEN + SHA384_DIGEST_LEN + 1] = {0};
     211                 :         58 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     212                 :         58 :     int final_len = hmac_key_len;
     213                 :            : 
     214         [ +  - ]:         58 :     if (padded_msg == NULL)
     215                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     216                 :            : 
     217         [ +  + ]:         58 :     if(SHA384_BLOCK_LEN < hmac_key_len)
     218                 :            :     {
     219                 :            :         /* Calculate the digest of the key
     220                 :            :         */
     221                 :          2 :         sha384(final_key, (unsigned char *)hmac_key, final_len);
     222                 :          2 :         final_len = SHA384_DIGEST_LEN;
     223                 :            :     }
     224                 :            :     else
     225                 :            :     {
     226                 :         56 :         memcpy(final_key, hmac_key, hmac_key_len);
     227                 :            :     }
     228                 :         58 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     229                 :            : 
     230                 :            :     //The first step is to hash the inner_pad + message
     231                 :            :     memcpy(padded_msg, block_inner_pad, SHA384_BLOCK_LEN);
     232                 :         58 :     memcpy(padded_msg + SHA384_BLOCK_LEN, msg, msg_len);
     233                 :            : 
     234                 :            :     //Calculate the inner hash
     235                 :         58 :     sha384(inner_hash, padded_msg, msg_len + SHA384_BLOCK_LEN);
     236                 :            : 
     237                 :            :     //Then hash the outer pad + inner hash
     238                 :            :     memcpy(padded_hash, block_outer_pad, SHA384_BLOCK_LEN);
     239                 :            :     memcpy(padded_hash + SHA384_BLOCK_LEN, inner_hash, SHA384_DIGEST_LEN);
     240                 :            : 
     241                 :            :     //the outer hash is the final hmac
     242                 :         58 :     sha384(hmac, padded_hash, SHA384_BLOCK_LEN + SHA384_DIGEST_LEN);
     243                 :            : 
     244                 :         58 :     free(padded_msg);
     245                 :         58 :     return FKO_SUCCESS;
     246                 :            : }
     247                 :            : 
     248                 :            : int
     249                 :         64 : hmac_sha512(const char *msg, const unsigned int msg_len,
     250                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     251                 :            : {
     252                 :         64 :     unsigned char inner_hash[SHA512_DIGEST_LEN] = {0};
     253                 :         64 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     254                 :         64 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     255                 :         64 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     256                 :         64 :     unsigned char padded_hash[SHA512_BLOCK_LEN + SHA512_DIGEST_LEN + 1] = {0};
     257                 :         64 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     258                 :         64 :     int final_len = hmac_key_len;
     259                 :            : 
     260         [ +  - ]:         64 :     if (padded_msg == NULL)
     261                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     262                 :            : 
     263         [ +  + ]:         64 :     if(SHA512_BLOCK_LEN < hmac_key_len)
     264                 :            :     {
     265                 :            :         /* Calculate the digest of the key
     266                 :            :         */
     267                 :          2 :         sha512(final_key, (unsigned char *)hmac_key, final_len);
     268                 :          2 :         final_len = SHA512_DIGEST_LEN;
     269                 :            :     }
     270                 :            :     else
     271                 :            :     {
     272                 :         62 :         memcpy(final_key, hmac_key, hmac_key_len);
     273                 :            :     }
     274                 :         64 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     275                 :            : 
     276                 :            :     //The first step is to hash the inner_pad + message
     277                 :            :     memcpy(padded_msg, block_inner_pad, SHA512_BLOCK_LEN);
     278                 :         64 :     memcpy(padded_msg + SHA512_BLOCK_LEN, msg, msg_len);
     279                 :            : 
     280                 :            :     //Calculate the inner hash
     281                 :         64 :     sha512(inner_hash, padded_msg, msg_len + SHA512_BLOCK_LEN);
     282                 :            : 
     283                 :            :     //Then hash the outer pad + inner hash
     284                 :            :     memcpy(padded_hash, block_outer_pad, SHA512_BLOCK_LEN);
     285                 :            :     memcpy(padded_hash + SHA512_BLOCK_LEN, inner_hash, SHA512_DIGEST_LEN);
     286                 :            : 
     287                 :            :     //the outer hash is the final hmac
     288                 :         64 :     sha512(hmac, padded_hash, SHA512_BLOCK_LEN + SHA512_DIGEST_LEN);
     289                 :            : 
     290                 :         64 :     free(padded_msg);
     291                 :         64 :     return FKO_SUCCESS;
     292                 :            : }
     293                 :            : 
     294                 :            : int
     295                 :         11 : hmac_sha3_256(const char *msg, const unsigned int msg_len,
     296                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     297                 :            : {
     298                 :         11 :     unsigned char inner_hash[SHA3_256_DIGEST_LEN] = {0};
     299                 :         11 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     300                 :         11 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     301                 :         11 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     302                 :         11 :     unsigned char padded_hash[SHA3_256_BLOCK_LEN + SHA3_256_DIGEST_LEN + 1] = {0};
     303                 :         11 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     304                 :         11 :     int final_len = hmac_key_len;
     305                 :            : 
     306         [ +  - ]:         11 :     if (padded_msg == NULL)
     307                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     308                 :            : 
     309         [ +  + ]:         11 :     if(SHA3_256_BLOCK_LEN < hmac_key_len)
     310                 :            :     {
     311                 :            :         /* Calculate the digest of the key
     312                 :            :         */
     313                 :          2 :         FIPS202_SHA3_256((unsigned char *)hmac_key, final_len, final_key);
     314                 :          2 :         final_len = SHA3_256_DIGEST_LEN;
     315                 :            :     }
     316                 :            :     else
     317                 :            :     {
     318                 :          9 :         memcpy(final_key, hmac_key, hmac_key_len);
     319                 :            :     }
     320                 :         11 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     321                 :            : 
     322                 :            :     //The first step is to hash the inner_pad + message
     323                 :            :     memcpy(padded_msg, block_inner_pad, SHA3_256_BLOCK_LEN);
     324                 :         11 :     memcpy(padded_msg + SHA3_256_BLOCK_LEN, msg, msg_len);
     325                 :            : 
     326                 :            :     //Calculate the inner hash
     327                 :         11 :     FIPS202_SHA3_256(padded_msg, msg_len + SHA3_256_BLOCK_LEN, inner_hash);
     328                 :            : 
     329                 :            :     //Then hash the outer pad + inner hash
     330                 :            :     memcpy(padded_hash, block_outer_pad, SHA3_256_BLOCK_LEN);
     331                 :            :     memcpy(padded_hash + SHA3_256_BLOCK_LEN, inner_hash, SHA3_256_DIGEST_LEN);
     332                 :            : 
     333                 :            :     //the outer hash is the final hmac
     334                 :         11 :     FIPS202_SHA3_256(padded_hash, SHA3_256_BLOCK_LEN + SHA3_256_DIGEST_LEN, hmac);
     335                 :            : 
     336                 :         11 :     free(padded_msg);
     337                 :         11 :     return FKO_SUCCESS;
     338                 :            : }
     339                 :            : 
     340                 :            : int
     341                 :         19 : hmac_sha3_512(const char *msg, const unsigned int msg_len,
     342                 :            :     unsigned char *hmac, const char *hmac_key, const int hmac_key_len)
     343                 :            : {
     344                 :         19 :     unsigned char inner_hash[SHA3_512_DIGEST_LEN] = {0};
     345                 :         19 :     unsigned char block_inner_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     346                 :         19 :     unsigned char block_outer_pad[MAX_DIGEST_BLOCK_LEN] = {0};
     347                 :         19 :     unsigned char final_key[MAX_DIGEST_BLOCK_LEN] = {0};
     348                 :         19 :     unsigned char padded_hash[SHA3_512_BLOCK_LEN + SHA3_512_DIGEST_LEN + 1] = {0};
     349                 :         19 :     unsigned char *padded_msg = calloc(1, msg_len + MAX_DIGEST_BLOCK_LEN + 1);
     350                 :         19 :     int final_len = hmac_key_len;
     351                 :            : 
     352         [ +  - ]:         19 :     if (padded_msg == NULL)
     353                 :            :         return FKO_ERROR_MEMORY_ALLOCATION;
     354                 :            : 
     355         [ +  + ]:         19 :     if(SHA3_512_BLOCK_LEN < hmac_key_len)
     356                 :            :     {
     357                 :            :         /* Calculate the digest of the key
     358                 :            :         */
     359                 :          6 :         FIPS202_SHA3_512((unsigned char *)hmac_key, final_len, final_key);
     360                 :          6 :         final_len = SHA3_512_DIGEST_LEN;
     361                 :            :     }
     362                 :            :     else
     363                 :            :     {
     364                 :         13 :         memcpy(final_key, hmac_key, hmac_key_len);
     365                 :            :     }
     366                 :         19 :     pad_init(block_inner_pad, block_outer_pad, final_key, final_len);
     367                 :            : 
     368                 :            :     //The first step is to hash the inner_pad + message
     369                 :            :     memcpy(padded_msg, block_inner_pad, SHA3_512_BLOCK_LEN);
     370                 :         19 :     memcpy(padded_msg + SHA3_512_BLOCK_LEN, msg, msg_len);
     371                 :            : 
     372                 :            :     //Calculate the inner hash
     373                 :         19 :     FIPS202_SHA3_512(padded_msg, msg_len + SHA3_512_BLOCK_LEN, inner_hash);
     374                 :            : 
     375                 :            :     //Then hash the outer pad + inner hash
     376                 :            :     memcpy(padded_hash, block_outer_pad, SHA3_512_BLOCK_LEN);
     377                 :            :     memcpy(padded_hash + SHA3_512_BLOCK_LEN, inner_hash, SHA3_512_DIGEST_LEN);
     378                 :            : 
     379                 :            :     //the outer hash is the final hmac
     380                 :         19 :     FIPS202_SHA3_512(padded_hash, SHA3_512_BLOCK_LEN + SHA3_512_DIGEST_LEN, hmac);
     381                 :            : 
     382                 :         19 :     free(padded_msg);
     383                 :         19 :     return FKO_SUCCESS;
     384                 :            : }
     385                 :            : 
     386                 :            : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
     387                 :            : 
     388                 :            : DECLARE_UTEST(test_hmac_md5, "hmac_md5 test vectors") // https://tools.ietf.org/html/rfc2202
     389                 :            : {
     390                 :            :     char msg[1024] = {0};
     391                 :            :     unsigned char hmac[1024] = {0};
     392                 :            :     char hmac_txt[1024] = {0};
     393                 :            :     char hmac_key[1024] = {0};
     394                 :            :     char expected_hmac1[1024] = {0};
     395                 :            :     char expected_hmac2[1024] = {0};
     396                 :            :     char expected_hmac3[1024] = {0};
     397                 :            :     char expected_hmac4[1024] = {0};
     398                 :            :     char expected_hmac5[1024] = {0};
     399                 :            :     char expected_hmac6[1024] = {0};
     400                 :            :     char expected_hmac7[1024] = {0};
     401                 :            :     int msg_len, key_len;
     402                 :            :     int i = 0;
     403                 :            : 
     404                 :            :     //vector 1
     405                 :            :     for ( i = 0; i < 16; i++)
     406                 :            :     {
     407                 :            :         hmac_key[i] = 0x0b;
     408                 :            :     }
     409                 :            :     key_len = 16;
     410                 :            :     strcpy(msg, "Hi There");
     411                 :            :     msg_len = 8;
     412                 :            :     strcpy(expected_hmac1, "9294727a3638bb1c13f48ef8158bfc9d");
     413                 :            : 
     414                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     415                 :            : 
     416                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     417                 :            :     {
     418                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     419                 :            :     }
     420                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, MD5_DIGEST_LEN) == 0);
     421                 :            : 
     422                 :            :     //vector 2
     423                 :            :     strcpy(hmac_key, "Jefe");
     424                 :            :     key_len = 4;
     425                 :            :     strcpy(msg, "what do ya want for nothing?");
     426                 :            :     msg_len = 28;
     427                 :            :     strcpy(expected_hmac2, "750c783e6ab0b503eaa86e310a5db738");
     428                 :            : 
     429                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     430                 :            : 
     431                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     432                 :            :     {
     433                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     434                 :            :     }
     435                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, MD5_DIGEST_LEN) == 0);
     436                 :            : 
     437                 :            :     //vector 3
     438                 :            :     for ( i = 0; i < 16; i++)
     439                 :            :     {
     440                 :            :         hmac_key[i] = 0xaa;
     441                 :            :     }
     442                 :            :     key_len = 16;
     443                 :            :     for ( i = 0; i < 50; i++)
     444                 :            :     {
     445                 :            :         msg[i] = 0xdd;
     446                 :            :     }
     447                 :            :     msg_len = 50;
     448                 :            :     strcpy(expected_hmac3, "56be34521d144c88dbb8c733f0e8b3f6");
     449                 :            : 
     450                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     451                 :            : 
     452                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     453                 :            :     {
     454                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     455                 :            :     }
     456                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, MD5_DIGEST_LEN) == 0);
     457                 :            : 
     458                 :            :     //vector 4
     459                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
     460                 :            :     key_len = 25;
     461                 :            :     for ( i = 0; i < 50; i++)
     462                 :            :     {
     463                 :            :         msg[i] = 0xcd;
     464                 :            :     }
     465                 :            :     msg_len = 50;
     466                 :            :     strcpy(expected_hmac4, "697eaf0aca3a3aea3a75164746ffaa79");
     467                 :            : 
     468                 :            :     hmac_md5(msg, 50, (unsigned char *)hmac, hmac_key, strlen(hmac_key));
     469                 :            : 
     470                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     471                 :            :     {
     472                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     473                 :            :     }
     474                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, MD5_DIGEST_LEN) == 0);
     475                 :            : 
     476                 :            :     //vector 5
     477                 :            :     for ( i = 0; i < 16; i++)
     478                 :            :     {
     479                 :            :         hmac_key[i] = 0x0c;
     480                 :            :     }
     481                 :            :     key_len = 16;
     482                 :            :     strcpy(msg, "Test With Truncation");
     483                 :            :     msg_len = 20;
     484                 :            :     strcpy(expected_hmac5, "56461ef2342edc00f9bab995690efd4c");
     485                 :            : 
     486                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     487                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     488                 :            :     {
     489                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     490                 :            :     }
     491                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, MD5_DIGEST_LEN) == 0);
     492                 :            : 
     493                 :            :     //vector 6
     494                 :            :     for ( i = 0; i < 80; i++)
     495                 :            :     {
     496                 :            :         hmac_key[i] = 0xaa;
     497                 :            :     }
     498                 :            :     key_len = 80;
     499                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
     500                 :            :     msg_len = 54;
     501                 :            :     strcpy(expected_hmac6, "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd");
     502                 :            : 
     503                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     504                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     505                 :            :     {
     506                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     507                 :            :     }
     508                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, MD5_DIGEST_LEN) == 0);
     509                 :            : 
     510                 :            :     //vector 7
     511                 :            :     for ( i = 0; i < 80; i++)
     512                 :            :     {
     513                 :            :         hmac_key[i] = 0xaa;
     514                 :            :     }
     515                 :            :     key_len = 80;
     516                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data");
     517                 :            :     msg_len = 73;
     518                 :            :     strcpy(expected_hmac7, "6f630fad67cda0ee1fb1f562db3aa53e");
     519                 :            : 
     520                 :            :     hmac_md5(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     521                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     522                 :            :     {
     523                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     524                 :            :     }
     525                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, MD5_DIGEST_LEN) == 0);
     526                 :            : 
     527                 :            : }
     528                 :            : 
     529                 :            : DECLARE_UTEST(test_hmac_sha1, "hmac_sha1 test vectors") // https://tools.ietf.org/html/rfc2202
     530                 :            : {
     531                 :            :     char msg[1024] = {0};
     532                 :            :     unsigned char hmac[1024] = {0};
     533                 :            :     char hmac_txt[1024] = {0};
     534                 :            :     char hmac_key[1024] = {0};
     535                 :            :     char expected_hmac1[1024] = {0};
     536                 :            :     char expected_hmac2[1024] = {0};
     537                 :            :     char expected_hmac3[1024] = {0};
     538                 :            :     char expected_hmac4[1024] = {0};
     539                 :            :     char expected_hmac5[1024] = {0};
     540                 :            :     char expected_hmac6[1024] = {0};
     541                 :            :     char expected_hmac7[1024] = {0};
     542                 :            :     int msg_len, key_len;
     543                 :            :     int i = 0;
     544                 :            : 
     545                 :            :     //vector 1
     546                 :            :     for ( i = 0; i < 20; i++)
     547                 :            :     {
     548                 :            :         hmac_key[i] = 0x0b;
     549                 :            :     }
     550                 :            :     key_len = 20;
     551                 :            :     strcpy(msg, "Hi There");
     552                 :            :     msg_len = 8;
     553                 :            :     strcpy(expected_hmac1, "b617318655057264e28bc0b6fb378c8ef146be00");
     554                 :            : 
     555                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     556                 :            : 
     557                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     558                 :            :     {
     559                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     560                 :            :     }
     561                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA1_DIGEST_LEN) == 0);
     562                 :            : 
     563                 :            :     //vector 2
     564                 :            :     strcpy(hmac_key, "Jefe");
     565                 :            :     key_len = 4;
     566                 :            :     strcpy(msg, "what do ya want for nothing?");
     567                 :            :     msg_len = 28;
     568                 :            :     strcpy(expected_hmac2, "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79");
     569                 :            : 
     570                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     571                 :            : 
     572                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     573                 :            :     {
     574                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     575                 :            :     }
     576                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA1_DIGEST_LEN) == 0);
     577                 :            : 
     578                 :            :     //vector 3
     579                 :            :     for ( i = 0; i < 20; i++)
     580                 :            :     {
     581                 :            :         hmac_key[i] = 0xaa;
     582                 :            :     }
     583                 :            :     key_len = 20;
     584                 :            :     for ( i = 0; i < 50; i++)
     585                 :            :     {
     586                 :            :         msg[i] = 0xdd;
     587                 :            :     }
     588                 :            :     msg_len = 50;
     589                 :            :     strcpy(expected_hmac3, "125d7342b9ac11cd91a39af48aa17b4f63f175d3");
     590                 :            : 
     591                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     592                 :            : 
     593                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     594                 :            :     {
     595                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     596                 :            :     }
     597                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA1_DIGEST_LEN) == 0);
     598                 :            : 
     599                 :            :     //vector 4
     600                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
     601                 :            :     key_len = 25;
     602                 :            :     for ( i = 0; i < 50; i++)
     603                 :            :     {
     604                 :            :         msg[i] = 0xcd;
     605                 :            :     }
     606                 :            :     msg_len = 50;
     607                 :            :     strcpy(expected_hmac4, "4c9007f4026250c6bc8414f9bf50c86c2d7235da");
     608                 :            : 
     609                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     610                 :            : 
     611                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     612                 :            :     {
     613                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     614                 :            :     }
     615                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA1_DIGEST_LEN) == 0);
     616                 :            : 
     617                 :            :     //vector 5
     618                 :            :     for ( i = 0; i < 20; i++)
     619                 :            :     {
     620                 :            :         hmac_key[i] = 0x0c;
     621                 :            :     }
     622                 :            :     key_len = 20;
     623                 :            :     strcpy(msg, "Test With Truncation");
     624                 :            :     msg_len = 20;
     625                 :            :     strcpy(expected_hmac5, "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04");
     626                 :            : 
     627                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     628                 :            : 
     629                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     630                 :            :     {
     631                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     632                 :            :     }
     633                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, SHA1_DIGEST_LEN) == 0);
     634                 :            : 
     635                 :            :     //vector 6
     636                 :            :     for ( i = 0; i < 80; i++)
     637                 :            :     {
     638                 :            :         hmac_key[i] = 0xaa;
     639                 :            :     }
     640                 :            :     key_len = 80;
     641                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
     642                 :            :     msg_len = 54;
     643                 :            :     strcpy(expected_hmac6, "aa4ae5e15272d00e95705637ce8a3b55ed402112");
     644                 :            : 
     645                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     646                 :            : 
     647                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     648                 :            :     {
     649                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     650                 :            :     }
     651                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA1_DIGEST_LEN) == 0);
     652                 :            : 
     653                 :            :     //vector 7
     654                 :            :     for ( i = 0; i < 80; i++)
     655                 :            :     {
     656                 :            :         hmac_key[i] = 0xaa;
     657                 :            :     }
     658                 :            :     key_len = 80;
     659                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data");
     660                 :            :     msg_len = 73;
     661                 :            :     strcpy(expected_hmac7, "e8e99d0f45237d786d6bbaa7965c7808bbff1a91");
     662                 :            : 
     663                 :            :     hmac_sha1(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     664                 :            : 
     665                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     666                 :            :     {
     667                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     668                 :            :     }
     669                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA1_DIGEST_LEN) == 0);
     670                 :            : }
     671                 :            : 
     672                 :            : DECLARE_UTEST(test_hmac_sha256, "hmac_sha256 test vectors") // https://tools.ietf.org/html/rfc4231
     673                 :            : {
     674                 :            :     char msg[1024] = {0};
     675                 :            :     unsigned char hmac[1024] = {0};
     676                 :            :     char hmac_txt[1024] = {0};
     677                 :            :     char hmac_key[1024] = {0};
     678                 :            :     char expected_hmac1[1024] = {0};
     679                 :            :     char expected_hmac2[1024] = {0};
     680                 :            :     char expected_hmac3[1024] = {0};
     681                 :            :     char expected_hmac4[1024] = {0};
     682                 :            :     char expected_hmac5[1024] = {0};
     683                 :            :     char expected_hmac6[1024] = {0};
     684                 :            :     char expected_hmac7[1024] = {0};
     685                 :            :     int msg_len, key_len;
     686                 :            :     int i = 0;
     687                 :            : 
     688                 :            :     //vector 1
     689                 :            :     for ( i = 0; i < 20; i++)
     690                 :            :     {
     691                 :            :         hmac_key[i] = 0x0b;
     692                 :            :     }
     693                 :            :     key_len = 20;
     694                 :            :     strcpy(msg, "Hi There");
     695                 :            :     msg_len = 8;
     696                 :            :     strcpy(expected_hmac1, "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7");
     697                 :            : 
     698                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     699                 :            : 
     700                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     701                 :            :     {
     702                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     703                 :            :     }
     704                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA256_DIGEST_LEN) == 0);
     705                 :            : 
     706                 :            :     //vector 2
     707                 :            :     strcpy(hmac_key, "Jefe");
     708                 :            :     key_len = 4;
     709                 :            :     strcpy(msg, "what do ya want for nothing?");
     710                 :            :     msg_len = 28;
     711                 :            :     strcpy(expected_hmac2, "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843");
     712                 :            : 
     713                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     714                 :            : 
     715                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     716                 :            :     {
     717                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     718                 :            :     }
     719                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA256_DIGEST_LEN) == 0);
     720                 :            : 
     721                 :            :     //vector 3
     722                 :            :     for ( i = 0; i < 20; i++)
     723                 :            :     {
     724                 :            :         hmac_key[i] = 0xaa;
     725                 :            :     }
     726                 :            :     key_len = 20;
     727                 :            :     for ( i = 0; i < 50; i++)
     728                 :            :     {
     729                 :            :         msg[i] = 0xdd;
     730                 :            :     }
     731                 :            :     msg_len = 50;
     732                 :            :     strcpy(expected_hmac3, "773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe");
     733                 :            : 
     734                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     735                 :            : 
     736                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     737                 :            :     {
     738                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     739                 :            :     }
     740                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA256_DIGEST_LEN) == 0);
     741                 :            : 
     742                 :            :     //vector 4
     743                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
     744                 :            :     key_len = 25;
     745                 :            :     for ( i = 0; i < 50; i++)
     746                 :            :     {
     747                 :            :         msg[i] = 0xcd;
     748                 :            :     }
     749                 :            :     msg_len = 50;
     750                 :            :     strcpy(expected_hmac4, "82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b");
     751                 :            : 
     752                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     753                 :            : 
     754                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     755                 :            :     {
     756                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     757                 :            :     }
     758                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA256_DIGEST_LEN) == 0);
     759                 :            : 
     760                 :            :     //vector 5
     761                 :            :     for ( i = 0; i < 20; i++)
     762                 :            :     {
     763                 :            :         hmac_key[i] = 0x0c;
     764                 :            :     }
     765                 :            :     key_len = 20;
     766                 :            :     strcpy(msg, "Test With Truncation");
     767                 :            :     msg_len = 20;
     768                 :            :     strcpy(expected_hmac5, "a3b6167473100ee06e0c796c2955552b");
     769                 :            : 
     770                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     771                 :            : 
     772                 :            :     for ( i = 0; i < 16; i++)
     773                 :            :     {
     774                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     775                 :            :     }
     776                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, 16) == 0); //test specifies truncated output
     777                 :            : 
     778                 :            :     //vector 6
     779                 :            :     for ( i = 0; i < 131; i++)
     780                 :            :     {
     781                 :            :         hmac_key[i] = 0xaa;
     782                 :            :     }
     783                 :            :     key_len = 131;
     784                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
     785                 :            :     msg_len = 54;
     786                 :            :     strcpy(expected_hmac6, "60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54");
     787                 :            : 
     788                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     789                 :            : 
     790                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     791                 :            :     {
     792                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     793                 :            :     }
     794                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA256_DIGEST_LEN) == 0);
     795                 :            : 
     796                 :            :     //vector 7
     797                 :            :     for ( i = 0; i < 131; i++)
     798                 :            :     {
     799                 :            :         hmac_key[i] = 0xaa;
     800                 :            :     }
     801                 :            :     key_len = 131;
     802                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
     803                 :            :     msg_len = strlen(msg);
     804                 :            :     strcpy(expected_hmac7, "9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2");
     805                 :            : 
     806                 :            :     hmac_sha256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     807                 :            : 
     808                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     809                 :            :     {
     810                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     811                 :            :     }
     812                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA256_DIGEST_LEN) == 0);
     813                 :            : }
     814                 :            : 
     815                 :            : DECLARE_UTEST(test_hmac_sha384, "hmac_sha384 test vectors")
     816                 :            : {
     817                 :            :     char msg[1024] = {0};
     818                 :            :     unsigned char hmac[1024] = {0};
     819                 :            :     char hmac_txt[1024] = {0};
     820                 :            :     char hmac_key[1024] = {0};
     821                 :            :     char expected_hmac1[1024] = {0};
     822                 :            :     char expected_hmac2[1024] = {0};
     823                 :            :     char expected_hmac3[1024] = {0};
     824                 :            :     char expected_hmac4[1024] = {0};
     825                 :            :     char expected_hmac5[1024] = {0};
     826                 :            :     char expected_hmac6[1024] = {0};
     827                 :            :     char expected_hmac7[1024] = {0};
     828                 :            :     int msg_len, key_len;
     829                 :            :     int i = 0;
     830                 :            : 
     831                 :            :     //vector 1
     832                 :            :     for ( i = 0; i < 20; i++)
     833                 :            :     {
     834                 :            :         hmac_key[i] = 0x0b;
     835                 :            :     }
     836                 :            :     key_len = 20;
     837                 :            :     strcpy(msg, "Hi There");
     838                 :            :     msg_len = 8;
     839                 :            :     strcpy(expected_hmac1, "afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6");
     840                 :            : 
     841                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     842                 :            : 
     843                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     844                 :            :     {
     845                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     846                 :            :     }
     847                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA384_DIGEST_LEN) == 0);
     848                 :            : 
     849                 :            :     //vector 2
     850                 :            :     strcpy(hmac_key, "Jefe");
     851                 :            :     key_len = 4;
     852                 :            :     strcpy(msg, "what do ya want for nothing?");
     853                 :            :     msg_len = 28;
     854                 :            :     strcpy(expected_hmac2, "af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649");
     855                 :            : 
     856                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     857                 :            : 
     858                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     859                 :            :     {
     860                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     861                 :            :     }
     862                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA384_DIGEST_LEN) == 0);
     863                 :            : 
     864                 :            :     //vector 3
     865                 :            :     for ( i = 0; i < 20; i++)
     866                 :            :     {
     867                 :            :         hmac_key[i] = 0xaa;
     868                 :            :     }
     869                 :            :     key_len = 20;
     870                 :            :     for ( i = 0; i < 50; i++)
     871                 :            :     {
     872                 :            :         msg[i] = 0xdd;
     873                 :            :     }
     874                 :            :     msg_len = 50;
     875                 :            :     strcpy(expected_hmac3, "88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b2a5ab39dc13814b94e3ab6e101a34f27");
     876                 :            : 
     877                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     878                 :            : 
     879                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     880                 :            :     {
     881                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     882                 :            :     }
     883                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA384_DIGEST_LEN) == 0);
     884                 :            : 
     885                 :            :     //vector 4
     886                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
     887                 :            :     key_len = 25;
     888                 :            :     for ( i = 0; i < 50; i++)
     889                 :            :     {
     890                 :            :         msg[i] = 0xcd;
     891                 :            :     }
     892                 :            :     msg_len = 50;
     893                 :            :     strcpy(expected_hmac4, "3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e6801dd23c4a7d679ccf8a386c674cffb");
     894                 :            : 
     895                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     896                 :            : 
     897                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     898                 :            :     {
     899                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     900                 :            :     }
     901                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA384_DIGEST_LEN) == 0);
     902                 :            : 
     903                 :            :     //vector 5
     904                 :            :     for ( i = 0; i < 20; i++)
     905                 :            :     {
     906                 :            :         hmac_key[i] = 0x0c;
     907                 :            :     }
     908                 :            :     key_len = 20;
     909                 :            :     strcpy(msg, "Test With Truncation");
     910                 :            :     msg_len = 20;
     911                 :            :     strcpy(expected_hmac5, "3abf34c3503b2a23a46efc619baef897");
     912                 :            : 
     913                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     914                 :            : 
     915                 :            :     for ( i = 0; i < 16; i++)
     916                 :            :     {
     917                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     918                 :            :     }
     919                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, 16) == 0); //test specifies truncated output
     920                 :            : 
     921                 :            :     //vector 6
     922                 :            :     for ( i = 0; i < 131; i++)
     923                 :            :     {
     924                 :            :         hmac_key[i] = 0xaa;
     925                 :            :     }
     926                 :            :     key_len = 131;
     927                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
     928                 :            :     msg_len = 54;
     929                 :            :     strcpy(expected_hmac6, "4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c60c2ef6ab4030fe8296248df163f44952");
     930                 :            : 
     931                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     932                 :            : 
     933                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     934                 :            :     {
     935                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     936                 :            :     }
     937                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA384_DIGEST_LEN) == 0);
     938                 :            : 
     939                 :            :     //vector 7
     940                 :            :     for ( i = 0; i < 131; i++)
     941                 :            :     {
     942                 :            :         hmac_key[i] = 0xaa;
     943                 :            :     }
     944                 :            :     key_len = 131;
     945                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
     946                 :            :     msg_len = strlen(msg);
     947                 :            :     strcpy(expected_hmac7, "6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5a678cc31e799176d3860e6110c46523e");
     948                 :            : 
     949                 :            :     hmac_sha384(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     950                 :            : 
     951                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     952                 :            :     {
     953                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     954                 :            :     }
     955                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA384_DIGEST_LEN) == 0);
     956                 :            : }
     957                 :            : 
     958                 :            : DECLARE_UTEST(test_hmac_sha512, "hmac_sha512 test vectors")
     959                 :            : {
     960                 :            :     char msg[1024] = {0};
     961                 :            :     unsigned char hmac[1024] = {0};
     962                 :            :     char hmac_txt[1024] = {0};
     963                 :            :     char hmac_key[1024] = {0};
     964                 :            :     char expected_hmac1[1024] = {0};
     965                 :            :     char expected_hmac2[1024] = {0};
     966                 :            :     char expected_hmac3[1024] = {0};
     967                 :            :     char expected_hmac4[1024] = {0};
     968                 :            :     char expected_hmac5[1024] = {0};
     969                 :            :     char expected_hmac6[1024] = {0};
     970                 :            :     char expected_hmac7[1024] = {0};
     971                 :            :     int msg_len, key_len;
     972                 :            :     int i = 0;
     973                 :            : 
     974                 :            :     //vector 1
     975                 :            :     for ( i = 0; i < 20; i++)
     976                 :            :     {
     977                 :            :         hmac_key[i] = 0x0b;
     978                 :            :     }
     979                 :            :     key_len = 20;
     980                 :            :     strcpy(msg, "Hi There");
     981                 :            :     msg_len = 8;
     982                 :            :     strcpy(expected_hmac1, "87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854");
     983                 :            : 
     984                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
     985                 :            : 
     986                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
     987                 :            :     {
     988                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
     989                 :            :     }
     990                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA512_DIGEST_LEN) == 0);
     991                 :            : 
     992                 :            :     //vector 2
     993                 :            :     strcpy(hmac_key, "Jefe");
     994                 :            :     key_len = 4;
     995                 :            :     strcpy(msg, "what do ya want for nothing?");
     996                 :            :     msg_len = 28;
     997                 :            :     strcpy(expected_hmac2, "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737");
     998                 :            : 
     999                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1000                 :            : 
    1001                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
    1002                 :            :     {
    1003                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1004                 :            :     }
    1005                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA512_DIGEST_LEN) == 0);
    1006                 :            : 
    1007                 :            :     //vector 3
    1008                 :            :     for ( i = 0; i < 20; i++)
    1009                 :            :     {
    1010                 :            :         hmac_key[i] = 0xaa;
    1011                 :            :     }
    1012                 :            :     key_len = 20;
    1013                 :            :     for ( i = 0; i < 50; i++)
    1014                 :            :     {
    1015                 :            :         msg[i] = 0xdd;
    1016                 :            :     }
    1017                 :            :     msg_len = 50;
    1018                 :            :     strcpy(expected_hmac3, "fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb");
    1019                 :            : 
    1020                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1021                 :            : 
    1022                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
    1023                 :            :     {
    1024                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1025                 :            :     }
    1026                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA512_DIGEST_LEN) == 0);
    1027                 :            : 
    1028                 :            :     //vector 4
    1029                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
    1030                 :            :     key_len = 25;
    1031                 :            :     for ( i = 0; i < 50; i++)
    1032                 :            :     {
    1033                 :            :         msg[i] = 0xcd;
    1034                 :            :     }
    1035                 :            :     msg_len = 50;
    1036                 :            :     strcpy(expected_hmac4, "b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd");
    1037                 :            : 
    1038                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1039                 :            : 
    1040                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
    1041                 :            :     {
    1042                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1043                 :            :     }
    1044                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA512_DIGEST_LEN) == 0);
    1045                 :            : 
    1046                 :            :     //vector 5
    1047                 :            :     for ( i = 0; i < 20; i++)
    1048                 :            :     {
    1049                 :            :         hmac_key[i] = 0x0c;
    1050                 :            :     }
    1051                 :            :     key_len = 20;
    1052                 :            :     strcpy(msg, "Test With Truncation");
    1053                 :            :     msg_len = 20;
    1054                 :            :     strcpy(expected_hmac5, "415fad6271580a531d4179bc891d87a6");
    1055                 :            : 
    1056                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1057                 :            : 
    1058                 :            :     for ( i = 0; i < 16; i++)
    1059                 :            :     {
    1060                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1061                 :            :     }
    1062                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, 16) == 0); //test specifies truncated output
    1063                 :            : 
    1064                 :            :     //vector 6
    1065                 :            :     for ( i = 0; i < 131; i++)
    1066                 :            :     {
    1067                 :            :         hmac_key[i] = 0xaa;
    1068                 :            :     }
    1069                 :            :     key_len = 131;
    1070                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
    1071                 :            :     msg_len = 54;
    1072                 :            :     strcpy(expected_hmac6, "80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598");
    1073                 :            : 
    1074                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1075                 :            : 
    1076                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
    1077                 :            :     {
    1078                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1079                 :            :     }
    1080                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA512_DIGEST_LEN) == 0);
    1081                 :            : 
    1082                 :            :     //vector 7
    1083                 :            :     for ( i = 0; i < 131; i++)
    1084                 :            :     {
    1085                 :            :         hmac_key[i] = 0xaa;
    1086                 :            :     }
    1087                 :            :     key_len = 131;
    1088                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
    1089                 :            :     msg_len = strlen(msg);
    1090                 :            :     strcpy(expected_hmac7, "e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58");
    1091                 :            : 
    1092                 :            :     hmac_sha512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1093                 :            : 
    1094                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
    1095                 :            :     {
    1096                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1097                 :            :     }
    1098                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA512_DIGEST_LEN) == 0);
    1099                 :            : }
    1100                 :            : 
    1101                 :            : DECLARE_UTEST(test_hmac_sha3_256, "hmac_sha3_256 test vectors") //http://wolfgang-ehrhardt.de/hmac-sha3-testvectors.html
    1102                 :            : {
    1103                 :            :     char msg[1024] = {0};
    1104                 :            :     unsigned char hmac[1024] = {0};
    1105                 :            :     char hmac_txt[1024] = {0};
    1106                 :            :     char hmac_key[1024] = {0};
    1107                 :            :     char expected_hmac1[1024] = {0};
    1108                 :            :     char expected_hmac2[1024] = {0};
    1109                 :            :     char expected_hmac3[1024] = {0};
    1110                 :            :     char expected_hmac4[1024] = {0};
    1111                 :            :     char expected_hmac5[1024] = {0};
    1112                 :            :     char expected_hmac6[1024] = {0};
    1113                 :            :     char expected_hmac6a[1024] = {0};
    1114                 :            :     char expected_hmac7[1024] = {0};
    1115                 :            :     char expected_hmac7a[1024] = {0};
    1116                 :            :     int msg_len, key_len;
    1117                 :            :     int i = 0;
    1118                 :            : 
    1119                 :            :     //vector 1
    1120                 :            :     for ( i = 0; i < 20; i++)
    1121                 :            :     {
    1122                 :            :         hmac_key[i] = 0x0b;
    1123                 :            :     }
    1124                 :            :     key_len = 20;
    1125                 :            :     strcpy(msg, "Hi There");
    1126                 :            :     msg_len = 8;
    1127                 :            :     strcpy(expected_hmac1, "ba85192310dffa96e2a3a40e69774351140bb7185e1202cdcc917589f95e16bb");
    1128                 :            : 
    1129                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1130                 :            : 
    1131                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1132                 :            :     {
    1133                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1134                 :            :     }
    1135                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA3_256_DIGEST_LEN) == 0);
    1136                 :            : 
    1137                 :            :     //vector 2
    1138                 :            :     strcpy(hmac_key, "Jefe");
    1139                 :            :     key_len = 4;
    1140                 :            :     strcpy(msg, "what do ya want for nothing?");
    1141                 :            :     msg_len = 28;
    1142                 :            :     strcpy(expected_hmac2, "c7d4072e788877ae3596bbb0da73b887c9171f93095b294ae857fbe2645e1ba5");
    1143                 :            : 
    1144                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1145                 :            : 
    1146                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1147                 :            :     {
    1148                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1149                 :            :     }
    1150                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA3_256_DIGEST_LEN) == 0);
    1151                 :            : 
    1152                 :            :     //vector 3
    1153                 :            :     for ( i = 0; i < 20; i++)
    1154                 :            :     {
    1155                 :            :         hmac_key[i] = 0xaa;
    1156                 :            :     }
    1157                 :            :     key_len = 20;
    1158                 :            :     for ( i = 0; i < 50; i++)
    1159                 :            :     {
    1160                 :            :         msg[i] = 0xdd;
    1161                 :            :     }
    1162                 :            :     msg_len = 50;
    1163                 :            :     strcpy(expected_hmac3, "84ec79124a27107865cedd8bd82da9965e5ed8c37b0ac98005a7f39ed58a4207");
    1164                 :            : 
    1165                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1166                 :            : 
    1167                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1168                 :            :     {
    1169                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1170                 :            :     }
    1171                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA3_256_DIGEST_LEN) == 0);
    1172                 :            : 
    1173                 :            :     //vector 4
    1174                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
    1175                 :            :     key_len = 25;
    1176                 :            :     for ( i = 0; i < 50; i++)
    1177                 :            :     {
    1178                 :            :         msg[i] = 0xcd;
    1179                 :            :     }
    1180                 :            :     msg_len = 50;
    1181                 :            :     strcpy(expected_hmac4, "57366a45e2305321a4bc5aa5fe2ef8a921f6af8273d7fe7be6cfedb3f0aea6d7");
    1182                 :            : 
    1183                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1184                 :            : 
    1185                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1186                 :            :     {
    1187                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1188                 :            :     }
    1189                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA3_256_DIGEST_LEN) == 0);
    1190                 :            : 
    1191                 :            :     //vector 5
    1192                 :            :     for ( i = 0; i < 20; i++)
    1193                 :            :     {
    1194                 :            :         hmac_key[i] = 0x0c;
    1195                 :            :     }
    1196                 :            :     key_len = 20;
    1197                 :            :     strcpy(msg, "Test With Truncation");
    1198                 :            :     msg_len = 20;
    1199                 :            :     strcpy(expected_hmac5, "6e02c64537fb118057abb7fb66a23b3c");
    1200                 :            : 
    1201                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1202                 :            : 
    1203                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1204                 :            :     {
    1205                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1206                 :            :     }
    1207                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, 16) == 0); //test specifies truncated output
    1208                 :            : 
    1209                 :            :     //vector 6
    1210                 :            :     for ( i = 0; i < 131; i++)
    1211                 :            :     {
    1212                 :            :         hmac_key[i] = 0xaa;
    1213                 :            :     }
    1214                 :            :     key_len = 131;
    1215                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
    1216                 :            :     msg_len = 54;
    1217                 :            :     strcpy(expected_hmac6, "ed73a374b96c005235f948032f09674a58c0ce555cfc1f223b02356560312c3b");
    1218                 :            : 
    1219                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1220                 :            : 
    1221                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1222                 :            :     {
    1223                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1224                 :            :     }
    1225                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA3_256_DIGEST_LEN) == 0);
    1226                 :            : 
    1227                 :            :     //vector 6a
    1228                 :            :     for ( i = 0; i < 147; i++)
    1229                 :            :     {
    1230                 :            :         hmac_key[i] = 0xaa;
    1231                 :            :     }
    1232                 :            :     key_len = 147;
    1233                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
    1234                 :            :     msg_len = 54;
    1235                 :            :     strcpy(expected_hmac6a, "a6072f86de52b38bb349fe84cd6d97fb6a37c4c0f62aae93981193a7229d3467");
    1236                 :            : 
    1237                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1238                 :            : 
    1239                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1240                 :            :     {
    1241                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1242                 :            :     }
    1243                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6a, SHA3_256_DIGEST_LEN) == 0);
    1244                 :            : 
    1245                 :            :     //vector 7
    1246                 :            :     for ( i = 0; i < 131; i++)
    1247                 :            :     {
    1248                 :            :         hmac_key[i] = 0xaa;
    1249                 :            :     }
    1250                 :            :     key_len = 131;
    1251                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
    1252                 :            :     msg_len = strlen(msg);
    1253                 :            :     strcpy(expected_hmac7, "65c5b06d4c3de32a7aef8763261e49adb6e2293ec8e7c61e8de61701fc63e123");
    1254                 :            : 
    1255                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1256                 :            : 
    1257                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1258                 :            :     {
    1259                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1260                 :            :     }
    1261                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA3_256_DIGEST_LEN) == 0);
    1262                 :            : 
    1263                 :            :     //vector 7a
    1264                 :            :     for ( i = 0; i < 147; i++)
    1265                 :            :     {
    1266                 :            :         hmac_key[i] = 0xaa;
    1267                 :            :     }
    1268                 :            :     key_len = 147;
    1269                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
    1270                 :            :     msg_len = strlen(msg);
    1271                 :            :     strcpy(expected_hmac7a, "e6a36d9b915f86a093cac7d110e9e04cf1d6100d30475509c2475f571b758b5a");
    1272                 :            : 
    1273                 :            :     hmac_sha3_256(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1274                 :            : 
    1275                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
    1276                 :            :     {
    1277                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1278                 :            :     }
    1279                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7a, SHA3_256_DIGEST_LEN) == 0);
    1280                 :            : }
    1281                 :            : 
    1282                 :            : DECLARE_UTEST(test_hmac_sha3_512, "hmac_sha3_512 test vectors")
    1283                 :            : {
    1284                 :            :     char msg[1024] = {0};
    1285                 :            :     unsigned char hmac[1024] = {0};
    1286                 :            :     char hmac_txt[1024] = {0};
    1287                 :            :     char hmac_key[1024] = {0};
    1288                 :            :     char expected_hmac1[1024] = {0};
    1289                 :            :     char expected_hmac2[1024] = {0};
    1290                 :            :     char expected_hmac3[1024] = {0};
    1291                 :            :     char expected_hmac4[1024] = {0};
    1292                 :            :     char expected_hmac5[1024] = {0};
    1293                 :            :     char expected_hmac6[1024] = {0};
    1294                 :            :     char expected_hmac6a[1024] = {0};
    1295                 :            :     char expected_hmac7[1024] = {0};
    1296                 :            :     char expected_hmac7a[1024] = {0};
    1297                 :            :     int msg_len, key_len;
    1298                 :            :     int i = 0;
    1299                 :            : 
    1300                 :            :     //vector 1
    1301                 :            :     for ( i = 0; i < 20; i++)
    1302                 :            :     {
    1303                 :            :         hmac_key[i] = 0x0b;
    1304                 :            :     }
    1305                 :            :     key_len = 20;
    1306                 :            :     strcpy(msg, "Hi There");
    1307                 :            :     msg_len = 8;
    1308                 :            :     strcpy(expected_hmac1, "eb3fbd4b2eaab8f5c504bd3a41465aacec15770a7cabac531e482f860b5ec7ba47ccb2c6f2afce8f88d22b6dc61380f23a668fd3888bb80537c0a0b86407689e");
    1309                 :            : 
    1310                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1311                 :            : 
    1312                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1313                 :            :     {
    1314                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1315                 :            :     }
    1316                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac1, SHA3_512_DIGEST_LEN) == 0);
    1317                 :            : 
    1318                 :            :     //vector 2
    1319                 :            :     strcpy(hmac_key, "Jefe");
    1320                 :            :     key_len = 4;
    1321                 :            :     strcpy(msg, "what do ya want for nothing?");
    1322                 :            :     msg_len = 28;
    1323                 :            :     strcpy(expected_hmac2, "5a4bfeab6166427c7a3647b747292b8384537cdb89afb3bf5665e4c5e709350b287baec921fd7ca0ee7a0c31d022a95e1fc92ba9d77df883960275beb4e62024");
    1324                 :            : 
    1325                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1326                 :            : 
    1327                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1328                 :            :     {
    1329                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1330                 :            :     }
    1331                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac2, SHA3_512_DIGEST_LEN) == 0);
    1332                 :            : 
    1333                 :            :     //vector 3
    1334                 :            :     for ( i = 0; i < 20; i++)
    1335                 :            :     {
    1336                 :            :         hmac_key[i] = 0xaa;
    1337                 :            :     }
    1338                 :            :     key_len = 20;
    1339                 :            :     for ( i = 0; i < 50; i++)
    1340                 :            :     {
    1341                 :            :         msg[i] = 0xdd;
    1342                 :            :     }
    1343                 :            :     msg_len = 50;
    1344                 :            :     strcpy(expected_hmac3, "309e99f9ec075ec6c6d475eda1180687fcf1531195802a99b5677449a8625182851cb332afb6a89c411325fbcbcd42afcb7b6e5aab7ea42c660f97fd8584bf03");
    1345                 :            : 
    1346                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1347                 :            : 
    1348                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1349                 :            :     {
    1350                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1351                 :            :     }
    1352                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac3, SHA3_512_DIGEST_LEN) == 0);
    1353                 :            : 
    1354                 :            :     //vector 4
    1355                 :            :     strcpy(hmac_key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
    1356                 :            :     key_len = 25;
    1357                 :            :     for ( i = 0; i < 50; i++)
    1358                 :            :     {
    1359                 :            :         msg[i] = 0xcd;
    1360                 :            :     }
    1361                 :            :     msg_len = 50;
    1362                 :            :     strcpy(expected_hmac4, "b27eab1d6e8d87461c29f7f5739dd58e98aa35f8e823ad38c5492a2088fa0281993bbfff9a0e9c6bf121ae9ec9bb09d84a5ebac817182ea974673fb133ca0d1d");
    1363                 :            : 
    1364                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1365                 :            : 
    1366                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1367                 :            :     {
    1368                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1369                 :            :     }
    1370                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac4, SHA3_512_DIGEST_LEN) == 0);
    1371                 :            : 
    1372                 :            :     //vector 5
    1373                 :            :     for ( i = 0; i < 20; i++)
    1374                 :            :     {
    1375                 :            :         hmac_key[i] = 0x0c;
    1376                 :            :     }
    1377                 :            :     key_len = 20;
    1378                 :            :     strcpy(msg, "Test With Truncation");
    1379                 :            :     msg_len = 20;
    1380                 :            :     strcpy(expected_hmac5, "0fa7475948f43f48ca0516671e18978c");
    1381                 :            : 
    1382                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1383                 :            : 
    1384                 :            :     for ( i = 0; i < 16; i++)
    1385                 :            :     {
    1386                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1387                 :            :     }
    1388                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac5, 16) == 0); //test specifies truncated output
    1389                 :            : 
    1390                 :            :     //vector 6
    1391                 :            :     for ( i = 0; i < 131; i++)
    1392                 :            :     {
    1393                 :            :         hmac_key[i] = 0xaa;
    1394                 :            :     }
    1395                 :            :     key_len = 131;
    1396                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
    1397                 :            :     msg_len = 54;
    1398                 :            :     strcpy(expected_hmac6, "00f751a9e50695b090ed6911a4b65524951cdc15a73a5d58bb55215ea2cd839ac79d2b44a39bafab27e83fde9e11f6340b11d991b1b91bf2eee7fc872426c3a4");
    1399                 :            : 
    1400                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1401                 :            : 
    1402                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1403                 :            :     {
    1404                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1405                 :            :     }
    1406                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6, SHA3_512_DIGEST_LEN) == 0);
    1407                 :            : 
    1408                 :            :     //vector 6a
    1409                 :            :     for ( i = 0; i < 147; i++)
    1410                 :            :     {
    1411                 :            :         hmac_key[i] = 0xaa;
    1412                 :            :     }
    1413                 :            :     key_len = 147;
    1414                 :            :     strcpy(msg, "Test Using Larger Than Block-Size Key - Hash Key First");
    1415                 :            :     msg_len = 54;
    1416                 :            :     strcpy(expected_hmac6a, "b14835c819a290efb010ace6d8568dc6b84de60bc49b004c3b13eda763589451e5dd74292884d1bdce64e6b919dd61dc9c56a282a81c0bd14f1f365b49b83a5b");
    1417                 :            : 
    1418                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1419                 :            : 
    1420                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1421                 :            :     {
    1422                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1423                 :            :     }
    1424                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac6a, SHA3_512_DIGEST_LEN) == 0);
    1425                 :            : 
    1426                 :            :     //vector 7
    1427                 :            :     for ( i = 0; i < 131; i++)
    1428                 :            :     {
    1429                 :            :         hmac_key[i] = 0xaa;
    1430                 :            :     }
    1431                 :            :     key_len = 131;
    1432                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
    1433                 :            :     msg_len = strlen(msg);
    1434                 :            :     strcpy(expected_hmac7, "38a456a004bd10d32c9ab8336684112862c3db61adcca31829355eaf46fd5c73d06a1f0d13fec9a652fb3811b577b1b1d1b9789f97ae5b83c6f44dfcf1d67eba");
    1435                 :            : 
    1436                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1437                 :            : 
    1438                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1439                 :            :     {
    1440                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1441                 :            :     }
    1442                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7, SHA3_512_DIGEST_LEN) == 0);
    1443                 :            : 
    1444                 :            :     //vector 7a
    1445                 :            :     for ( i = 0; i < 147; i++)
    1446                 :            :     {
    1447                 :            :         hmac_key[i] = 0xaa;
    1448                 :            :     }
    1449                 :            :     key_len = 147;
    1450                 :            :     strcpy(msg, "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.");
    1451                 :            :     msg_len = strlen(msg);
    1452                 :            :     strcpy(expected_hmac7a, "dc030ee7887034f32cf402df34622f311f3e6cf04860c6bbd7fa488674782b4659fdbdf3fd877852885cfe6e22185fe7b2ee952043629bc9d5f3298a41d02c66");
    1453                 :            : 
    1454                 :            :     hmac_sha3_512(msg, msg_len, (unsigned char *)hmac, hmac_key, key_len);
    1455                 :            : 
    1456                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
    1457                 :            :     {
    1458                 :            :         sprintf(hmac_txt + (2 * i), "%02x", hmac[i]);
    1459                 :            :     }
    1460                 :            :     CU_ASSERT(memcmp(hmac_txt, expected_hmac7a, SHA3_512_DIGEST_LEN) == 0);
    1461                 :            : }
    1462                 :            : 
    1463                 :            : int register_ts_hmac_test(void)
    1464                 :            : {
    1465                 :            :     ts_init(&TEST_SUITE(hmac_test), TEST_SUITE_DESCR(hmac_test), NULL, NULL);
    1466                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_md5), UTEST_DESCR(test_hmac_md5));
    1467                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha1), UTEST_DESCR(test_hmac_sha1));
    1468                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha256), UTEST_DESCR(test_hmac_sha256));
    1469                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha384), UTEST_DESCR(test_hmac_sha384));
    1470                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha512), UTEST_DESCR(test_hmac_sha512));
    1471                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha3_256), UTEST_DESCR(test_hmac_sha3_256));
    1472                 :            :     ts_add_utest(&TEST_SUITE(hmac_test), UTEST_FCT(test_hmac_sha3_512), UTEST_DESCR(test_hmac_sha3_512));
    1473                 :            : 
    1474                 :            :     return register_ts(&TEST_SUITE(hmac_test));
    1475                 :            : }
    1476                 :            : 
    1477                 :            : #endif /* HAVE_C_UNIT_TESTS */ /* LCOV_EXCL_STOP */

Generated by: LCOV version 1.10