symm/*-def.h: Fix layout bogosities.
[catacomb] / symm / cbc-def.h
index 56c8f05..3a5c9a2 100644 (file)
@@ -64,7 +64,9 @@
  * Use:                Creates an implementation for CBC stealing mode.
  */
 
-#define CBC_DEF(PRE, pre)                                              \
+#define CBC_DEF(PRE, pre) CBC_DEFX(PRE, pre, #pre, #pre)
+
+#define CBC_DEFX(PRE, pre, name, fname)                                        \
                                                                        \
 /* --- @pre_cbcgetiv@ --- *                                            \
  *                                                                     \
@@ -129,8 +131,8 @@ void pre##_cbcsetkey(pre##_cbcctx *ctx, const pre##_ctx *k)         \
  */                                                                    \
                                                                        \
 void pre##_cbcinit(pre##_cbcctx *ctx,                                  \
-                    const void *key, size_t sz,                        \
-                    const void *iv)                                    \
+                  const void *key, size_t sz,                          \
+                  const void *iv)                                      \
 {                                                                      \
   static const octet zero[PRE##_BLKSZ] = { 0 };                                \
   pre##_init(&ctx->ctx, key, sz);                                      \
@@ -153,8 +155,8 @@ void pre##_cbcinit(pre##_cbcctx *ctx,                                       \
  */                                                                    \
                                                                        \
 void pre##_cbcencrypt(pre##_cbcctx *ctx,                               \
-                       const void *src, void *dest,                    \
-                       size_t sz)                                      \
+                     const void *src, void *dest,                      \
+                     size_t sz)                                        \
 {                                                                      \
   const octet *s = src;                                                        \
   octet *d = dest;                                                     \
@@ -272,8 +274,8 @@ void pre##_cbcencrypt(pre##_cbcctx *ctx,                            \
  */                                                                    \
                                                                        \
 void pre##_cbcdecrypt(pre##_cbcctx *ctx,                               \
-                       const void *src, void *dest,                    \
-                       size_t sz)                                      \
+                     const void *src, void *dest,                      \
+                     size_t sz)                                        \
 {                                                                      \
   const octet *s = src;                                                        \
   octet *d = dest;                                                     \
@@ -430,19 +432,19 @@ static const gcipher_ops gops = {                                 \
 };                                                                     \
                                                                        \
 const gccipher pre##_cbc = {                                           \
-  #pre "-cbc", pre##_keysz, PRE##_BLKSZ,                               \
+  name "-cbc", pre##_keysz, PRE##_BLKSZ,                               \
   ginit                                                                        \
 };                                                                     \
                                                                        \
-CBC_TEST(PRE, pre)
+CBC_TESTX(PRE, pre, name, fname)
 
 /*----- Test rig ----------------------------------------------------------*/
 
-#ifdef TEST_RIG
+#define CBC_TEST(PRE, pre) CBC_TESTX(PRE, pre, #pre, #pre)
 
-#include <stdio.h>
+#ifdef TEST_RIG
 
-#include "daftstory.h"
+#include "modes-test.h"
 
 /* --- @CBC_TEST@ --- *
  *
@@ -451,91 +453,34 @@ CBC_TEST(PRE, pre)
  * Use:                Standard test rig for CBC functions.
  */
 
-#define CBC_TEST(PRE, pre)                                             \
+#define CBC_TESTX(PRE, pre, name, fname)                               \
                                                                        \
-/* --- Initial plaintext for the test --- */                           \
+static pre##_ctx key;                                                  \
+static pre##_cbcctx ctx;                                               \
                                                                        \
