Blame test-crypt-bcrypt.c

Packit 13e0ca
/*
Packit 13e0ca
 * Written by Solar Designer <solar at openwall.com> in 2000-2014.
Packit 13e0ca
 * No copyright is claimed, and the software is hereby placed in the public
Packit 13e0ca
 * domain.  In case this attempt to disclaim copyright and place the software
Packit 13e0ca
 * in the public domain is deemed null and void, then the software is
Packit 13e0ca
 * Copyright (c) 2000-2014 Solar Designer and it is hereby released to the
Packit 13e0ca
 * general public under the following terms:
Packit 13e0ca
 *
Packit 13e0ca
 * Redistribution and use in source and binary forms, with or without
Packit 13e0ca
 * modification, are permitted.
Packit 13e0ca
 *
Packit 13e0ca
 * There's ABSOLUTELY NO WARRANTY, express or implied.
Packit 13e0ca
 *
Packit 13e0ca
 * See crypt_blowfish.c for more information.
Packit 13e0ca
 */
Packit 13e0ca
Packit 13e0ca
#include "crypt-port.h"
Packit 13e0ca
#include "crypt-base.h"
Packit 13e0ca
Packit 13e0ca
#include <errno.h>
Packit 13e0ca
#include <stdio.h>
Packit 13e0ca
#include <stdlib.h>
Packit 13e0ca
Packit 13e0ca
#if INCLUDE_bcrypt
Packit 13e0ca
Packit 13e0ca
static const char *tests[][3] =
Packit 13e0ca
{
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW",
Packit 13e0ca
    "U*U"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK",
Packit 13e0ca
    "U*U*"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a",
Packit 13e0ca
    "U*U*U"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui",
Packit 13e0ca
    "0123456789abcdefghijklmnopqrstuvwxyz"
Packit 13e0ca
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Packit 13e0ca
    "chars after 72 are ignored"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
Packit 13e0ca
    "\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
Packit 13e0ca
    "\xff\xff\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
Packit 13e0ca
    "\xff\xff\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.nqd1wy.pTMdcvrRWxyiGL2eMz.2a85.",
Packit 13e0ca
    "\xff\xff\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2b$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e",
Packit 13e0ca
    "\xff\xff\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
Packit 13e0ca
    "\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
Packit 13e0ca
    "\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2b$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq",
Packit 13e0ca
    "\xa3"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
Packit 13e0ca
    "1\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
Packit 13e0ca
    "\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
Packit 13e0ca
    "\xff\xa3" "34" "\xff\xff\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2y$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi",
Packit 13e0ca
    "\xff\xa3" "34" "\xff\xff\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.ZC1JEJ8Z4gPfpe1JOr/oyPXTWl9EFd.",
Packit 13e0ca
    "\xff\xa3" "34" "\xff\xff\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2y$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e",
Packit 13e0ca
    "\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e",
Packit 13e0ca
    "\xff\xa3" "345"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
Packit 13e0ca
    "\xa3" "ab"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
Packit 13e0ca
    "\xa3" "ab"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2y$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS",
Packit 13e0ca
    "\xa3" "ab"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$6bNw2HLQYeqHYyBfLMsv/OiwqTymGIGzFsA4hOTWebfehXHNprcAS",
Packit 13e0ca
    "\xd1\x91"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2x$05$6bNw2HLQYeqHYyBfLMsv/O9LIGgn8OMzuDoHfof8AQimSGfcSWxnS",
Packit 13e0ca
    "\xd0\xc1\xd2\xcf\xcc\xd8"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6",
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
Packit 13e0ca
    "chars after 72 are ignored as usual"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy",
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
    "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe",
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
    "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    "$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy",
Packit 13e0ca
    ""
Packit 13e0ca
  },
Packit 13e0ca
  { "*0", "", "$2a$03$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*0", "", "$2a$32$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*0", "", "$2c$05$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*0", "", "$2z$05$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*0", "", "$2`$05$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*0", "", "$2{$05$CCCCCCCCCCCCCCCCCCCCC." },
Packit 13e0ca
  { "*1", "", "*0" },
