diff options
Diffstat (limited to 'cipher')
-rw-r--r-- | cipher/ChangeLog | 14 | ||||
-rw-r--r-- | cipher/Makefile.am | 1 | ||||
-rw-r--r-- | cipher/cipher.c | 50 | ||||
-rw-r--r-- | cipher/md.c | 19 | ||||
-rw-r--r-- | cipher/random.h | 2 | ||||
-rw-r--r-- | cipher/rsa.c | 5 | ||||
-rw-r--r-- | cipher/sha1.c | 2 |
7 files changed, 75 insertions, 18 deletions
diff --git a/cipher/ChangeLog b/cipher/ChangeLog index 2e4ebe53e..1d793ec34 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,17 @@ +Wed Oct 4 13:16:18 CEST 2000 Werner Koch <[email protected]> + + * sha1.c (transform): Use rol() macro. Actually this is not needed + for a newer gcc but there are still aoter compilers. + + * rsa.c (test_keys): Use new random function. + + * md.c (gcry_md_setkey): New function to overcome problems with + const conflics. + (gcry_md_ctl): Pass set key to the new functions. + + * rijndael.c: New. + * cipher.c: Add Rijndael support. + Mon Sep 18 16:35:45 CEST 2000 Werner Koch <[email protected]> * rndlinux.c (open_device): Loose random device checking. diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 26de92520..6feea1563 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -36,6 +36,7 @@ libcipher_la_SOURCES = cipher.c \ bithelp.h \ des.c \ des.h \ + rijndael.c \ twofish.c \ blowfish.c \ blowfish.h \ diff --git a/cipher/cipher.c b/cipher/cipher.c index 7808d8769..d36db6652 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -33,7 +33,7 @@ #include "dynload.h" #define MAX_BLOCKSIZE 16 -#define TABLE_SIZE 10 +#define TABLE_SIZE 12 #define CTX_MAGIC_NORMAL 0x24091964 #define CTX_MAGIC_SECURE 0x46919042 @@ -82,11 +82,43 @@ dummy_decrypt_block( void *c, byte *outbuf, byte *inbuf ) { BUG(); } static void setup_cipher_table(void) { - int i; i = 0; - cipher_table[i].algo = CIPHER_ALGO_TWOFISH; + cipher_table[i].algo = GCRY_CIPHER_RIJNDAEL; + cipher_table[i].name = rijndael_get_info( cipher_table[i].algo, + &cipher_table[i].keylen, + &cipher_table[i].blocksize, + &cipher_table[i].contextsize, + &cipher_table[i].setkey, + &cipher_table[i].encrypt, + &cipher_table[i].decrypt ); + if( !cipher_table[i].name ) + BUG(); + i++; + cipher_table[i].algo = GCRY_CIPHER_RIJNDAEL192; + cipher_table[i].name = rijndael_get_info( cipher_table[i].algo, + &cipher_table[i].keylen, + &cipher_table[i].blocksize, + &cipher_table[i].contextsize, + &cipher_table[i].setkey, + &cipher_table[i].encrypt, + &cipher_table[i].decrypt ); + if( !cipher_table[i].name ) + BUG(); + i++; + cipher_table[i].algo = GCRY_CIPHER_RIJNDAEL256; + cipher_table[i].name = rijndael_get_info( cipher_table[i].algo, + &cipher_table[i].keylen, + &cipher_table[i].blocksize, + &cipher_table[i].contextsize, + &cipher_table[i].setkey, + &cipher_table[i].encrypt, + &cipher_table[i].decrypt ); + if( !cipher_table[i].name ) + BUG(); + i++; + cipher_table[i].algo = GCRY_CIPHER_TWOFISH; cipher_table[i].name = twofish_get_info( cipher_table[i].algo, &cipher_table[i].keylen, &cipher_table[i].blocksize, @@ -97,7 +129,7 @@ setup_cipher_table(void) if( !cipher_table[i].name ) BUG(); i++; - cipher_table[i].algo = CIPHER_ALGO_BLOWFISH; + cipher_table[i].algo = GCRY_CIPHER_BLOWFISH; cipher_table[i].name = blowfish_get_info( cipher_table[i].algo, &cipher_table[i].keylen, &cipher_table[i].blocksize, @@ -108,7 +140,7 @@ setup_cipher_table(void) if( !cipher_table[i].name ) BUG(); i++; - cipher_table[i].algo = CIPHER_ALGO_CAST5; + cipher_table[i].algo = GCRY_CIPHER_CAST5; cipher_table[i].name = cast5_get_info( cipher_table[i].algo, &cipher_table[i].keylen, &cipher_table[i].blocksize, @@ -119,7 +151,7 @@ setup_cipher_table(void) if( !cipher_table[i].name ) BUG(); i++; - cipher_table[i].algo = CIPHER_ALGO_3DES; + cipher_table[i].algo = GCRY_CIPHER_3DES; cipher_table[i].name = des_get_info( cipher_table[i].algo, &cipher_table[i].keylen, &cipher_table[i].blocksize, @@ -455,7 +487,7 @@ do_ecb_encrypt( GCRY_CIPHER_HD c, byte *outbuf, const byte *inbuf, unsigned nblo unsigned n; for(n=0; n < nblocks; n++ ) { - (*c->encrypt)( &c->context.c, outbuf, inbuf ); + (*c->encrypt)( &c->context.c, outbuf, (byte*)/*arggg*/inbuf ); inbuf += c->blocksize; outbuf += c->blocksize; } @@ -467,7 +499,7 @@ do_ecb_decrypt( GCRY_CIPHER_HD c, byte *outbuf, const byte *inbuf, unsigned nblo unsigned n; for(n=0; n < nblocks; n++ ) { - (*c->decrypt)( &c->context.c, outbuf, inbuf ); + (*c->decrypt)( &c->context.c, outbuf, (byte*)/*arggg*/inbuf ); inbuf += c->blocksize; outbuf += c->blocksize; } @@ -507,7 +539,7 @@ do_cbc_decrypt( GCRY_CIPHER_HD c, byte *outbuf, const byte *inbuf, unsigned nblo * to save the original ciphertext block. We use lastiv * for this here because it is not used otherwise */ memcpy(c->lastiv, inbuf, blocksize ); - (*c->decrypt)( &c->context.c, outbuf, inbuf ); + (*c->decrypt)( &c->context.c, outbuf, (char*)/*argggg*/inbuf ); for(ivp=c->iv,i=0; i < blocksize; i++ ) outbuf[i] ^= *ivp++; memcpy(c->iv, c->lastiv, blocksize ); diff --git a/cipher/md.c b/cipher/md.c index e8ac8ac24..29d6afed8 100644 --- a/cipher/md.c +++ b/cipher/md.c @@ -557,10 +557,7 @@ gcry_md_ctl( GCRY_MD_HD hd, int cmd, byte *buffer, size_t buflen) if( cmd == GCRYCTL_FINALIZE ) md_final( hd ); else if( cmd == GCRYCTL_SET_KEY ) { - if( !(hd->ctx->macpads ) ) - rc = GCRYERR_CONFLICT; - else if ( !(rc = prepare_macpads( hd, buffer, buflen )) ) - gcry_md_reset( hd ); + rc = gcry_md_setkey ( hd, buffer, buflen ); } else if( cmd == GCRYCTL_START_DUMP ) { md_start_debug( hd, buffer ); @@ -574,6 +571,20 @@ gcry_md_ctl( GCRY_MD_HD hd, int cmd, byte *buffer, size_t buflen) } +int +gcry_md_setkey( GCRY_MD_HD hd, const char *key, size_t keylen ) +{ + int rc = 0; + + if( !(hd->ctx->macpads ) ) + rc = GCRYERR_CONFLICT; + else if ( !(rc = prepare_macpads( hd, key, keylen )) ) + gcry_md_reset( hd ); + + return rc; +} + + /**************** * if ALGO is null get the digest for the used algo (which should be only one) */ diff --git a/cipher/random.h b/cipher/random.h index 9a7dd8f68..d96cea7f3 100644 --- a/cipher/random.h +++ b/cipher/random.h @@ -27,6 +27,8 @@ void random_dump_stats(void); void secure_random_alloc(void); int quick_random_gen( int onoff ); int random_is_faked(void); +void secure_random_alloc(void); +void random_dump_stats(void); byte *get_random_bits( size_t nbits, int level, int secure ); void fast_random_poll( void ); diff --git a/cipher/rsa.c b/cipher/rsa.c index 2bb451002..f342e3c35 100644 --- a/cipher/rsa.c +++ b/cipher/rsa.c @@ -67,10 +67,7 @@ test_keys( RSA_secret_key *sk, unsigned nbits ) pk.n = sk->n; pk.e = sk->e; - { char *p = get_random_bits( nbits, 0, 0 ); - mpi_set_buffer( test, p, (nbits+7)/8, 0 ); - g10_free(p); - } + gcry_mpi_randomize( test, nbits, GCRY_WEAK_RANDOM ); public( out1, test, &pk ); secret( out2, out1, sk ); diff --git a/cipher/sha1.c b/cipher/sha1.c index aa3ac092f..a0438dbd6 100644 --- a/cipher/sha1.c +++ b/cipher/sha1.c @@ -108,7 +108,7 @@ transform( SHA1_CONTEXT *hd, byte *data ) #define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] \ ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \ - , (x[i&0x0f] = (tm << 1) | (tm >> 31)) ) + , (x[i&0x0f] = rol(tm, 1)) ) #define R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \ + f( b, c, d ) \ |