|
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 |
}
|