Packit 13e0ca
  { 0 }
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
int
Packit 13e0ca
main (void)
Packit 13e0ca
{
Packit 13e0ca
  void *data = 0;
Packit 13e0ca
  int size = 0x12345678;
Packit 13e0ca
  int i;
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; tests[i][0]; i++)
Packit 13e0ca
    {
Packit 13e0ca
      const char *hash = tests[i][0];
Packit 13e0ca
      const char *key = tests[i][1];
Packit 13e0ca
      const char *setting = tests[i][2];
Packit 13e0ca
      const char *p;
Packit 13e0ca
      int ok = !setting || hash[0] != '*';
Packit 13e0ca
      char s_buf[30];
Packit 13e0ca
      char o_buf[sizeof (struct crypt_data)];
Packit 13e0ca
      int errnm, match;
Packit 13e0ca
Packit 13e0ca
      if (!setting)
Packit 13e0ca
        {
Packit 13e0ca
          memcpy (s_buf, hash, sizeof (s_buf) - 1);
Packit 13e0ca
          s_buf[sizeof (s_buf) - 1] = 0;
Packit 13e0ca
          setting = s_buf;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      errno = 0;
Packit 13e0ca
      p = crypt (key, setting);
Packit 13e0ca
      errnm = errno;
Packit Service 0b5db0
#if ENABLE_FAILURE_TOKENS
Packit 13e0ca
      match = strcmp (p, hash);
Packit Service 0b5db0
#else
Packit Service 0b5db0
      match = (ok ? strcmp (p, hash) : p != 0);
Packit Service 0b5db0
#endif
Packit Service 0b5db0
      if ((!ok && !errno) || match)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: %d/crypt.1: key=%s setting=%s: xhash=%s xerr=%d, "
Packit 13e0ca
                  "p=%s match=%d err=%s\n",
Packit 13e0ca
                  i, key, setting, hash, !ok, p, match==0, strerror (errnm));
Packit 13e0ca
          status = 1;
Packit 13e0ca
          continue;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      if (ok)
Packit 13e0ca
        {
Packit 13e0ca
          p = crypt (key, hash);
Packit 13e0ca
          if (strcmp (p, hash))
Packit 13e0ca
            {
Packit 13e0ca
              printf ("FAIL: %d/crypt.2: key=%s hash=%s p=%s\n",
Packit 13e0ca
                      i, key, hash, p);
Packit 13e0ca
              status = 1;
Packit 13e0ca
              continue;
Packit 13e0ca
            }
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      strcpy (o_buf, "abc");
Packit 13e0ca
      const char *x = "*0";
Packit 13e0ca
      if (setting[0] == '*' && setting[1] == '0')
Packit 13e0ca
        x = "*1";
Packit 13e0ca
      errno = 0;
Packit 13e0ca
      p = crypt_rn (key, setting, o_buf, sizeof o_buf);
Packit 13e0ca
      errnm = errno;
Packit 13e0ca
      if (ok)
Packit 13e0ca
        match = p && !strcmp (p, hash);
Packit 13e0ca
      else
Packit 13e0ca
        match = !p && errnm && !strcmp (o_buf, x);
Packit 13e0ca
Packit 13e0ca
      if (!match)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: %d/crypt_rn: key=%s setting=%s: "
Packit 13e0ca
                  "xhash=%s xmagic=%s xerr=%d, p=%s obuf=%s err=%s\n",
Packit 13e0ca
                  i, key, setting, hash, x, !ok, p, o_buf,
Packit 13e0ca
                  strerror (errnm));
Packit 13e0ca
          status = 1;
Packit 13e0ca
          continue;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      errno = 0;
Packit 13e0ca
      p = crypt_ra (key, setting, &data, &size);
Packit 13e0ca
      errnm = errno;
Packit 13e0ca
Packit 13e0ca
      if (ok)
Packit 13e0ca
        match = p && !strcmp (p, hash);
Packit 13e0ca
      else
Packit 13e0ca
        match = !p && errnm && !strcmp (data, hash);
Packit 13e0ca
Packit 13e0ca
      if (!match)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: %d/crypt_ra: key=%s setting=%s: xhash=%s xerr=%d, "
Packit 13e0ca
                  "p=%s data=%s err=%s\n",
Packit 13e0ca
                  i, key, setting, hash, !ok, p,
Packit 13e0ca
                  (char *)data, strerror (errnm));
Packit 13e0ca
          status = 1;
Packit 13e0ca
          continue;
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  free (data);
Packit 13e0ca
  return status;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
#else
Packit 13e0ca
Packit 13e0ca
int
Packit 13e0ca
main (void)
Packit 13e0ca
{
Packit 13e0ca
  return 77; /* UNSUPPORTED */
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
#endif