LCOV - code coverage report
Current view: top level - third_party/heimdal/lib/hcrypto - validate.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 47 58 81.0 %
Date: 2024-04-21 15:09:00 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2010 Kungliga Tekniska Högskolan
       3             :  * (Royal Institute of Technology, Stockholm, Sweden).
       4             :  * All rights reserved.
       5             :  *
       6             :  * Redistribution and use in source and binary forms, with or without
       7             :  * modification, are permitted provided that the following conditions
       8             :  * are met:
       9             :  *
      10             :  * 1. Redistributions of source code must retain the above copyright
      11             :  *    notice, this list of conditions and the following disclaimer.
      12             :  *
      13             :  * 2. Redistributions in binary form must reproduce the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer in the
      15             :  *    documentation and/or other materials provided with the distribution.
      16             :  *
      17             :  * 3. Neither the name of the Institute nor the names of its contributors
      18             :  *    may be used to endorse or promote products derived from this software
      19             :  *    without specific prior written permission.
      20             :  *
      21             :  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
      22             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
      25             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31             :  * SUCH DAMAGE.
      32             :  */
      33             : 
      34             : #include <config.h>
      35             : #include <roken.h>
      36             : 
      37             : #include <evp.h>
      38             : #include <hmac.h>
      39             : #include <err.h>
      40             : 
      41             : struct tests {
      42             :     const EVP_CIPHER *(*cipher)(void);
      43             :     const char *name;
      44             :     void *key;
      45             :     size_t keysize;
      46             :     void *iv;
      47             :     size_t datasize;
      48             :     void *indata;
      49             :     void *outdata;
      50             :     void *outiv;
      51             : };
      52             : 
      53             : static struct tests hc_tests[] = {
      54             :     {
      55             :         EVP_aes_256_cbc,
      56             :         "aes-256",
      57             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
      58             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      59             :         32,
      60             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      61             :         16,
      62             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      63             :         "\xdc\x95\xc0\x78\xa2\x40\x89\x89\xad\x48\xa2\x14\x92\x84\x20\x87",
      64             :         NULL
      65             :     },
      66             : #if 0
      67             :     {
      68             :         EVP_aes_128_cfb8,
      69             :         "aes-cfb8-128",
      70             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      71             :         16,
      72             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      73             :         16,
      74             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      75             :         "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b\x88\x4c\xfa\x59\xca\x34\x2b\x2e"
      76             :     },
      77             : #endif
      78             :     {
      79             :         EVP_des_ede3_cbc,
      80             :         "des-ede3",
      81             :         "\x19\x17\xff\xe6\xbb\x77\x2e\xfc"
      82             :         "\x29\x76\x43\xbc\x63\x56\x7e\x9a"
      83             :         "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58",
      84             :         24,
      85             :         "\xbf\x9a\x12\xb7\x26\x69\xfd\x05",
      86             :         16,
      87             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      88             :         "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b",
      89             :         NULL
      90             :     },
      91             : #if 0
      92             :     {
      93             :         EVP_camellia_128_cbc,
      94             :         "camellia128",
      95             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      96             :         16,
      97             :         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
      98             :         16,
      99             :         "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
     100             :         "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C",
     101             :         NULL
     102             :     },
     103             : #endif
     104             :     {
     105             :         EVP_rc4,
     106             :         "rc4 8",
     107             :         "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
     108             :         8,
     109             :         NULL,
     110             :         8,
     111             :         "\x00\x00\x00\x00\x00\x00\x00\x00",
     112             :         "\x74\x94\xC2\xE7\x10\x4B\x08\x79",
     113             :         NULL
     114             :     },
     115             :     {
     116             :         EVP_rc4,
     117             :         "rc4 5",
     118             :         "\x61\x8a\x63\xd2\xfb",
     119             :         5,
     120             :         NULL,
     121             :         5,
     122             :         "\xdc\xee\x4c\xf9\x2c",
     123             :         "\xf1\x38\x29\xc9\xde",
     124             :         NULL
     125             :     },
     126             :     {
     127             :         EVP_rc4,
     128             :         "rc4 309",
     129             :         "\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9",
     130             :         16,
     131             :         NULL,
     132             :         309,
     133             :         "\x52\x75\x69\x73\x6c\x69\x6e\x6e"
     134             :         "\x75\x6e\x20\x6c\x61\x75\x6c\x75"
     135             :         "\x20\x6b\x6f\x72\x76\x69\x73\x73"
     136             :         "\x73\x61\x6e\x69\x2c\x20\x74\xe4"
     137             :         "\x68\x6b\xe4\x70\xe4\x69\x64\x65"
     138             :         "\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4"
     139             :         "\x20\x74\xe4\x79\x73\x69\x6b\x75"
     140             :         "\x75\x2e\x20\x4b\x65\x73\xe4\x79"
     141             :         "\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e"
     142             :         "\x6e\x69\x20\x6f\x6d\x61\x6e\x61"
     143             :         "\x6e\x69\x2c\x20\x6b\x61\x73\x6b"
     144             :         "\x69\x73\x61\x76\x75\x75\x6e\x20"
     145             :         "\x6c\x61\x61\x6b\x73\x6f\x74\x20"
     146             :         "\x76\x65\x72\x68\x6f\x75\x75\x2e"
     147             :         "\x20\x45\x6e\x20\x6d\x61\x20\x69"
     148             :         "\x6c\x6f\x69\x74\x73\x65\x2c\x20"
     149             :         "\x73\x75\x72\x65\x20\x68\x75\x6f"
     150             :         "\x6b\x61\x61\x2c\x20\x6d\x75\x74"
     151             :         "\x74\x61\x20\x6d\x65\x74\x73\xe4"
     152             :         "\x6e\x20\x74\x75\x6d\x6d\x75\x75"
     153             :         "\x73\x20\x6d\x75\x6c\x6c\x65\x20"
     154             :         "\x74\x75\x6f\x6b\x61\x61\x2e\x20"
     155             :         "\x50\x75\x75\x6e\x74\x6f\x20\x70"
     156             :         "\x69\x6c\x76\x65\x6e\x2c\x20\x6d"
     157             :         "\x69\x20\x68\x75\x6b\x6b\x75\x75"
     158             :         "\x2c\x20\x73\x69\x69\x6e\x74\x6f"
     159             :         "\x20\x76\x61\x72\x61\x6e\x20\x74"
     160             :         "\x75\x75\x6c\x69\x73\x65\x6e\x2c"
     161             :         "\x20\x6d\x69\x20\x6e\x75\x6b\x6b"
     162             :         "\x75\x75\x2e\x20\x54\x75\x6f\x6b"
     163             :         "\x73\x75\x74\x20\x76\x61\x6e\x61"
     164             :         "\x6d\x6f\x6e\x20\x6a\x61\x20\x76"
     165             :         "\x61\x72\x6a\x6f\x74\x20\x76\x65"
     166             :         "\x65\x6e\x2c\x20\x6e\x69\x69\x73"
     167             :         "\x74\xe4\x20\x73\x79\x64\xe4\x6d"
     168             :         "\x65\x6e\x69\x20\x6c\x61\x75\x6c"
     169             :         "\x75\x6e\x20\x74\x65\x65\x6e\x2e"
     170             :         "\x20\x2d\x20\x45\x69\x6e\x6f\x20"
     171             :         "\x4c\x65\x69\x6e\x6f",
     172             :         "\x35\x81\x86\x99\x90\x01\xe6\xb5"
     173             :         "\xda\xf0\x5e\xce\xeb\x7e\xee\x21"
     174             :         "\xe0\x68\x9c\x1f\x00\xee\xa8\x1f"
     175             :         "\x7d\xd2\xca\xae\xe1\xd2\x76\x3e"
     176             :         "\x68\xaf\x0e\xad\x33\xd6\x6c\x26"
     177             :         "\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c"
     178             :         "\x5f\x5e\x0b\x86\xa5\x92\x79\xe4"
     179             :         "\xf8\x24\xe7\xa6\x40\xbd\x22\x32"
     180             :         "\x10\xb0\xa6\x11\x60\xb7\xbc\xe9"
     181             :         "\x86\xea\x65\x68\x80\x03\x59\x6b"
     182             :         "\x63\x0a\x6b\x90\xf8\xe0\xca\xf6"
     183             :         "\x91\x2a\x98\xeb\x87\x21\x76\xe8"
     184             :         "\x3c\x20\x2c\xaa\x64\x16\x6d\x2c"
     185             :         "\xce\x57\xff\x1b\xca\x57\xb2\x13"
     186             :         "\xf0\xed\x1a\xa7\x2f\xb8\xea\x52"
     187             :         "\xb0\xbe\x01\xcd\x1e\x41\x28\x67"
     188             :         "\x72\x0b\x32\x6e\xb3\x89\xd0\x11"
     189             :         "\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8"
     190             :         "\x58\x9d\xbc\xe3\xc6\x66\xf5\xea"
     191             :         "\x8d\x4c\x79\x54\xc5\x0c\x3f\x34"
     192             :         "\x0b\x04\x67\xf8\x1b\x42\x59\x61"
     193             :         "\xc1\x18\x43\x07\x4d\xf6\x20\xf2"
     194             :         "\x08\x40\x4b\x39\x4c\xf9\xd3\x7f"
     195             :         "\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d"
     196             :         "\xa3\xc5\x61\xdf\xa7\x28\x1f\x96"
     197             :         "\x44\x63\xd2\xcc\x35\xa4\xd1\xb0"
     198             :         "\x34\x90\xde\xc5\x1b\x07\x11\xfb"
     199             :         "\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c"
     200             :         "\x76\x66\x22\xa6\x6d\xe9\x2b\xe9"
     201             :         "\x96\x46\x1d\x5e\x4d\xc8\x78\xef"
     202             :         "\x9b\xca\x03\x05\x21\xe8\x35\x1e"
     203             :         "\x4b\xae\xd2\xfd\x04\xf9\x46\x73"
     204             :         "\x68\xc4\xad\x6a\xc1\x86\xd0\x82"
     205             :         "\x45\xb2\x63\xa2\x66\x6d\x1f\x6c"
     206             :         "\x54\x20\xf1\x59\x9d\xfd\x9f\x43"
     207             :         "\x89\x21\xc2\xf5\xa4\x63\x93\x8c"
     208             :         "\xe0\x98\x22\x65\xee\xf7\x01\x79"
     209             :         "\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1"
     210             :         "\xaf\x5f\x6a\x54\x7f",
     211             :         NULL
     212             :     }
     213             : };
     214             : 
     215             : static int
     216       74495 : test_cipher(struct tests *t)
     217             : {
     218       74495 :     const EVP_CIPHER *c = t->cipher();
     219        3775 :     EVP_CIPHER_CTX ectx;
     220        3775 :     EVP_CIPHER_CTX dctx;
     221        3775 :     void *d;
     222             : 
     223       74495 :     EVP_CIPHER_CTX_init(&ectx);
     224       74495 :     EVP_CIPHER_CTX_init(&dctx);
     225             : 
     226       74495 :     if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1)
     227           0 :         errx(1, "%s: EVP_CipherInit_ex einit", t->name);
     228       74495 :     if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1)
     229           0 :         errx(1, "%s: EVP_CipherInit_ex dinit", t->name);
     230             : 
     231       74495 :     EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize);
     232       74495 :     EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize);
     233             : 
     234       74495 :     if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1)
     235           0 :         errx(1, "%s: EVP_CipherInit_ex encrypt", t->name);
     236       74495 :     if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1)
     237           0 :         errx(1, "%s: EVP_CipherInit_ex decrypt", t->name);
     238             : 
     239       74495 :     d = emalloc(t->datasize);
     240             : 
     241       74495 :     if (!EVP_Cipher(&ectx, d, t->indata, t->datasize))
     242           0 :         return 1;
     243             : 
     244       74495 :     if (memcmp(d, t->outdata, t->datasize) != 0)
     245           0 :         errx(1, "%s: encrypt not the same", t->name);
     246             : 
     247       74495 :     if (!EVP_Cipher(&dctx, d, d, t->datasize))
     248           0 :         return 1;
     249             : 
     250       74495 :     if (memcmp(d, t->indata, t->datasize) != 0)
     251           0 :         errx(1, "%s: decrypt not the same", t->name);
     252             : 
     253             : #if 0
     254             :     if (t->outiv)
     255             :         /* XXXX check  */;
     256             : #endif
     257             : 
     258       74495 :     EVP_CIPHER_CTX_cleanup(&ectx);
     259       74495 :     EVP_CIPHER_CTX_cleanup(&dctx);
     260       74495 :     free(d);
     261             : 
     262       74495 :     return 0;
     263             : }
     264             : 
     265             : static void
     266       14899 : check_hmac(void)
     267             : {
     268       14899 :     unsigned char buf[4] = { 0, 0, 0, 0 };
     269       14899 :     char hmackey[] = "hello-world";
     270       14899 :     size_t hmackey_size = sizeof(hmackey);
     271         755 :     unsigned int hmaclen;
     272         755 :     unsigned char hmac[EVP_MAX_MD_SIZE];
     273         755 :     HMAC_CTX c;
     274             : 
     275       14899 :     char answer[20] = "\x2c\xfa\x32\xb7\x2b\x8a\xf6\xdf\xcf\xda"
     276             :                       "\x6f\xd1\x52\x4d\x54\x58\x73\x0f\xf3\x24";
     277             : 
     278       14899 :     HMAC_CTX_init(&c);
     279       14899 :     if (HMAC_Init_ex(&c, hmackey, hmackey_size, EVP_sha1(), NULL) == 0)
     280           0 :         errx(1, "HMAC_Init_ex() out of memory");
     281       14899 :     HMAC_Update(&c, buf, sizeof(buf));
     282       14899 :     HMAC_Final(&c, hmac, &hmaclen);
     283       14899 :     HMAC_CTX_cleanup(&c);
     284             : 
     285       14899 :     if (hmaclen != 20)
     286           0 :         errx(1, "hmaclen = %d\n", (int)hmaclen);
     287             : 
     288       14899 :     if (ct_memcmp(hmac, answer, hmaclen) != 0)
     289           0 :         errx(1, "wrong answer\n");
     290       14899 : }
     291             : 
     292             : void
     293    15036649 : hcrypto_validate(void)
     294             : {
     295      290495 :     static int validated = 0;
     296      290495 :     unsigned int i;
     297             : 
     298             :     /* its ok to run this twice, do don't check for races */
     299    15036649 :     if (validated)
     300    14732010 :         return;
     301       14899 :     validated++;
     302             : 
     303       89394 :     for (i = 0; i < sizeof(hc_tests) / sizeof(hc_tests[0]); i++)
     304       74495 :         test_cipher(&hc_tests[i]);
     305             : 
     306       14899 :     check_hmac();
     307             : }

Generated by: LCOV version 1.14