diff options
author | Werner Koch <wk@gnupg.org> | 1998-04-07 20:16:10 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 1998-04-07 20:16:10 +0200 |
commit | 86f261dbc50544d73e4b9ae71fcbc2c6df5b9612 (patch) | |
tree | d3ba75484a73e1fe891f7ff862ab1f3722cb126c /cipher/blowfish.c | |
parent | cast5 does now work (diff) | |
download | gnupg2-86f261dbc50544d73e4b9ae71fcbc2c6df5b9612.tar.xz gnupg2-86f261dbc50544d73e4b9ae71fcbc2c6df5b9612.zip |
cipher reorganisiert
Diffstat (limited to 'cipher/blowfish.c')
-rw-r--r-- | cipher/blowfish.c | 202 |
1 files changed, 8 insertions, 194 deletions
diff --git a/cipher/blowfish.c b/cipher/blowfish.c index 09b15767d..9e3c2bdcc 100644 --- a/cipher/blowfish.c +++ b/cipher/blowfish.c @@ -37,7 +37,6 @@ #include "util.h" #include "types.h" #include "blowfish.h" -#include "random.h" /* precomputed S boxes */ static const u32 ks0[256] = { @@ -392,8 +391,8 @@ decrypt( BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr ) #undef F #undef R -static void -encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf ) +void +blowfish_encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf ) { u32 d1, d2; @@ -429,8 +428,8 @@ encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf ) } -static void -decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf ) +void +blowfish_decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf ) { u32 d1, d2; @@ -477,18 +476,18 @@ selftest() byte cipher3[] = { 0xE1, 0x13, 0xF4, 0x10, 0x2C, 0xFC, 0xCE, 0x43 }; blowfish_setkey( &c, "abcdefghijklmnopqrstuvwxyz", 26 ); - encrypt_block( &c, buffer, plain ); + blowfish_encrypt_block( &c, buffer, plain ); if( memcmp( buffer, "\x32\x4E\xD0\xFE\xF4\x13\xA2\x03", 8 ) ) log_error("wrong blowfish encryption\n"); - decrypt_block( &c, buffer, buffer ); + blowfish_decrypt_block( &c, buffer, buffer ); if( memcmp( buffer, plain, 8 ) ) log_bug("blowfish failed\n"); blowfish_setkey( &c, key3, 8 ); - encrypt_block( &c, buffer, plain3 ); + blowfish_encrypt_block( &c, buffer, plain3 ); if( memcmp( buffer, cipher3, 8 ) ) log_error("wrong blowfish encryption (3)\n"); - decrypt_block( &c, buffer, buffer ); + blowfish_decrypt_block( &c, buffer, buffer ); if( memcmp( buffer, plain3, 8 ) ) log_bug("blowfish failed (3)\n"); } @@ -507,8 +506,6 @@ blowfish_setkey( BLOWFISH_context *c, byte *key, unsigned keylen ) selftest(); } - fast_random_poll(); - for(i=0; i < BLOWFISH_ROUNDS+2; i++ ) c->p[i] = ps[i]; for(i=0; i < 256; i++ ) { @@ -563,186 +560,3 @@ blowfish_setkey( BLOWFISH_context *c, byte *key, unsigned keylen ) } -void -blowfish_setiv( BLOWFISH_context *c, byte *iv ) -{ - if( iv ) - memcpy( c->iv, iv, BLOWFISH_BLOCKSIZE ); - else - memset( c->iv, 0, BLOWFISH_BLOCKSIZE ); - c->count = 0; - encrypt_block( c, c->eniv, c->iv ); -} - - -void -blowfish_encode( BLOWFISH_context *c, byte *outbuf, byte *inbuf, - unsigned nblocks ) -{ - unsigned n; - - for(n=0; n < nblocks; n++ ) { - encrypt_block( c, outbuf, inbuf ); - inbuf += BLOWFISH_BLOCKSIZE;; - outbuf += BLOWFISH_BLOCKSIZE; - } -} - -void -blowfish_decode( BLOWFISH_context *c, byte *outbuf, byte *inbuf, - unsigned nblocks ) -{ - unsigned n; - - for(n=0; n < nblocks; n++ ) { - decrypt_block( c, outbuf, inbuf ); - inbuf += BLOWFISH_BLOCKSIZE;; - outbuf += BLOWFISH_BLOCKSIZE; - } -} - - - -/**************** - * FIXME: Make use of bigger chunks - * (out may overlap with a or b) - */ -static void -xorblock( byte *out, byte *a, byte *b, unsigned count ) -{ - for( ; count ; count--, a++, b++ ) - *out++ = *a ^ *b ; -} - - - -/**************** - * Encode buffer in CFB mode. nbytes can be an arbitrary value. - */ -void -blowfish_encode_cfb( BLOWFISH_context *c, byte *outbuf, - byte *inbuf, unsigned nbytes) -{ - unsigned n; - int is_aligned; - - if( c->count ) { /* must make a full block first */ - assert( c->count < BLOWFISH_BLOCKSIZE ); - n = BLOWFISH_BLOCKSIZE - c->count; - if( n > nbytes ) - n = nbytes; - xorblock( outbuf, c->eniv+c->count, inbuf, n); - memcpy( c->iv+c->count, outbuf, n); - c->count += n; - nbytes -= n; - inbuf += n; - outbuf += n; - assert( c->count <= BLOWFISH_BLOCKSIZE); - if( c->count == BLOWFISH_BLOCKSIZE ) { - encrypt_block( c, c->eniv, c->iv ); - c->count = 0; - } - else - return; - } - assert(!c->count); - is_aligned = !((ulong)inbuf % SIZEOF_UNSIGNED_LONG); - while( nbytes >= BLOWFISH_BLOCKSIZE ) { - if( is_aligned ) { - #if SIZEOF_UNSIGNED_LONG == BLOWFISH_BLOCKSIZE - *(ulong*)outbuf = *(ulong*)c->eniv ^ *(ulong*)inbuf; - #elif (2*SIZEOF_UNSIGNED_LONG) == BLOWFISH_BLOCKSIZE - ((ulong*)outbuf)[0] = ((ulong*)c->eniv)[0] ^ ((ulong*)inbuf)[0]; - ((ulong*)outbuf)[1] = ((ulong*)c->eniv)[1] ^ ((ulong*)inbuf)[1]; - #elif (4*SIZEOF_UNSIGNED_LONG) == BLOWFISH_BLOCKSIZE - ((ulong*)outbuf)[0] = ((ulong*)c->eniv)[0] ^ ((ulong*)inbuf)[0]; - ((ulong*)outbuf)[1] = ((ulong*)c->eniv)[1] ^ ((ulong*)inbuf)[1]; - ((ulong*)outbuf)[2] = ((ulong*)c->eniv)[2] ^ ((ulong*)inbuf)[2]; - ((ulong*)outbuf)[3] = ((ulong*)c->eniv)[3] ^ ((ulong*)inbuf)[3]; - #else - #error Please remove this info line. - xorblock( outbuf, c->eniv, inbuf, BLOWFISH_BLOCKSIZE); - #endif - } - else /* not aligned */ - xorblock( outbuf, c->eniv, inbuf, BLOWFISH_BLOCKSIZE); - memcpy( c->iv, outbuf, BLOWFISH_BLOCKSIZE); - encrypt_block( c, c->eniv, c->iv ); - nbytes -= BLOWFISH_BLOCKSIZE; - inbuf += BLOWFISH_BLOCKSIZE; - outbuf += BLOWFISH_BLOCKSIZE; - } - - if( nbytes ) { - xorblock( outbuf, c->eniv, inbuf, nbytes ); - memcpy( c->iv, outbuf, nbytes ); - c->count = nbytes; - } - -} - - -void -blowfish_decode_cfb( BLOWFISH_context *c, byte *outbuf, - byte *inbuf, unsigned nbytes) -{ - unsigned n; - int is_aligned; - - if( c->count ) { /* must make a full block first */ - assert( c->count < BLOWFISH_BLOCKSIZE ); - n = BLOWFISH_BLOCKSIZE - c->count; - if( n > nbytes ) - n = nbytes; - memcpy( c->iv+c->count, inbuf, n); - xorblock( outbuf, c->eniv+c->count, inbuf, n); - c->count += n; - nbytes -= n; - inbuf += n; - outbuf += n; - assert( c->count <= BLOWFISH_BLOCKSIZE); - if( c->count == BLOWFISH_BLOCKSIZE ) { - encrypt_block( c, c->eniv, c->iv ); - c->count = 0; - } - else - return; - } - - assert(!c->count); - is_aligned = !((ulong)inbuf % SIZEOF_UNSIGNED_LONG); - while( nbytes >= BLOWFISH_BLOCKSIZE ) { - memcpy( c->iv, inbuf, BLOWFISH_BLOCKSIZE); - if( is_aligned ) { - #if SIZEOF_UNSIGNED_LONG == BLOWFISH_BLOCKSIZE - *(ulong*)outbuf = *(ulong*)c->eniv ^ *(ulong*)inbuf; - #elif (2*SIZEOF_UNSIGNED_LONG) == BLOWFISH_BLOCKSIZE - ((ulong*)outbuf)[0] = ((ulong*)c->eniv)[0] ^ ((ulong*)inbuf)[0]; - ((ulong*)outbuf)[1] = ((ulong*)c->eniv)[1] ^ ((ulong*)inbuf)[1]; - #elif (4*SIZEOF_UNSIGNED_LONG) == BLOWFISH_BLOCKSIZE - ((ulong*)outbuf)[0] = ((ulong*)c->eniv)[0] ^ ((ulong*)inbuf)[0]; - ((ulong*)outbuf)[1] = ((ulong*)c->eniv)[1] ^ ((ulong*)inbuf)[1]; - ((ulong*)outbuf)[2] = ((ulong*)c->eniv)[2] ^ ((ulong*)inbuf)[2]; - ((ulong*)outbuf)[3] = ((ulong*)c->eniv)[3] ^ ((ulong*)inbuf)[3]; - #else - #error Please remove this info line. - xorblock( outbuf, c->eniv, inbuf, BLOWFISH_BLOCKSIZE); - #endif - } - else /* not aligned */ - xorblock( outbuf, c->eniv, inbuf, BLOWFISH_BLOCKSIZE); - encrypt_block( c, c->eniv, c->iv ); - nbytes -= BLOWFISH_BLOCKSIZE; - inbuf += BLOWFISH_BLOCKSIZE; - outbuf += BLOWFISH_BLOCKSIZE; - } - - if( nbytes ) { - memcpy( c->iv, inbuf, nbytes ); - xorblock( outbuf, c->eniv, inbuf, nbytes ); - c->count = nbytes; - } - -} - - |