-static const octet text[] = TEXT;                                      \
+static void pre##_cbc_test_setup(const octet *k, size_t ksz)           \
+  { pre##_init(&key, k, ksz); pre##_cbcsetkey(&ctx, &key); }           \
                                                                        \
-/* --- Key and IV to use --- */                                                \
+static void pre##_cbc_test_reset(const octet *iv)                      \
+  { pre##_cbcsetiv(&ctx, iv); }                                                \
                                                                        \
-static const octet key[] = KEY;                                                \
-static const octet iv[] = IV;                                          \
+static void pre##_cbc_test_enc(const octet *s, octet *d, size_t sz)    \
+  { pre##_cbcencrypt(&ctx, s, d, sz); }                                        \
                                                                        \
-/* --- Buffers for encryption and decryption output --- */             \
+static void pre##_cbc_test_dec(const octet *s, octet *d, size_t sz)    \
+  { pre##_cbcdecrypt(&ctx, s, d, sz); }                                        \
                                                                        \
-static octet ct[sizeof(text)];                                         \
-static octet pt[sizeof(text)];                                         \
-                                                                       \
-static void hexdump(const octet *p, size_t sz, size_t off)             \
+int main(int argc, char *argv[])                                       \
 {                                                                      \
-  const octet *q = p + sz;                                             \
-  for (sz = 0; p < q; p++, sz++) {                                     \
-    printf("%02x", *p);                                                        \
-    if ((off + sz + 1) % PRE##_BLKSZ == 0)                             \
-      putchar(':');                                                    \
-  }                                                                    \
-}                                                                      \
-                                                                       \
-int main(void)                                                         \
-{                                                                      \
-  size_t sz = 0, rest;                                                 \
-  pre##_cbcctx ctx;                                                    \
-  pre##_ctx k;                                                         \
-  int status = 0;                                                      \
-  int done = 0;                                                                \
-                                                                       \
-  size_t keysz = PRE##_KEYSZ ?                                         \
-    PRE##_KEYSZ : strlen((const char *)key);                           \
-                                                                       \
-  fputs(#pre "-cbc: ", stdout);                                                \
-                                                                       \
-  pre##_init(&k, key, keysz);                                          \
-  pre##_cbcsetkey(&ctx, &k);                                           \
-                                                                       \
-  while (sz <= sizeof(text)) {                                         \
-    rest = sizeof(text) - sz;                                          \
-    memcpy(ct, text, sizeof(text));                                    \
-    pre##_cbcsetiv(&ctx, iv);                                          \
-    pre##_cbcencrypt(&ctx, ct, ct, sz);                                        \
-    pre##_cbcencrypt(&ctx, ct + sz, ct + sz, rest);                    \
-    memcpy(pt, ct, sizeof(text));                                      \
-    pre##_cbcsetiv(&ctx, iv);                                          \
-    pre##_cbcdecrypt(&ctx, pt, pt, sz);                                        \
-    pre##_cbcdecrypt(&ctx, pt + sz, pt + sz, rest);                    \
-    if (memcmp(pt, text, sizeof(text)) == 0) {                         \
-      done++;                                                          \
-      if (sizeof(text) < 40 || done % 8 == 0)                          \
-       fputc('.', stdout);                                             \
-      if (done % 480 == 0)                                             \
-       fputs("\n\t", stdout);                                          \
-      fflush(stdout);                                                  \
-    } else {                                                           \
-      printf("\nError (sz = %lu)\n", (unsigned long)sz);               \
-      status = 1;                                                      \
-      printf("\tplaintext      = "); hexdump(text, sz, 0);             \
-       printf(", "); hexdump(text + sz, rest, sz);                     \
-       fputc('\n', stdout);                                            \
-      printf("\tciphertext     = "); hexdump(ct, sz, 0);               \
-       printf(", "); hexdump(ct + sz, rest, sz);                       \
-       fputc('\n', stdout);                                            \
-      printf("\trecovered text = "); hexdump(pt, sz, 0);               \
-       printf(", "); hexdump(pt + sz, rest, sz);                       \
-       fputc('\n', stdout);                                            \
-      fputc('\n', stdout);                                             \
-    }                                                                  \
-    if (sz < 63)                                                       \
-      sz++;                                                            \
-    else                                                               \
-      sz += 9;                                                         \
-  }                                                                    \
-                                                                       \
-  fputs(status ? " failed\n" : " ok\n", stdout);                       \
-  return (status);                                                     \
+  return test_encmode(fname "-cbc", PRE##_KEYSZ, PRE##_BLKSZ,          \
+                     1, TEMF_REFALIGN,                                 \
+                     pre##_cbc_test_setup, pre##_cbc_test_reset,       \
+                     pre##_cbc_test_enc, pre##_cbc_test_dec,           \
+                     argc, argv);                                      \
 }
 
 #else
-#  define CBC_TEST(PRE, pre)
+#  define CBC_TESTX(PRE, pre, name, fname)
 #endif
 
 /*----- That's all, folks -------------------------------------------------*/