X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/79ba130cb5776f994f6a3f0f87159d8cbc5ff129..cc3ca08f22460b15423bb88632f3a12741b19003:/ecb-def.h diff --git a/ecb-def.h b/ecb-def.h index 0f49763..08a25f6 100644 --- a/ecb-def.h +++ b/ecb-def.h @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: ecb-def.h,v 1.1 1999/12/10 23:16:39 mdw Exp $ + * $Id: ecb-def.h,v 1.4 2004/04/17 09:58:37 mdw Exp $ * * Definitions electronic code book mode * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,26 +15,18 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: ecb-def.h,v $ - * Revision 1.1 1999/12/10 23:16:39 mdw - * Split mode macros into interface and implementation. - * - */ - #ifndef CATACOMB_ECB_DEF_H #define CATACOMB_ECB_DEF_H @@ -50,6 +42,10 @@ #include #include +#ifndef CATACOMB_ARENA_H +# include "arena.h" +#endif + #ifndef CATACOMB_BLKC_H # include "blkc.h" #endif @@ -58,6 +54,10 @@ # include "gcipher.h" #endif +#ifndef CATACOMB_PARANOIA_H +# include "paranoia.h" +#endif + /*----- Macros ------------------------------------------------------------*/ /* --- @ECB_DEF@ --- * @@ -148,11 +148,17 @@ void pre##_ecbencrypt(pre##_ecbctx *ctx, \ \ while (sz >= 2 * PRE##_BLKSZ || sz == PRE##_BLKSZ) { \ uint32 x[PRE##_BLKSZ / 4]; \ - BLKC_LOAD(PRE, x, s); \ + if (!s) \ + BLKC_ZERO(PRE, x); \ + else { \ + BLKC_LOAD(PRE, x, s); \ + s += PRE##_BLKSZ; \ + } \ pre##_eblk(&ctx->ctx, x, x); \ - BLKC_STORE(PRE, d, x); \ - s += PRE##_BLKSZ; \ - d += PRE##_BLKSZ; \ + if (d) { \ + BLKC_STORE(PRE, d, x); \ + d += PRE##_BLKSZ; \ + } \ sz -= PRE##_BLKSZ; \ } \ \ @@ -177,7 +183,12 @@ void pre##_ecbencrypt(pre##_ecbctx *ctx, \ * out yet, because I've not read the partial plaintext block. \ */ \ \ - BLKC_LOAD(PRE, x, s); \ + if (!s) \ + BLKC_ZERO(PRE, x); \ + else { \ + BLKC_LOAD(PRE, x, s); \ + s += PRE##_BLKSZ; \ + } \ pre##_eblk(&ctx->ctx, x, x); \ BLKC_STORE(PRE, b, x); \ \ @@ -188,16 +199,15 @@ void pre##_ecbencrypt(pre##_ecbctx *ctx, \ * ciphertext block. \ */ \ \ - s += PRE##_BLKSZ; \ - d += PRE##_BLKSZ; \ + if (d) d += PRE##_BLKSZ; \ for (i = 0; i < sz; i++) { \ register octet y = b[i]; \ b[i] = s[i]; \ - d[i] = y; \ + if (d) d[i] = y; \ } \ BLKC_LOAD(PRE, x, b); \ pre##_eblk(&ctx->ctx, x, x); \ - BLKC_STORE(PRE, d - PRE##_BLKSZ, x); \ + if (d) BLKC_STORE(PRE, d - PRE##_BLKSZ, x); \ } \ \ /* --- Done --- */ \ @@ -315,7 +325,7 @@ typedef struct gctx { \ \ static gcipher *ginit(const void *k, size_t sz) \ { \ - gctx *g = CREATE(gctx); \ + gctx *g = S_CREATE(gctx); \ g->c.ops = &gops; \ pre##_ecbinit(&g->k, k, sz, 0); \ return (&g->c); \ @@ -336,16 +346,17 @@ static void gdecrypt(gcipher *c, const void *s, void *t, size_t sz) \ static void gdestroy(gcipher *c) \ { \ gctx *g = (gctx *)c; \ - DESTROY(g); \ + BURN(*g); \ + S_DESTROY(g); \ } \ \ static const gcipher_ops gops = { \ - &pre##_ecb.b, \ - gencrypt, gdecrypt, gdestroy, 0, 0 \ + &pre##_ecb, \ + gencrypt, gdecrypt, gdestroy, 0, 0 \ }; \ \ const gccipher pre##_ecb = { \ - { #pre "-ecb", PRE##_KEYSZ, PRE##_BLKSZ }, \ + #pre "-ecb", pre##_keysz, PRE##_BLKSZ, \ ginit \ }; \ \ @@ -420,22 +431,22 @@ int main(void) \ if (memcmp(pt, text, sizeof(text)) == 0) { \ done++; \ if (sizeof(text) < 40 || done % 8 == 0) \ - fputc('.', stdout); \ + fputc('.', stdout); \ if (done % 480 == 0) \ - fputs("\n\t", stdout); \ + fputs("\n\t", stdout); \ fflush(stdout); \ } else { \ printf("\nError (sz = %lu)\n", (unsigned long)sz); \ status = 1; \ printf("\tplaintext = "); hexdump(text, sz); \ - printf(", "); hexdump(text + sz, rest); \ - fputc('\n', stdout); \ + printf(", "); hexdump(text + sz, rest); \ + fputc('\n', stdout); \ printf("\tciphertext = "); hexdump(ct, sz); \ - printf(", "); hexdump(ct + sz, rest); \ - fputc('\n', stdout); \ + printf(", "); hexdump(ct + sz, rest); \ + fputc('\n', stdout); \ printf("\trecovered text = "); hexdump(pt, sz); \ - printf(", "); hexdump(pt + sz, rest); \ - fputc('\n', stdout); \ + printf(", "); hexdump(pt + sz, rest); \ + fputc('\n', stdout); \ fputc('\n', stdout); \ } \ next: \