Blame test-byteorder.c

Packit 13e0ca
/* Test the functions defined in byteorder.h.
Packit 13e0ca
 *
Packit 13e0ca
 * Written by Zack Weinberg <zackw at panix.com> in 2017.
Packit 13e0ca
 *
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) 2017 Zack Weinberg 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
Packit 13e0ca
#include "crypt-port.h"
Packit 13e0ca
#include "byteorder.h"
Packit 13e0ca
Packit 13e0ca
#include <inttypes.h>
Packit 13e0ca
#include <stdio.h>
Packit 13e0ca
Packit 13e0ca
struct test_32
Packit 13e0ca
{
Packit 13e0ca
  uint32_t val;
Packit 13e0ca
  unsigned char bytes[4];
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
struct test_64
Packit 13e0ca
{
Packit 13e0ca
  uint64_t val;
Packit 13e0ca
  unsigned char bytes[8];
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
#define Z(x) ((unsigned int)(unsigned char)(x)) /* zero extend char */
Packit 13e0ca
Packit 13e0ca
static int
Packit 13e0ca
test_le32 (void)
Packit 13e0ca
{
Packit 13e0ca
  static const struct test_32 cases[] =
Packit 13e0ca
  {
Packit 13e0ca
    { 0x00000000, "\x00\x00\x00\x00" },
Packit 13e0ca
    { 0xFF000000, "\x00\x00\x00\xFF" },
Packit 13e0ca
    { 0x00FF0000, "\x00\x00\xFF\x00" },
Packit 13e0ca
    { 0x0000FF00, "\x00\xFF\x00\x00" },
Packit 13e0ca
    { 0x000000FF, "\xFF\x00\x00\x00" },
Packit 13e0ca
    { 0x01234567, "\x67\x45\x23\x01" },
Packit 13e0ca
  };
Packit 13e0ca
  size_t n_cases = ARRAY_SIZE (cases);
Packit 13e0ca
  size_t i;
Packit 13e0ca
  uint32_t v;
Packit 13e0ca
  unsigned char x[4];
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < n_cases; i++)
Packit 13e0ca
    {
Packit 13e0ca
      v = le32_to_cpu (cases[i].bytes);
Packit 13e0ca
      if (v != cases[i].val)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: le32_to_cpu: %02x %02x %02x %02x -> "
Packit 13e0ca
                  "%08"PRIx32" != %08"PRIx32"\n",
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  v, cases[i].val);
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      cpu_to_le32 (x, cases[i].val);
Packit 13e0ca
      if (memcmp (x, cases[i].bytes, 4))
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: cpu_to_le32: %08"PRIx32" -> "
Packit 13e0ca
                  "%02x %02x %02x %02x != %02x %02x %02x %02x\n",
Packit 13e0ca
                  cases[i].val,
Packit 13e0ca
                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]));
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  return status;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static int
Packit 13e0ca
test_be32 (void)
Packit 13e0ca
{
Packit 13e0ca
  static const struct test_32 cases[] =
Packit 13e0ca
  {
Packit 13e0ca
    { 0x00000000, "\x00\x00\x00\x00" },
Packit 13e0ca
    { 0xFF000000, "\xFF\x00\x00\x00" },
Packit 13e0ca
    { 0x00FF0000, "\x00\xFF\x00\x00" },
Packit 13e0ca
    { 0x0000FF00, "\x00\x00\xFF\x00" },
Packit 13e0ca
    { 0x000000FF, "\x00\x00\x00\xFF" },
Packit 13e0ca
    { 0x01234567, "\x01\x23\x45\x67" },
Packit 13e0ca
  };
Packit 13e0ca
  size_t n_cases = ARRAY_SIZE (cases);
Packit 13e0ca
  size_t i;
Packit 13e0ca
  uint32_t v;
Packit 13e0ca
  unsigned char x[4];
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < n_cases; i++)
Packit 13e0ca
    {
Packit 13e0ca
      v = be32_to_cpu (cases[i].bytes);
Packit 13e0ca
      if (v != cases[i].val)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: be32_to_cpu: %02x %02x %02x %02x -> "
Packit 13e0ca
                  "%08"PRIx32" != %08"PRIx32"\n",
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  v, cases[i].val);
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      cpu_to_be32 (x, cases[i].val);
Packit 13e0ca
      if (memcmp (x, cases[i].bytes, 4))
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: cpu_to_be32: %08"PRIx32" -> "
Packit 13e0ca
                  "%02x %02x %02x %02x != %02x %02x %02x %02x\n",
Packit 13e0ca
                  cases[i].val,
