summaryrefslogtreecommitdiff
path: root/cipher/cast5.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>1998-04-07 18:16:08 +0000
committerWerner Koch <wk@gnupg.org>1998-04-07 18:16:08 +0000
commitec42def828299fdb906da477fcf444ce6bb866f9 (patch)
treeeadad240c42d34b6c3857479fda9ae15eeae8fa8 /cipher/cast5.c
parent309bdcc428ef09caad953fe880b244ae1d28dd89 (diff)
downloadlibgcrypt-ec42def828299fdb906da477fcf444ce6bb866f9.tar.gz
cipher reorganisiert
Diffstat (limited to 'cipher/cast5.c')
-rw-r--r--cipher/cast5.c217
1 files changed, 10 insertions, 207 deletions
diff --git a/cipher/cast5.c b/cipher/cast5.c
index a14abaa3..99791e05 100644
--- a/cipher/cast5.c
+++ b/cipher/cast5.c
@@ -43,7 +43,6 @@
#include "util.h"
#include "types.h"
#include "cast5.h"
-#include "random.h"
static const u32 s1[256] = {
0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,
@@ -339,8 +338,8 @@ rol(int n, u32 x)
#define F3(D,m,r) ( (I = ((m) - (D))), (I=rol((r),I)), \
(((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) )
-static void
-encrypt_block( CAST5_context *c, byte *outbuf, byte *inbuf )
+void
+cast5_encrypt_block( CAST5_context *c, byte *outbuf, byte *inbuf )
{
u32 l, r, t;
u32 I; /* used by the Fx macros */
@@ -393,8 +392,8 @@ encrypt_block( CAST5_context *c, byte *outbuf, byte *inbuf )
outbuf[7] = l & 0xff;
}
-static void
-decrypt_block( CAST5_context *c, byte *outbuf, byte *inbuf )
+void
+cast5_decrypt_block( CAST5_context *c, byte *outbuf, byte *inbuf )
{
u32 l, r, t;
u32 I;
@@ -447,10 +446,10 @@ selftest()
byte buffer[8];
cast5_setkey( &c, key, 16 );
- encrypt_block( &c, buffer, plain );
+ cast5_encrypt_block( &c, buffer, plain );
if( memcmp( buffer, cipher, 8 ) )
log_error("wrong cast5-128 encryption\n");
- decrypt_block( &c, buffer, buffer );
+ cast5_decrypt_block( &c, buffer, buffer );
if( memcmp( buffer, plain, 8 ) )
log_bug("cast5-128 failed\n");
@@ -468,11 +467,11 @@ selftest()
for(i=0; i < 1000000; i++ ) {
cast5_setkey( &c, b0, 16 );
- encrypt_block( &c, a0, a0 );
- encrypt_block( &c, a0+8, a0+8 );
+ cast5_encrypt_block( &c, a0, a0 );
+ cast5_encrypt_block( &c, a0+8, a0+8 );
cast5_setkey( &c, a0, 16 );
- encrypt_block( &c, b0, b0 );
- encrypt_block( &c, b0+8, b0+8 );
+ cast5_encrypt_block( &c, b0, b0 );
+ cast5_encrypt_block( &c, b0+8, b0+8 );
}
if( memcmp( a0, a1, 16 ) || memcmp( b0, b1, 16 ) )
log_bug("cast5-128 maintenance test failed\n");
@@ -543,7 +542,6 @@ cast5_setkey( CAST5_context *c, byte *key, unsigned keylen )
initialized = 1;
selftest();
}
- fast_random_poll();
assert(keylen==16);
x[0] = key[0] << 24 | key[1] << 16 | key[2] << 8 | key[3];
@@ -567,198 +565,3 @@ cast5_setkey( CAST5_context *c, byte *key, unsigned keylen )
}
-void
-cast5_setiv( CAST5_context *c, byte *iv )
-{
- if( iv )
- memcpy( c->iv, iv, CAST5_BLOCKSIZE );
- else
- memset( c->iv, 0, CAST5_BLOCKSIZE );
- c->count = 0;
- encrypt_block( c, c->eniv, c->iv );
-}
-
-
-void
-cast5_encode( CAST5_context *c, byte *outbuf, byte *inbuf,
- unsigned nblocks )
-{
- unsigned n;
-
- for(n=0; n < nblocks; n++ ) {
- encrypt_block( c, outbuf, inbuf );
- inbuf += CAST5_BLOCKSIZE;;
- outbuf += CAST5_BLOCKSIZE;
- }
-}
-
-void
-cast5_decode( CAST5_context *c, byte *outbuf, byte *inbuf,
- unsigned nblocks )
-{
- unsigned n;
-
- for(n=0; n < nblocks; n++ ) {
- decrypt_block( c, outbuf, inbuf );
- inbuf += CAST5_BLOCKSIZE;;
- outbuf += CAST5_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
-cast5_encode_cfb( CAST5_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 < CAST5_BLOCKSIZE );
- n = CAST5_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 <= CAST5_BLOCKSIZE);
- if( c->count == CAST5_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 >= CAST5_BLOCKSIZE ) {
- if( is_aligned ) {
- #if SIZEOF_UNSIGNED_LONG == CAST5_BLOCKSIZE
- *(ulong*)outbuf = *(ulong*)c->eniv ^ *(ulong*)inbuf;
- #elif (2*SIZEOF_UNSIGNED_LONG) == CAST5_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) == CAST5_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, CAST5_BLOCKSIZE);
- #endif
- }
- else /* not aligned */
- xorblock( outbuf, c->eniv, inbuf, CAST5_BLOCKSIZE);
- memcpy( c->iv, outbuf, CAST5_BLOCKSIZE);
- encrypt_block( c, c->eniv, c->iv );
- nbytes -= CAST5_BLOCKSIZE;
- inbuf += CAST5_BLOCKSIZE;
- outbuf += CAST5_BLOCKSIZE;
- }
-
- if( nbytes ) {
- xorblock( outbuf, c->eniv, inbuf, nbytes );
- memcpy( c->iv, outbuf, nbytes );
- c->count = nbytes;
- }
-
-}
-
-
-void
-cast5_decode_cfb( CAST5_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 < CAST5_BLOCKSIZE );
- n = CAST5_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 <= CAST5_BLOCKSIZE);
- if( c->count == CAST5_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 >= CAST5_BLOCKSIZE ) {
- memcpy( c->iv, inbuf, CAST5_BLOCKSIZE);
- if( is_aligned ) {
- #if SIZEOF_UNSIGNED_LONG == CAST5_BLOCKSIZE
- *(ulong*)outbuf = *(ulong*)c->eniv ^ *(ulong*)inbuf;
- #elif (2*SIZEOF_UNSIGNED_LONG) == CAST5_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) == CAST5_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, CAST5_BLOCKSIZE);
- #endif
- }
- else /* not aligned */
- xorblock( outbuf, c->eniv, inbuf, CAST5_BLOCKSIZE);
- encrypt_block( c, c->eniv, c->iv );
- nbytes -= CAST5_BLOCKSIZE;
- inbuf += CAST5_BLOCKSIZE;
- outbuf += CAST5_BLOCKSIZE;
- }
-
- if( nbytes ) {
- memcpy( c->iv, inbuf, nbytes );
- xorblock( outbuf, c->eniv, inbuf, nbytes );
- c->count = nbytes;
- }
-
-}
-
-
-
-void
-cast5_sync_cfb( CAST5_context *c )
-{
- if( c->count ) {
- memmove(c->iv + c->count, c->iv, CAST5_BLOCKSIZE - c->count );
- memcpy(c->iv, c->eniv + CAST5_BLOCKSIZE - c->count, c->count);
- c->count = 0;
- }
-}
-
-