(root)/
libxcrypt-4.4.36/
test/
alg-gost3411-2012-hmac.c
       1  /* Copyright (C) 2018 vt@altlinux.org
       2   * Copyright (C) 2018 Björn Esser besser82@fedoraproject.org
       3   *
       4   * Redistribution and use in source and binary forms, with or without
       5   * modification, are permitted.
       6   *
       7   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
       8   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       9   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      10   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      11   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      12   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      13   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      14   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      15   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      16   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      17   * SUCH DAMAGE.
      18   */
      19  
      20  #include "crypt-port.h"
      21  
      22  #if INCLUDE_gost_yescrypt
      23  
      24  #include "alg-gost3411-2012-hmac.h"
      25  
      26  #include <stdio.h>
      27  
      28  static void
      29  dumphex(const void *ptr, size_t size)
      30  {
      31    size_t i;
      32  
      33    for (i = 0; i < size; i++)
      34      printf("%02x", ((const unsigned char *)ptr)[i]);
      35    printf("\n");
      36  }
      37  
      38  static int
      39  test_gost2012_hmac(const char *subject, const char *k, size_t ksize,
      40                     const char *t, size_t tlen, const char *match)
      41  {
      42    uint8_t digest[32];
      43    gost_hmac_256_t gostbuf;
      44  
      45    gost_hmac256((const uint8_t *)k, ksize,
      46                 (const uint8_t *)t, tlen, digest, &gostbuf);
      47  
      48    if (memcmp(digest, match, sizeof(digest)))
      49      {
      50        fprintf(stderr, "ERROR: %s\n", subject);
      51        printf("   key: ");
      52        dumphex(k, ksize);
      53        printf("   t:   ");
      54        dumphex(t, tlen);
      55        printf("   hmac=");
      56        dumphex(digest, sizeof(digest));
      57        return 1;
      58      }
      59    else
      60      fprintf(stderr, "   ok: %s\n", subject);
      61  
      62    return 0;
      63  }
      64  
      65  int
      66  main (void)
      67  {
      68    int result = 0;
      69  
      70    result |= test_gost2012_hmac(
      71                "HMAC_GOSTR3411_2012_256 test vector from P 50.1.113-2016",
      72                "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
      73                "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f", 32,
      74                "\x01\x26\xbd\xb8\x78\x00\xaf\x21\x43\x41\x45\x65\x63\x78\x01\x00", 16,
      75                "\xa1\xaa\x5f\x7d\xe4\x02\xd7\xb3\xd3\x23\xf2\x99\x1c\x8d\x45\x34"
      76                "\x01\x31\x37\x01\x0a\x83\x75\x4f\xd0\xaf\x6d\x7c\xd4\x92\x2e\xd9"
      77              );
      78  
      79    return result;
      80  }
      81  
      82  #else
      83  
      84  int
      85  main (void)
      86  {
      87    return 77; /* UNSUPPORTED */
      88  }
      89  
      90  #endif /* INCLUDE_gost_yescrypt */