Packit 13e0ca
                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]));
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  return status;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static int
Packit 13e0ca
test_le64 (void)
Packit 13e0ca
{
Packit 13e0ca
  static const struct test_64 cases[] =
Packit 13e0ca
  {
Packit 13e0ca
    { 0x0000000000000000ull, "\x00\x00\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x00000000000000FFull, "\xFF\x00\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x000000000000FF00ull, "\x00\xFF\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x0000000000FF0000ull, "\x00\x00\xFF\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x00000000FF000000ull, "\x00\x00\x00\xFF\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x000000FF00000000ull, "\x00\x00\x00\x00\xFF\x00\x00\x00" },
Packit 13e0ca
    { 0x0000FF0000000000ull, "\x00\x00\x00\x00\x00\xFF\x00\x00" },
Packit 13e0ca
    { 0x00FF000000000000ull, "\x00\x00\x00\x00\x00\x00\xFF\x00" },
Packit 13e0ca
    { 0xFF00000000000000ull, "\x00\x00\x00\x00\x00\x00\x00\xFF" },
Packit 13e0ca
    { 0x0123456789ABCDEFull, "\xEF\xCD\xAB\x89\x67\x45\x23\x01" },
Packit 13e0ca
  };
Packit 13e0ca
  size_t n_cases = ARRAY_SIZE (cases);
Packit 13e0ca
  size_t i;
Packit 13e0ca
  uint64_t v;
Packit 13e0ca
  unsigned char x[8];
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < n_cases; i++)
Packit 13e0ca
    {
Packit 13e0ca
      v = le64_to_cpu (cases[i].bytes);
Packit 13e0ca
      if (v != cases[i].val)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: le64_to_cpu: %02x%02x %02x%02x %02x%02x %02x%02x "
Packit 13e0ca
                  "-> %016"PRIx64" != %016"PRIx64"\n",
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),
Packit 13e0ca
                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]),
Packit 13e0ca
                  v, cases[i].val);
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      cpu_to_le64 (x, cases[i].val);
Packit 13e0ca
      if (memcmp (x, cases[i].bytes, 8))
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: cpu_to_le64: %016"PRIx64" -> "
Packit 13e0ca
                  "%02x%02x %02x%02x %02x%02x %02x%02x != "
Packit 13e0ca
                  "%02x%02x %02x%02x %02x%02x %02x%02x\n",
Packit 13e0ca
                  cases[i].val,
Packit 13e0ca
                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),
Packit 13e0ca
                  Z(x[4]), Z(x[5]), Z(x[6]), Z(x[7]),
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),
Packit 13e0ca
                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]));
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  return status;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static int
Packit 13e0ca
test_be64 (void)
Packit 13e0ca
{
Packit 13e0ca
  static const struct test_64 cases[] =
Packit 13e0ca
  {
Packit 13e0ca
    { 0x0000000000000000ull, "\x00\x00\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x00000000000000FFull, "\x00\x00\x00\x00\x00\x00\x00\xFF" },
Packit 13e0ca
    { 0x000000000000FF00ull, "\x00\x00\x00\x00\x00\x00\xFF\x00" },
Packit 13e0ca
    { 0x0000000000FF0000ull, "\x00\x00\x00\x00\x00\xFF\x00\x00" },
Packit 13e0ca
    { 0x00000000FF000000ull, "\x00\x00\x00\x00\xFF\x00\x00\x00" },
Packit 13e0ca
    { 0x000000FF00000000ull, "\x00\x00\x00\xFF\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x0000FF0000000000ull, "\x00\x00\xFF\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x00FF000000000000ull, "\x00\xFF\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0xFF00000000000000ull, "\xFF\x00\x00\x00\x00\x00\x00\x00" },
Packit 13e0ca
    { 0x0123456789ABCDEFull, "\x01\x23\x45\x67\x89\xAB\xCD\xEF" },
Packit 13e0ca
  };
Packit 13e0ca
  size_t n_cases = ARRAY_SIZE (cases);
Packit 13e0ca
  size_t i;
Packit 13e0ca
  uint64_t v;
Packit 13e0ca
  unsigned char x[8];
Packit 13e0ca
  int status = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < n_cases; i++)
Packit 13e0ca
    {
Packit 13e0ca
      v = be64_to_cpu (cases[i].bytes);
Packit 13e0ca
      if (v != cases[i].val)
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: be64_to_cpu: %02x%02x %02x%02x %02x%02x %02x%02x "
Packit 13e0ca
                  "-> %016"PRIx64" != %016"PRIx64"\n",
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),
Packit 13e0ca
                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]),
Packit 13e0ca
                  v, cases[i].val);
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      cpu_to_be64 (x, cases[i].val);
Packit 13e0ca
      if (memcmp (x, cases[i].bytes, 8))
Packit 13e0ca
        {
Packit 13e0ca
          printf ("FAIL: cpu_to_be64: %016"PRIx64" -> "
Packit 13e0ca
                  "%02x%02x %02x%02x %02x%02x %02x%02x != "
Packit 13e0ca
                  "%02x%02x %02x%02x %02x%02x %02x%02x\n",
Packit 13e0ca
                  cases[i].val,
Packit 13e0ca
                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),
Packit 13e0ca
                  Z(x[4]), Z(x[5]), Z(x[6]), Z(x[7]),
Packit 13e0ca
                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),
Packit 13e0ca
                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),
Packit 13e0ca
                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),
Packit 13e0ca
                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]));
Packit 13e0ca
          status = 1;
Packit 13e0ca
        }
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  return status;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
int
Packit 13e0ca
main (void)
Packit 13e0ca
{
Packit 13e0ca
  int status = 0;
Packit 13e0ca
  status |= test_le32 ();
Packit 13e0ca
  status |= test_be32 ();
Packit 13e0ca
  status |= test_le64 ();
Packit 13e0ca
  status |= test_be64 ();
Packit 13e0ca
  return status;
Packit 13e0ca
}