LCOV - code coverage report
Current view: top level - lib - digest.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 66 66 100.0 %
Date: 2016-06-07 Functions: 14 14 100.0 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /**
       2                 :            :  * \file    lib/digest.c
       3                 :            :  *
       4                 :            :  * \brief   Roll-up of the digests used by fwknop.
       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                 :            : #include "fko_common.h"
      30                 :            : #include "digest.h"
      31                 :            : #include "base64.h"
      32                 :            : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
      33                 :            : DECLARE_TEST_SUITE(digest_test, "digest functions test suite");
      34                 :            : #endif /* LCOV_EXCL_STOP */
      35                 :            : /* Compute MD5 hash on in and store result in out.
      36                 :            : */
      37                 :            : void
      38                 :    4056456 : md5(unsigned char *out, unsigned char *in, size_t size)
      39                 :            : {
      40                 :            :     MD5Context ctx;
      41                 :            : 
      42                 :    4056456 :     MD5Init(&ctx);
      43                 :    4056456 :     MD5Update(&ctx, (unsigned char*)in, size);
      44                 :    4056456 :     MD5Final(out, &ctx);
      45                 :    4056456 : }
      46                 :            : 
      47                 :            : /* Compute MD5 hash on in and store the base64 string result in out.
      48                 :            : */
      49                 :            : void
      50                 :         76 : md5_base64(char *out, unsigned char *in, size_t size)
      51                 :            : {
      52                 :            :     uint8_t      md[MD5_DIGEST_LEN];
      53                 :            : 
      54                 :         76 :     md5(md, in, size);
      55                 :         76 :     b64_encode(md, out, MD5_DIGEST_LEN);
      56                 :            : 
      57                 :         76 :     strip_b64_eq(out);
      58                 :         76 : }
      59                 :            : 
      60                 :            : /* Compute SHA1 hash on in and store result in out.
      61                 :            : */
      62                 :            : void
      63                 :        299 : sha1(unsigned char *out, unsigned char *in, size_t size)
      64                 :            : {
      65                 :            :     SHA1_INFO    sha1_info;
      66                 :            : 
      67                 :        299 :     sha1_init(&sha1_info);
      68                 :        299 :     sha1_update(&sha1_info, (uint8_t*)in, size);
      69                 :        299 :     sha1_final(out, &sha1_info);
      70                 :        299 : }
      71                 :            : 
      72                 :            : /* Compute SHA1 hash on in and store the base64 string result in out.
      73                 :            : */
      74                 :            : void
      75                 :         98 : sha1_base64(char *out, unsigned char *in, size_t size)
      76                 :            : {
      77                 :            :     uint8_t       md[SHA1_DIGEST_LEN];
      78                 :            : 
      79                 :         98 :     sha1(md, in, size);
      80                 :         98 :     b64_encode(md, out, SHA1_DIGEST_LEN);
      81                 :            : 
      82                 :         98 :     strip_b64_eq(out);
      83                 :         98 : }
      84                 :            : 
      85                 :            : /* Compute SHA256 hash on in and store the hex string result in out.
      86                 :            : */
      87                 :            : void
      88                 :    6231104 : sha256(unsigned char *out, unsigned char *in, size_t size)
      89                 :            : {
      90                 :            :     SHA256_CTX    sha256_ctx;
      91                 :            : 
      92                 :    6231104 :     SHA256_Init(&sha256_ctx);
      93                 :    6231104 :     SHA256_Update(&sha256_ctx, (const uint8_t*)in, size);
      94                 :    6231104 :     SHA256_Final(out, &sha256_ctx);
      95                 :    6231104 : }
      96                 :            : 
      97                 :            : /* Compute SHA256 hash on in and store the base64 string result in out.
      98                 :            : */
      99                 :            : void
     100                 :    1682380 : sha256_base64(char *out, unsigned char *in, size_t size)
     101                 :            : {
     102                 :            :     uint8_t       md[SHA256_DIGEST_LEN];
     103                 :            : 
     104                 :    1682380 :     sha256(md, in, size);
     105                 :    1682380 :     b64_encode(md, out, SHA256_DIGEST_LEN);
     106                 :            : 
     107                 :    1682380 :     strip_b64_eq(out);
     108                 :    1682380 : }
     109                 :            : 
     110                 :            : /* Compute SHA384 hash on in and store the hex string result in out.
     111                 :            : */
     112                 :            : void
     113                 :        196 : sha384(unsigned char *out, unsigned char *in, size_t size)
     114                 :            : {
     115                 :            :     SHA384_CTX    sha384_ctx;
     116                 :            : 
     117                 :        196 :     SHA384_Init(&sha384_ctx);
     118                 :        196 :     SHA384_Update(&sha384_ctx, (const uint8_t*)in, size);
     119                 :        196 :     SHA384_Final(out, &sha384_ctx);
     120                 :        196 : }
     121                 :            : 
     122                 :            : /* Compute SHA384 hash on in and store the base64 string result in out.
     123                 :            : */
     124                 :            : void
     125                 :         74 : sha384_base64(char *out, unsigned char *in, size_t size)
     126                 :            : {
     127                 :            :     uint8_t       md[SHA384_DIGEST_LEN];
     128                 :            : 
     129                 :         74 :     sha384(md, in, size);
     130                 :         74 :     b64_encode(md, out, SHA384_DIGEST_LEN);
     131                 :            : 
     132                 :         74 :     strip_b64_eq(out);
     133                 :         74 : }
     134                 :            : 
     135                 :            : /* Compute SHA512 hash on in and store the hex string result in out.
     136                 :            : */
     137                 :            : void
     138                 :        251 : sha512(unsigned char *out, unsigned char *in, size_t size)
     139                 :            : {
     140                 :            :     SHA512_CTX    sha512_ctx;
     141                 :            : 
     142                 :        251 :     SHA512_Init(&sha512_ctx);
     143                 :        251 :     SHA512_Update(&sha512_ctx, (const uint8_t*)in, size);
     144                 :        251 :     SHA512_Final(out, &sha512_ctx);
     145                 :        251 : }
     146                 :            : 
     147                 :            : /* Compute SHA512 hash on in and store the base64 string result in out.
     148                 :            : */
     149                 :            : void
     150                 :        117 : sha512_base64(char *out, unsigned char *in, size_t size)
     151                 :            : {
     152                 :            :     uint8_t       md[SHA512_DIGEST_LEN];
     153                 :            : 
     154                 :        117 :     sha512(md, in, size);
     155                 :        117 :     b64_encode(md, out, SHA512_DIGEST_LEN);
     156                 :            : 
     157                 :        117 :     strip_b64_eq(out);
     158                 :        117 : }
     159                 :            : 
     160                 :            : void
     161                 :          4 : sha3_256(unsigned char *out, unsigned char *in, size_t size)
     162                 :            : {
     163                 :          4 :     FIPS202_SHA3_256(in, size, out);
     164                 :          4 : }
     165                 :            : 
     166                 :            : void
     167                 :       7175 : sha3_256_base64(char *out, unsigned char *in, size_t size)
     168                 :            : {
     169                 :            :     uint8_t      md[SHA3_256_DIGEST_LEN];
     170                 :            : 
     171                 :       7175 :     FIPS202_SHA3_256(in, size, md);
     172                 :       7175 :     b64_encode(md, out, SHA3_256_DIGEST_LEN);
     173                 :            : 
     174                 :       7175 :     strip_b64_eq(out);
     175                 :            : 
     176                 :       7175 : }
     177                 :            : void
     178                 :          4 : sha3_512(unsigned char *out, unsigned char *in, size_t size)
     179                 :            : {
     180                 :          4 :     FIPS202_SHA3_512(in, size, out);
     181                 :          4 : }
     182                 :            : 
     183                 :            : void
     184                 :         78 : sha3_512_base64(char *out, unsigned char *in, size_t size)
     185                 :            : {
     186                 :            :     uint8_t      md[SHA3_512_DIGEST_LEN];
     187                 :            : 
     188                 :         78 :     FIPS202_SHA3_512(in, size, md);
     189                 :         78 :     b64_encode(md, out, SHA3_512_DIGEST_LEN);
     190                 :            : 
     191                 :         78 :     strip_b64_eq(out);
     192                 :            : 
     193                 :         78 : }
     194                 :            : 
     195                 :            : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
     196                 :            : 
     197                 :            : DECLARE_UTEST(test_md5, "md5 test vectors") //https://tools.ietf.org/html/rfc1321.html
     198                 :            : {
     199                 :            :     char msg[1024] = {0};
     200                 :            :     unsigned char digest[1024] = {0};
     201                 :            :     char digest_txt[1024] = {0};
     202                 :            :     char expected_digest1[1024] = {0};
     203                 :            :     char expected_digest2[1024] = {0};
     204                 :            :     char expected_digest3[1024] = {0};
     205                 :            :     char expected_digest4[1024] = {0};
     206                 :            :     char expected_digest5[1024] = {0};
     207                 :            :     char expected_digest6[1024] = {0};
     208                 :            :     char expected_digest7[1024] = {0};
     209                 :            :     int i = 0;
     210                 :            : 
     211                 :            :     strcpy(expected_digest1, "d41d8cd98f00b204e9800998ecf8427e");
     212                 :            :     strcpy(expected_digest2, "0cc175b9c0f1b6a831c399e269772661");
     213                 :            :     strcpy(expected_digest3, "900150983cd24fb0d6963f7d28e17f72");
     214                 :            :     strcpy(expected_digest4, "f96b697d7cb7938d525a2f31aaf161d0");
     215                 :            :     strcpy(expected_digest5, "c3fcd3d76192e4007dfb496cca67e13b");
     216                 :            :     strcpy(expected_digest6, "d174ab98d277d9f5a5611c2c9f419d9f");
     217                 :            :     strcpy(expected_digest7, "57edf4a22be3c955ac49da2e2107b67a");
     218                 :            : 
     219                 :            :     strcpy(msg, "");
     220                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     221                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     222                 :            :     {
     223                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     224                 :            :     }
     225                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, MD5_DIGEST_LEN) == 0);
     226                 :            : 
     227                 :            :     strcpy(msg, "a");
     228                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     229                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     230                 :            :     {
     231                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     232                 :            :     }
     233                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, MD5_DIGEST_LEN) == 0);
     234                 :            : 
     235                 :            :     strcpy(msg, "abc");
     236                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     237                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     238                 :            :     {
     239                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     240                 :            :     }
     241                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, MD5_DIGEST_LEN) == 0);
     242                 :            : 
     243                 :            :     strcpy(msg, "message digest");
     244                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     245                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     246                 :            :     {
     247                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     248                 :            :     }
     249                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, MD5_DIGEST_LEN) == 0);
     250                 :            :     strcpy(msg, "abcdefghijklmnopqrstuvwxyz");
     251                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     252                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     253                 :            :     {
     254                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     255                 :            :     }
     256                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest5, MD5_DIGEST_LEN) == 0);
     257                 :            :     strcpy(msg, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
     258                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     259                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     260                 :            :     {
     261                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     262                 :            :     }
     263                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest6, MD5_DIGEST_LEN) == 0);
     264                 :            :     strcpy(msg, "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
     265                 :            :     md5(digest, (unsigned char *)msg, strlen(msg));
     266                 :            :     for ( i = 0; i < MD5_DIGEST_LEN; i++)
     267                 :            :     {
     268                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     269                 :            :     }
     270                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest7, MD5_DIGEST_LEN) == 0);
     271                 :            : 
     272                 :            : }
     273                 :            : 
     274                 :            : DECLARE_UTEST(test_sha1, "sha1 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     275                 :            : {
     276                 :            :     char msg[1024] = {0};
     277                 :            :     unsigned char digest[1024] = {0};
     278                 :            :     char digest_txt[1024] = {0};
     279                 :            :     char expected_digest1[1024] = {0};
     280                 :            :     char expected_digest2[1024] = {0};
     281                 :            :     char expected_digest3[1024] = {0};
     282                 :            :     char expected_digest4[1024] = {0};
     283                 :            :     int i = 0;
     284                 :            : 
     285                 :            :     strcpy(msg, "abc");
     286                 :            :     strcpy(expected_digest1, "a9993e364706816aba3e25717850c26c9cd0d89d");
     287                 :            :     sha1(digest, (unsigned char *)msg, strlen(msg));
     288                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     289                 :            :     {
     290                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     291                 :            :     }
     292                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA1_DIGEST_LEN) == 0);
     293                 :            : 
     294                 :            :     strcpy(msg, "");
     295                 :            :     strcpy(expected_digest2, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
     296                 :            :     sha1(digest, (unsigned char *)msg, strlen(msg));
     297                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     298                 :            :     {
     299                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     300                 :            :     }
     301                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA1_DIGEST_LEN) == 0);
     302                 :            : 
     303                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     304                 :            :     strcpy(expected_digest3, "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
     305                 :            :     sha1(digest, (unsigned char *)msg, strlen(msg));
     306                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     307                 :            :     {
     308                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     309                 :            :     }
     310                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA1_DIGEST_LEN) == 0);
     311                 :            : 
     312                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     313                 :            :     strcpy(expected_digest4, "a49b2446a02c645bf419f995b67091253a04a259");
     314                 :            :     sha1(digest, (unsigned char *)msg, strlen(msg));
     315                 :            :     for ( i = 0; i < SHA1_DIGEST_LEN; i++)
     316                 :            :     {
     317                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     318                 :            :     }
     319                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA1_DIGEST_LEN) == 0);
     320                 :            : 
     321                 :            : }
     322                 :            : DECLARE_UTEST(test_sha256, "sha-256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     323                 :            : {
     324                 :            :     char msg[1024] = {0};
     325                 :            :     unsigned char digest[1024] = {0};
     326                 :            :     char digest_txt[1024] = {0};
     327                 :            :     char expected_digest1[1024] = {0};
     328                 :            :     char expected_digest2[1024] = {0};
     329                 :            :     char expected_digest3[1024] = {0};
     330                 :            :     char expected_digest4[1024] = {0};
     331                 :            :     int i = 0;
     332                 :            : 
     333                 :            :     strcpy(msg, "abc");
     334                 :            :     strcpy(expected_digest1, "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
     335                 :            :     sha256(digest, (unsigned char *)msg, strlen(msg));
     336                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     337                 :            :     {
     338                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     339                 :            :     }
     340                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA256_DIGEST_LEN) == 0);
     341                 :            : 
     342                 :            :     strcpy(msg, "");
     343                 :            :     strcpy(expected_digest2, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
     344                 :            :     sha256(digest, (unsigned char *)msg, strlen(msg));
     345                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     346                 :            :     {
     347                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     348                 :            :     }
     349                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA256_DIGEST_LEN) == 0);
     350                 :            : 
     351                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     352                 :            :     strcpy(expected_digest3, "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
     353                 :            :     sha256(digest, (unsigned char *)msg, strlen(msg));
     354                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     355                 :            :     {
     356                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     357                 :            :     }
     358                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA256_DIGEST_LEN) == 0);
     359                 :            : 
     360                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     361                 :            :     strcpy(expected_digest4, "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1");
     362                 :            :     sha256(digest, (unsigned char *)msg, strlen(msg));
     363                 :            :     for ( i = 0; i < SHA256_DIGEST_LEN; i++)
     364                 :            :     {
     365                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     366                 :            :     }
     367                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA256_DIGEST_LEN) == 0);
     368                 :            : }
     369                 :            : DECLARE_UTEST(test_sha384, "sha-384 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     370                 :            : {
     371                 :            :     char msg[1024] = {0};
     372                 :            :     unsigned char digest[1024] = {0};
     373                 :            :     char digest_txt[1024] = {0};
     374                 :            :     char expected_digest1[1024] = {0};
     375                 :            :     char expected_digest2[1024] = {0};
     376                 :            :     char expected_digest3[1024] = {0};
     377                 :            :     char expected_digest4[1024] = {0};
     378                 :            :     int i = 0;
     379                 :            : 
     380                 :            :     strcpy(msg, "abc");
     381                 :            :     strcpy(expected_digest1, "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7");
     382                 :            :     sha384(digest, (unsigned char *)msg, strlen(msg));
     383                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     384                 :            :     {
     385                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     386                 :            :     }
     387                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA384_DIGEST_LEN) == 0);
     388                 :            : 
     389                 :            :     strcpy(msg, "");
     390                 :            :     strcpy(expected_digest2, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
     391                 :            :     sha384(digest, (unsigned char *)msg, strlen(msg));
     392                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     393                 :            :     {
     394                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     395                 :            :     }
     396                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA384_DIGEST_LEN) == 0);
     397                 :            : 
     398                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     399                 :            :     strcpy(expected_digest3, "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b");
     400                 :            :     sha384(digest, (unsigned char *)msg, strlen(msg));
     401                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     402                 :            :     {
     403                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     404                 :            :     }
     405                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA384_DIGEST_LEN) == 0);
     406                 :            : 
     407                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     408                 :            :     strcpy(expected_digest4, "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039");
     409                 :            :     sha384(digest, (unsigned char *)msg, strlen(msg));
     410                 :            :     for ( i = 0; i < SHA384_DIGEST_LEN; i++)
     411                 :            :     {
     412                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     413                 :            :     }
     414                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA384_DIGEST_LEN) == 0);
     415                 :            : 
     416                 :            : }
     417                 :            : DECLARE_UTEST(test_sha512, "sha-512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     418                 :            : {
     419                 :            :     char msg[1024] = {0};
     420                 :            :     unsigned char digest[1024] = {0};
     421                 :            :     char digest_txt[1024] = {0};
     422                 :            :     char expected_digest1[1024] = {0};
     423                 :            :     char expected_digest2[1024] = {0};
     424                 :            :     char expected_digest3[1024] = {0};
     425                 :            :     char expected_digest4[1024] = {0};
     426                 :            :     int i = 0;
     427                 :            : 
     428                 :            :     strcpy(msg, "abc");
     429                 :            :     strcpy(expected_digest1, "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
     430                 :            :     sha512(digest, (unsigned char *)msg, strlen(msg));
     431                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
     432                 :            :     {
     433                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     434                 :            :     }
     435                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA512_DIGEST_LEN) == 0);
     436                 :            : 
     437                 :            :     strcpy(msg, "");
     438                 :            :     strcpy(expected_digest2, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
     439                 :            :     sha512(digest, (unsigned char *)msg, strlen(msg));
     440                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
     441                 :            :     {
     442                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     443                 :            :     }
     444                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA512_DIGEST_LEN) == 0);
     445                 :            : 
     446                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     447                 :            :     strcpy(expected_digest3, "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445");
     448                 :            :     sha512(digest, (unsigned char *)msg, strlen(msg));
     449                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
     450                 :            :     {
     451                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     452                 :            :     }
     453                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA512_DIGEST_LEN) == 0);
     454                 :            : 
     455                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     456                 :            :     strcpy(expected_digest4, "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909");
     457                 :            :     sha512(digest, (unsigned char *)msg, strlen(msg));
     458                 :            :     for ( i = 0; i < SHA512_DIGEST_LEN; i++)
     459                 :            :     {
     460                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     461                 :            :     }
     462                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA512_DIGEST_LEN) == 0);
     463                 :            : 
     464                 :            : }
     465                 :            : 
     466                 :            : DECLARE_UTEST(test_sha3_256, "sha3_256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     467                 :            : {
     468                 :            :     char msg[1024] = {0};
     469                 :            :     unsigned char digest[1024] = {0};
     470                 :            :     char digest_txt[1024] = {0};
     471                 :            :     char expected_digest1[1024] = {0};
     472                 :            :     char expected_digest2[1024] = {0};
     473                 :            :     char expected_digest3[1024] = {0};
     474                 :            :     char expected_digest4[1024] = {0};
     475                 :            :     int i = 0;
     476                 :            : 
     477                 :            :     strcpy(msg, "abc");
     478                 :            :     strcpy(expected_digest1, "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532");
     479                 :            :     sha3_256(digest, (unsigned char *)msg, strlen(msg));
     480                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     481                 :            :     {
     482                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     483                 :            :     }
     484                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_256_DIGEST_LEN) == 0);
     485                 :            : 
     486                 :            :     strcpy(msg, "");
     487                 :            :     strcpy(expected_digest2, "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a");
     488                 :            :     sha3_256(digest, (unsigned char *)msg, strlen(msg));
     489                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     490                 :            :     {
     491                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     492                 :            :     }
     493                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_256_DIGEST_LEN) == 0);
     494                 :            : 
     495                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     496                 :            :     strcpy(expected_digest3, "41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376");
     497                 :            :     sha3_256(digest, (unsigned char *)msg, strlen(msg));
     498                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     499                 :            :     {
     500                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     501                 :            :     }
     502                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_256_DIGEST_LEN) == 0);
     503                 :            : 
     504                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     505                 :            :     strcpy(expected_digest4, "916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18");
     506                 :            :     sha3_256(digest, (unsigned char *)msg, strlen(msg));
     507                 :            :     for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
     508                 :            :     {
     509                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     510                 :            :     }
     511                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_256_DIGEST_LEN) == 0);
     512                 :            : 
     513                 :            : }
     514                 :            : 
     515                 :            : DECLARE_UTEST(test_sha3_512, "sha3_512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
     516                 :            : {
     517                 :            :     char msg[1024] = {0};
     518                 :            :     unsigned char digest[1024] = {0};
     519                 :            :     char digest_txt[1024] = {0};
     520                 :            :     char expected_digest1[1024] = {0};
     521                 :            :     char expected_digest2[1024] = {0};
     522                 :            :     char expected_digest3[1024] = {0};
     523                 :            :     char expected_digest4[1024] = {0};
     524                 :            :     int i = 0;
     525                 :            : 
     526                 :            :     strcpy(msg, "abc");
     527                 :            :     strcpy(expected_digest1, "b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0");
     528                 :            :     sha3_512(digest, (unsigned char *)msg, strlen(msg));
     529                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
     530                 :            :     {
     531                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     532                 :            :     }
     533                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_512_DIGEST_LEN) == 0);
     534                 :            : 
     535                 :            :     strcpy(msg, "");
     536                 :            :     strcpy(expected_digest2, "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26");
     537                 :            :     sha3_512(digest, (unsigned char *)msg, strlen(msg));
     538                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
     539                 :            :     {
     540                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     541                 :            :     }
     542                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_512_DIGEST_LEN) == 0);
     543                 :            : 
     544                 :            :     strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
     545                 :            :     strcpy(expected_digest3, "04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e");
     546                 :            :     sha3_512(digest, (unsigned char *)msg, strlen(msg));
     547                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
     548                 :            :     {
     549                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     550                 :            :     }
     551                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_512_DIGEST_LEN) == 0);
     552                 :            : 
     553                 :            :     strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
     554                 :            :     strcpy(expected_digest4, "afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185");
     555                 :            :     sha3_512(digest, (unsigned char *)msg, strlen(msg));
     556                 :            :     for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
     557                 :            :     {
     558                 :            :         sprintf(digest_txt + (2 * i), "%02x", digest[i]);
     559                 :            :     }
     560                 :            :     CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_512_DIGEST_LEN) == 0);
     561                 :            : 
     562                 :            : }
     563                 :            : 
     564                 :            : int register_ts_digest_test(void)
     565                 :            : {
     566                 :            :     ts_init(&TEST_SUITE(digest_test), TEST_SUITE_DESCR(digest_test), NULL, NULL);
     567                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_md5), UTEST_DESCR(test_md5));
     568                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha1), UTEST_DESCR(test_sha1));
     569                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha256), UTEST_DESCR(test_sha256));
     570                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha384), UTEST_DESCR(test_sha384));
     571                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha512), UTEST_DESCR(test_sha512));
     572                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_256), UTEST_DESCR(test_sha3_256));
     573                 :            :     ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_512), UTEST_DESCR(test_sha3_512));
     574                 :            : 
     575                 :            :     return register_ts(&TEST_SUITE(digest_test));
     576                 :            : }
     577                 :            : 
     578                 :            : #endif /* HAVE_C_UNIT_TESTS */ /* LCOV_EXCL_STOP */
     579                 :            : /***EOF***/

Generated by: LCOV version 1.10