From 41f91aa37817d7dba67ff74ae9faa85c65261a68 Mon Sep 17 00:00:00 2001 From: mdw Date: Fri, 10 Dec 1999 23:27:46 +0000 Subject: [PATCH] Generic cipher and RNG interfaces. --- rc4.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- rc4.h | 36 +++++++++++++-- 2 files changed, 185 insertions(+), 13 deletions(-) diff --git a/rc4.c b/rc4.c index 6417635..b1e9d67 100644 --- a/rc4.c +++ b/rc4.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: rc4.c,v 1.1 1999/09/03 08:41:12 mdw Exp $ + * $Id: rc4.c,v 1.2 1999/12/10 23:27:35 mdw Exp $ * * The alleged RC4 stream cipher * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: rc4.c,v $ + * Revision 1.2 1999/12/10 23:27:35 mdw + * Generic cipher and RNG interfaces. + * * Revision 1.1 1999/09/03 08:41:12 mdw * Initial import. * @@ -38,10 +41,14 @@ /*----- Header files ------------------------------------------------------*/ #include +#include #include #include +#include +#include "gcipher.h" +#include "grand.h" #include "rc4.h" /*----- Main code ---------------------------------------------------------*/ @@ -77,15 +84,6 @@ void rc4_init(rc4_ctx *ctx, const void *k, size_t sz) if (p == q) p = k; } - -#ifdef notdef - for (i = 0; i < 256; i += 16) { - printf("%3d :", i); - for (j = i; j < i + 16; j++) - printf(" %02x", ctx->s[j]); - putchar('\n'); - } -#endif } /* --- @rc4_encrypt@ --- * @@ -119,6 +117,150 @@ void rc4_encrypt(rc4_ctx *ctx, const void *src, void *dest, size_t sz) while (sz) { unsigned x; RC4_BYTE(x); *d++ = *s++ ^ x; sz--; }); } +/*----- Generic cipher interface ------------------------------------------*/ + +typedef struct gctx { + gcipher c; + rc4_ctx rc4; +} gctx; + +static const gcipher_ops gops; + +static gcipher *ginit(const void *k, size_t sz) +{ + gctx *g = CREATE(gctx); + g->c.ops = &gops; + rc4_init(&g->rc4, k, sz); + return (&g->c); +} + +static void gencrypt(gcipher *c, const void *s, void *t, size_t sz) +{ + gctx *g = (gctx *)c; + rc4_encrypt(&g->rc4, s, t, sz); +} + +static void gdestroy(gcipher *c) +{ + gctx *g = (gctx *)c; + DESTROY(g); +} + +static const gcipher_ops gops = { + &rc4.b, + gencrypt, gencrypt, gdestroy, 0, 0 +}; + +const gccipher rc4 = { + { "rc4", 0, 0 }, + ginit +}; + +/*----- Generic random number generator interface -------------------------*/ + +typedef struct grctx { + grand r; + rc4_ctx rc4; +} grctx; + +static void grdestroy(grand *r) +{ + grctx *g = (grctx *)r; + DESTROY(g); +} + +static int grmisc(grand *r, unsigned op, ...) +{ + grctx *g = (grctx *)r; + va_list ap; + int rc = 0; + octet buf[4]; + va_start(ap, op); + + switch (op) { + case GRAND_CHECK: + switch (va_arg(ap, unsigned)) { + case GRAND_CHECK: + case GRAND_SEEDINT: + case GRAND_SEEDUINT32: + case GRAND_SEEDBLOCK: + rc = 1; + break; + default: + rc = 0; + break; + } + break; + case GRAND_SEEDINT: + STORE32(buf, va_arg(ap, unsigned)); + rc4_init(&g->rc4, buf, sizeof(buf)); + break; + case GRAND_SEEDUINT32: + STORE32(buf, va_arg(ap, uint32)); + rc4_init(&g->rc4, buf, sizeof(buf)); + break; + case GRAND_SEEDBLOCK: { + const void *p = va_arg(ap, const void *); + size_t sz = va_arg(ap, size_t); + rc4_init(&g->rc4, p, sz); + } break; + } + + va_end(ap); + return (rc); +} + +static octet grbyte(grand *r) +{ + grctx *g = (grctx *)r; + octet o; + RC4_OPEN(&g->rc4, RC4_BYTE(o);); + return (o); +} + +static uint32 grword(grand *r) +{ + grctx *g = (grctx *)r; + octet b[4]; + int i; + RC4_OPEN(&g->rc4, + for (i = 0; i < sizeof(b); i++) + RC4_BYTE(b[i]);); + return (LOAD32(b)); +} + +static void grfill(grand *r, void *p, size_t sz) +{ + grctx *g = (grctx *)r; + rc4_encrypt(&g->rc4, 0, p, sz); +} + +static const grand_ops grops = { + "rc4", + 0, + grmisc, grdestroy, + grword, grbyte, grword, grand_range, grfill +}; + +/* --- @rc4_rand@ --- * + * + * Arguments: @const void *k@ = pointer to key material + * @size_t sz@ = size of key material + * + * Returns: Pointer to generic random number generator interface. + * + * Use: Creates a random number interface wrapper around an + * OFB-mode block cipher. + */ + +grand *rc4_rand(const void *k, size_t sz) +{ + grctx *g = CREATE(grctx); + g->r.ops = &grops; + rc4_init(&g->rc4, k, sz); + return (&g->r); +} + /*----- Test rig ----------------------------------------------------------*/ #ifdef TEST_RIG diff --git a/rc4.h b/rc4.h index adaf731..b1acc23 100644 --- a/rc4.h +++ b/rc4.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: rc4.h,v 1.1 1999/09/03 08:41:12 mdw Exp $ + * $Id: rc4.h,v 1.2 1999/12/10 23:27:46 mdw Exp $ * * The alleged RC4 stream cipher * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: rc4.h,v $ + * Revision 1.2 1999/12/10 23:27:46 mdw + * Generic cipher and RNG interfaces. + * * Revision 1.1 1999/09/03 08:41:12 mdw * Initial import. * @@ -43,8 +46,8 @@ * list. */ -#ifndef RC4_H -#define RC4_H +#ifndef CATACOMB_RC4_H +#define CATACOMB_RC4_H #ifdef __cplusplus extern "C" { @@ -56,6 +59,14 @@ #include +#ifndef CATACOMB_GCIPHER_H +# include "gcipher.h" +#endif + +#ifndef CATACOMB_GRAND_H +# include "grand.h" +#endif + /*----- Data structures ---------------------------------------------------*/ typedef struct rc4_ctx { @@ -151,6 +162,25 @@ extern void rc4_encrypt(rc4_ctx */*ctx*/, const void */*src*/, void */*dest*/, size_t /*sz*/); +/*----- Generic cipher interface ------------------------------------------*/ + +extern const gccipher rc4; + +/*----- Generic random number generator interface -------------------------*/ + +/* --- @rc4_rand@ --- * + * + * Arguments: @const void *k@ = pointer to key material + * @size_t sz@ = size of key material + * + * Returns: Pointer to generic random number generator interface. + * + * Use: Creates a random number interface wrapper around an + * OFB-mode block cipher. + */ + +extern grand *rc4_rand(const void */*k*/, size_t /*sz*/); + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus -- 2.11.0