/*- * Copyright (c) 2017 Dag-Erling Smørgrav * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "cryb/impl.h" #include #include #include #include #include #include #include /*************************************************************************** * Test cases */ static struct t_case8 { uint8_t i; unsigned int n; uint8_t o; } t_cases8[] = { { 0x0f, 0, 0x0f, }, { 0x0f, 1, 0x1e, }, { 0x0f, 2, 0x3c, }, { 0x0f, 3, 0x78, }, { 0x0f, 4, 0xf0, }, { 0x0f, 5, 0xe1, }, { 0x0f, 6, 0xc3, }, { 0x0f, 7, 0x87, }, { 0x0f, 8, 0x0f, }, }; static struct t_case16 { uint16_t i; unsigned int n; uint16_t o; } t_cases16[] = { { 0x0f1eU, 0, 0x0f1eU, }, { 0x0f1eU, 1, 0x1e3cU, }, { 0x0f1eU, 2, 0x3c78U, }, { 0x0f1eU, 3, 0x78f0U, }, { 0x0f1eU, 4, 0xf1e0U, }, { 0x0f1eU, 5, 0xe3c1U, }, { 0x0f1eU, 6, 0xc783U, }, { 0x0f1eU, 7, 0x8f07U, }, { 0x0f1eU, 8, 0x1e0fU, }, { 0x0f1eU, 9, 0x3c1eU, }, { 0x0f1eU, 10, 0x783cU, }, { 0x0f1eU, 11, 0xf078U, }, { 0x0f1eU, 12, 0xe0f1U, }, { 0x0f1eU, 13, 0xc1e3U, }, { 0x0f1eU, 14, 0x83c7U, }, { 0x0f1eU, 15, 0x078fU, }, { 0x0f1eU, 16, 0x0f1eU, }, }; static struct t_case32 { uint32_t i; unsigned int n; uint32_t o; } t_cases32[] = { { 0x0f1e2d3cUL, 0, 0x0f1e2d3cUL, }, { 0x0f1e2d3cUL, 1, 0x1e3c5a78UL, }, { 0x0f1e2d3cUL, 2, 0x3c78b4f0UL, }, { 0x0f1e2d3cUL, 3, 0x78f169e0UL, }, { 0x0f1e2d3cUL, 4, 0xf1e2d3c0UL, }, { 0x0f1e2d3cUL, 5, 0xe3c5a781UL, }, { 0x0f1e2d3cUL, 6, 0xc78b4f03UL, }, { 0x0f1e2d3cUL, 7, 0x8f169e07UL, }, { 0x0f1e2d3cUL, 8, 0x1e2d3c0fUL, }, { 0x0f1e2d3cUL, 9, 0x3c5a781eUL, }, { 0x0f1e2d3cUL, 10, 0x78b4f03cUL, }, { 0x0f1e2d3cUL, 11, 0xf169e078UL, }, { 0x0f1e2d3cUL, 12, 0xe2d3c0f1UL, }, { 0x0f1e2d3cUL, 13, 0xc5a781e3UL, }, { 0x0f1e2d3cUL, 14, 0x8b4f03c7UL, }, { 0x0f1e2d3cUL, 15, 0x169e078fUL, }, { 0x0f1e2d3cUL, 16, 0x2d3c0f1eUL, }, { 0x0f1e2d3cUL, 17, 0x5a781e3cUL, }, { 0x0f1e2d3cUL, 18, 0xb4f03c78UL, }, { 0x0f1e2d3cUL, 19, 0x69e078f1UL, }, { 0x0f1e2d3cUL, 20, 0xd3c0f1e2UL, }, { 0x0f1e2d3cUL, 21, 0xa781e3c5UL, }, { 0x0f1e2d3cUL, 22, 0x4f03c78bUL, }, { 0x0f1e2d3cUL, 23, 0x9e078f16UL, }, { 0x0f1e2d3cUL, 24, 0x3c0f1e2dUL, }, { 0x0f1e2d3cUL, 25, 0x781e3c5aUL, }, { 0x0f1e2d3cUL, 26, 0xf03c78b4UL, }, { 0x0f1e2d3cUL, 27, 0xe078f169UL, }, { 0x0f1e2d3cUL, 28, 0xc0f1e2d3UL, }, { 0x0f1e2d3cUL, 29, 0x81e3c5a7UL, }, { 0x0f1e2d3cUL, 30, 0x03c78b4fUL, }, { 0x0f1e2d3cUL, 31, 0x078f169eUL, }, { 0x0f1e2d3cUL, 32, 0x0f1e2d3cUL, }, }; static struct t_case64 { uint64_t i; unsigned int n; uint64_t o; } t_cases64[] = { { 0x0f1e2d3c4b5a6987ULL, 0, 0x0f1e2d3c4b5a6987ULL, }, { 0x0f1e2d3c4b5a6987ULL, 1, 0x1e3c5a7896b4d30eULL, }, { 0x0f1e2d3c4b5a6987ULL, 2, 0x3c78b4f12d69a61cULL, }, { 0x0f1e2d3c4b5a6987ULL, 3, 0x78f169e25ad34c38ULL, }, { 0x0f1e2d3c4b5a6987ULL, 4, 0xf1e2d3c4b5a69870ULL, }, { 0x0f1e2d3c4b5a6987ULL, 5, 0xe3c5a7896b4d30e1ULL, }, { 0x0f1e2d3c4b5a6987ULL, 6, 0xc78b4f12d69a61c3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 7, 0x8f169e25ad34c387ULL, }, { 0x0f1e2d3c4b5a6987ULL, 8, 0x1e2d3c4b5a69870fULL, }, { 0x0f1e2d3c4b5a6987ULL, 9, 0x3c5a7896b4d30e1eULL, }, { 0x0f1e2d3c4b5a6987ULL, 10, 0x78b4f12d69a61c3cULL, }, { 0x0f1e2d3c4b5a6987ULL, 11, 0xf169e25ad34c3878ULL, }, { 0x0f1e2d3c4b5a6987ULL, 12, 0xe2d3c4b5a69870f1ULL, }, { 0x0f1e2d3c4b5a6987ULL, 13, 0xc5a7896b4d30e1e3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 14, 0x8b4f12d69a61c3c7ULL, }, { 0x0f1e2d3c4b5a6987ULL, 15, 0x169e25ad34c3878fULL, }, { 0x0f1e2d3c4b5a6987ULL, 16, 0x2d3c4b5a69870f1eULL, }, { 0x0f1e2d3c4b5a6987ULL, 17, 0x5a7896b4d30e1e3cULL, }, { 0x0f1e2d3c4b5a6987ULL, 18, 0xb4f12d69a61c3c78ULL, }, { 0x0f1e2d3c4b5a6987ULL, 19, 0x69e25ad34c3878f1ULL, }, { 0x0f1e2d3c4b5a6987ULL, 20, 0xd3c4b5a69870f1e2ULL, }, { 0x0f1e2d3c4b5a6987ULL, 21, 0xa7896b4d30e1e3c5ULL, }, { 0x0f1e2d3c4b5a6987ULL, 22, 0x4f12d69a61c3c78bULL, }, { 0x0f1e2d3c4b5a6987ULL, 23, 0x9e25ad34c3878f16ULL, }, { 0x0f1e2d3c4b5a6987ULL, 24, 0x3c4b5a69870f1e2dULL, }, { 0x0f1e2d3c4b5a6987ULL, 25, 0x7896b4d30e1e3c5aULL, }, { 0x0f1e2d3c4b5a6987ULL, 26, 0xf12d69a61c3c78b4ULL, }, { 0x0f1e2d3c4b5a6987ULL, 27, 0xe25ad34c3878f169ULL, }, { 0x0f1e2d3c4b5a6987ULL, 28, 0xc4b5a69870f1e2d3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 29, 0x896b4d30e1e3c5a7ULL, }, { 0x0f1e2d3c4b5a6987ULL, 30, 0x12d69a61c3c78b4fULL, }, { 0x0f1e2d3c4b5a6987ULL, 31, 0x25ad34c3878f169eULL, }, { 0x0f1e2d3c4b5a6987ULL, 32, 0x4b5a69870f1e2d3cULL, }, { 0x0f1e2d3c4b5a6987ULL, 33, 0x96b4d30e1e3c5a78ULL, }, { 0x0f1e2d3c4b5a6987ULL, 34, 0x2d69a61c3c78b4f1ULL, }, { 0x0f1e2d3c4b5a6987ULL, 35, 0x5ad34c3878f169e2ULL, }, { 0x0f1e2d3c4b5a6987ULL, 36, 0xb5a69870f1e2d3c4ULL, }, { 0x0f1e2d3c4b5a6987ULL, 37, 0x6b4d30e1e3c5a789ULL, }, { 0x0f1e2d3c4b5a6987ULL, 38, 0xd69a61c3c78b4f12ULL, }, { 0x0f1e2d3c4b5a6987ULL, 39, 0xad34c3878f169e25ULL, }, { 0x0f1e2d3c4b5a6987ULL, 40, 0x5a69870f1e2d3c4bULL, }, { 0x0f1e2d3c4b5a6987ULL, 41, 0xb4d30e1e3c5a7896ULL, }, { 0x0f1e2d3c4b5a6987ULL, 42, 0x69a61c3c78b4f12dULL, }, { 0x0f1e2d3c4b5a6987ULL, 43, 0xd34c3878f169e25aULL, }, { 0x0f1e2d3c4b5a6987ULL, 44, 0xa69870f1e2d3c4b5ULL, }, { 0x0f1e2d3c4b5a6987ULL, 45, 0x4d30e1e3c5a7896bULL, }, { 0x0f1e2d3c4b5a6987ULL, 46, 0x9a61c3c78b4f12d6ULL, }, { 0x0f1e2d3c4b5a6987ULL, 47, 0x34c3878f169e25adULL, }, { 0x0f1e2d3c4b5a6987ULL, 48, 0x69870f1e2d3c4b5aULL, }, { 0x0f1e2d3c4b5a6987ULL, 49, 0xd30e1e3c5a7896b4ULL, }, { 0x0f1e2d3c4b5a6987ULL, 50, 0xa61c3c78b4f12d69ULL, }, { 0x0f1e2d3c4b5a6987ULL, 51, 0x4c3878f169e25ad3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 52, 0x9870f1e2d3c4b5a6ULL, }, { 0x0f1e2d3c4b5a6987ULL, 53, 0x30e1e3c5a7896b4dULL, }, { 0x0f1e2d3c4b5a6987ULL, 54, 0x61c3c78b4f12d69aULL, }, { 0x0f1e2d3c4b5a6987ULL, 55, 0xc3878f169e25ad34ULL, }, { 0x0f1e2d3c4b5a6987ULL, 56, 0x870f1e2d3c4b5a69ULL, }, { 0x0f1e2d3c4b5a6987ULL, 57, 0x0e1e3c5a7896b4d3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 58, 0x1c3c78b4f12d69a6ULL, }, { 0x0f1e2d3c4b5a6987ULL, 59, 0x3878f169e25ad34cULL, }, { 0x0f1e2d3c4b5a6987ULL, 60, 0x70f1e2d3c4b5a698ULL, }, { 0x0f1e2d3c4b5a6987ULL, 61, 0xe1e3c5a7896b4d30ULL, }, { 0x0f1e2d3c4b5a6987ULL, 62, 0xc3c78b4f12d69a61ULL, }, { 0x0f1e2d3c4b5a6987ULL, 63, 0x878f169e25ad34c3ULL, }, { 0x0f1e2d3c4b5a6987ULL, 64, 0x0f1e2d3c4b5a6987ULL, }, }; /*************************************************************************** * Test functions */ #define T_ROLROR(N) \ static int \ t_rol##N(char **desc, void *arg) \ { \ struct t_case##N *t = arg; \ (void)asprintf(desc, "rol" #N "(%u)", t->n); \ return (t_compare_x##N(t->o, rol##N(t->i, t->n))); \ } \ static int \ t_ror##N(char **desc, void *arg) \ { \ struct t_case##N *t = arg; \ (void)asprintf(desc, "ror" #N "(%u)", N - t->n); \ return (t_compare_x##N(t->o, ror##N(t->i, N - t->n))); \ } T_ROLROR(8); T_ROLROR(16); T_ROLROR(32); T_ROLROR(64); #undef T_ROLROR /*************************************************************************** * Boilerplate */ static int t_prepare(int argc, char *argv[]) { unsigned int i, n; (void)argc; (void)argv; #define T_ROLROR(N) \ do { \ n = sizeof t_cases##N / sizeof t_cases##N[0]; \ for (i = 0; i < n; ++i) \ t_add_test(t_rol##N, &t_cases##N[i], "rol" #N); \ for (i = n; i > 0; --i) \ t_add_test(t_ror##N, &t_cases##N[i - 1], "ror" #N); \ } while (0) T_ROLROR(8); T_ROLROR(16); T_ROLROR(32); T_ROLROR(64); #undef T_ROLROR return (0); } int main(int argc, char *argv[]) { t_main(t_prepare, NULL, argc, argv); }