diff options
-rw-r--r-- | cipher/cipher-internal.h | 4 | ||||
-rw-r--r-- | cipher/cipher-ofb.c | 69 | ||||
-rw-r--r-- | cipher/cipher.c | 2 |
3 files changed, 1 insertions, 74 deletions
diff --git a/cipher/cipher-internal.h b/cipher/cipher-internal.h index 981caa83..f528c84e 100644 --- a/cipher/cipher-internal.h +++ b/cipher/cipher-internal.h @@ -173,10 +173,6 @@ gcry_err_code_t _gcry_cipher_ofb_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, unsigned int outbuflen, const unsigned char *inbuf, unsigned int inbuflen); -gcry_err_code_t _gcry_cipher_ofb_decrypt -/* */ (gcry_cipher_hd_t c, - unsigned char *outbuf, unsigned int outbuflen, - const unsigned char *inbuf, unsigned int inbuflen); /*-- cipher-ctr.c --*/ gcry_err_code_t _gcry_cipher_ctr_encrypt diff --git a/cipher/cipher-ofb.c b/cipher/cipher-ofb.c index 333a7481..c6d84dd2 100644 --- a/cipher/cipher-ofb.c +++ b/cipher/cipher-ofb.c @@ -70,7 +70,6 @@ _gcry_cipher_ofb_encrypt (gcry_cipher_hd_t c, while ( inbuflen >= blocksize ) { /* Encrypt the IV (and save the current one). */ - buf_cpy( c->lastiv, c->u_iv.iv, blocksize ); nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ); burn = nburn > burn ? nburn : burn; buf_xor(outbuf, c->u_iv.iv, inbuf, blocksize); @@ -80,74 +79,6 @@ _gcry_cipher_ofb_encrypt (gcry_cipher_hd_t c, } if ( inbuflen ) { /* process the remaining bytes */ - buf_cpy( c->lastiv, c->u_iv.iv, blocksize ); - nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ); - burn = nburn > burn ? nburn : burn; - c->unused = blocksize; - c->unused -= inbuflen; - buf_xor(outbuf, c->u_iv.iv, inbuf, inbuflen); - outbuf += inbuflen; - inbuf += inbuflen; - inbuflen = 0; - } - - if (burn > 0) - _gcry_burn_stack (burn + 4 * sizeof(void *)); - - return 0; -} - - -gcry_err_code_t -_gcry_cipher_ofb_decrypt (gcry_cipher_hd_t c, - unsigned char *outbuf, unsigned int outbuflen, - const unsigned char *inbuf, unsigned int inbuflen) -{ - unsigned char *ivp; - gcry_cipher_encrypt_t enc_fn = c->spec->encrypt; - size_t blocksize = c->spec->blocksize; - unsigned int burn, nburn; - - if (outbuflen < inbuflen) - return GPG_ERR_BUFFER_TOO_SHORT; - - if( inbuflen <= c->unused ) - { - /* Short enough to be encoded by the remaining XOR mask. */ - ivp = c->u_iv.iv + blocksize - c->unused; - buf_xor(outbuf, ivp, inbuf, inbuflen); - c->unused -= inbuflen; - return 0; - } - - burn = 0; - - if ( c->unused ) - { - inbuflen -= c->unused; - ivp = c->u_iv.iv + blocksize - c->unused; - buf_xor(outbuf, ivp, inbuf, c->unused); - outbuf += c->unused; - inbuf += c->unused; - c->unused = 0; - } - - /* Now we can process complete blocks. */ - while ( inbuflen >= blocksize ) - { - /* Encrypt the IV (and save the current one). */ - buf_cpy( c->lastiv, c->u_iv.iv, blocksize ); - nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ); - burn = nburn > burn ? nburn : burn; - buf_xor(outbuf, c->u_iv.iv, inbuf, blocksize); - outbuf += blocksize; - inbuf += blocksize; - inbuflen -= blocksize; - } - if ( inbuflen ) - { /* Process the remaining bytes. */ - /* Encrypt the IV (and save the current one). */ - buf_cpy( c->lastiv, c->u_iv.iv, blocksize ); nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ); burn = nburn > burn ? nburn : burn; c->unused = blocksize; diff --git a/cipher/cipher.c b/cipher/cipher.c index c0d1d0be..df6d2025 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -814,7 +814,7 @@ cipher_decrypt (gcry_cipher_hd_t c, byte *outbuf, unsigned int outbuflen, break; case GCRY_CIPHER_MODE_OFB: - rc = _gcry_cipher_ofb_decrypt (c, outbuf, outbuflen, inbuf, inbuflen); + rc = _gcry_cipher_ofb_encrypt (c, outbuf, outbuflen, inbuf, inbuflen); break; case GCRY_CIPHER_MODE_CTR: |