Blame test-des-obsolete.c

Packit 13e0ca
Packit 13e0ca
/*
Packit 13e0ca
 * This crypt(3) validation program shipped with UFC-crypt
Packit 13e0ca
 * is derived from one distributed with Phil Karns PD DES package.
Packit 13e0ca
 *
Packit 13e0ca
 * @(#)cert.c   1.8 11 Aug 1996
Packit 13e0ca
 */
Packit 13e0ca
Packit 13e0ca
#include "crypt-port.h"
Packit 13e0ca
#include "crypt-base.h"
Packit 13e0ca
#include "crypt-obsolete.h"
Packit 13e0ca
#include "test-des-cases.h"
Packit 13e0ca
Packit 13e0ca
#include <stdio.h>
Packit 13e0ca
Packit 13e0ca
symver_ref("encrypt", encrypt, SYMVER_FLOOR);
Packit 13e0ca
symver_ref("setkey", setkey, SYMVER_FLOOR);
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
expand (unsigned char ex[64], const unsigned char pk[8])
Packit 13e0ca
{
Packit 13e0ca
  int i, j;
Packit 13e0ca
  unsigned int t;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < 8; i++)
Packit 13e0ca
    {
Packit 13e0ca
      t = pk[i];
Packit 13e0ca
      for (j = 0; j < 8; j++)
Packit 13e0ca
        ex[i*8 + j] = (t & (0x01u << (7 - j))) != 0;
Packit 13e0ca
    }
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
ex_print (const unsigned char ex[64])
Packit 13e0ca
{
Packit 13e0ca
  int i, j;
Packit 13e0ca
  unsigned int t;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < 8; i++)
Packit 13e0ca
    {
Packit 13e0ca
      t = 0;
Packit 13e0ca
      for (j = 0; j < 8; j++)
Packit 13e0ca
        t = (t << 1) | ex[i*8 + j];
Packit 13e0ca
      printf ("%02x", t);
Packit 13e0ca
    }
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
pk_print (const unsigned char pk[8])
Packit 13e0ca
{
Packit 13e0ca
  for (int i = 0; i < 8; i++)
Packit 13e0ca
    printf ("%02x", (unsigned int)pk[i]);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
report_failure (size_t n, bool decrypt,
Packit 13e0ca
                const struct des_testcase *tc, const unsigned char got[64])
Packit 13e0ca
{
Packit 13e0ca
  printf ("FAIL: %zu/%s: k=", n, decrypt ? "de" : "en");
Packit 13e0ca
  pk_print (tc->key);
Packit 13e0ca
  fputs ("  exp ", stdout);
Packit 13e0ca
  if (decrypt)
Packit 13e0ca
    pk_print (tc->plain);
Packit 13e0ca
  else
Packit 13e0ca
    pk_print (tc->answer);
Packit 13e0ca
  fputs ("  got ", stdout);
Packit 13e0ca
  ex_print (got);
Packit 13e0ca
  putchar ('\n');
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
int
Packit 13e0ca
main (void)
Packit 13e0ca
{
Packit 13e0ca
  unsigned char key[64], plain[64], cipher[64], answer[64];
Packit 13e0ca
  const struct des_testcase *tc;
Packit 13e0ca
  size_t t;
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (t = 0; t < N_DES_TESTCASES; t++)
Packit 13e0ca
    {
Packit 13e0ca
      tc = &des_testcases[t];
Packit 13e0ca
      expand (key, tc->key);
Packit 13e0ca
      expand (plain, tc->plain);
Packit 13e0ca
      expand (answer, tc->answer);
Packit 13e0ca
Packit 13e0ca
      setkey ((char *)key);
Packit 13e0ca
      memcpy (cipher, plain, 64);
Packit 13e0ca
      encrypt ((char *)cipher, 0);
Packit 13e0ca
Packit 13e0ca
      if (memcmp (cipher, answer, 64) != 0)
Packit 13e0ca
        {
Packit 13e0ca
          status = 1;
Packit 13e0ca
          report_failure (t, false, tc, cipher);
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      memcpy (cipher, answer, 64);
Packit 13e0ca
      encrypt ((char *)cipher, 1);
Packit 13e0ca
      if (memcmp (cipher, plain, 64) != 0)
Packit 13e0ca
        {
Packit 13e0ca
          status = 1;
Packit 13e0ca
          report_failure (t, true, tc, cipher);
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  return status;
Packit 13e0ca
}