* getkey.c (parse_auto_key_locate): Fix dupe-removal code.
[gnupg.git] / cipher / blowfish.c
index d8ad1d0..1a1ce56 100644 (file)
@@ -15,7 +15,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  *
  * For a description of the algorithm, see:
  *   Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
@@ -35,9 +36,9 @@
 #include <string.h>
 #include <assert.h>
 #include "types.h"
+#include "util.h"
 #include "errors.h"
-#include "blowfish.h"
-#include "dynload.h"
+#include "algorithms.h"
 
 
 
@@ -54,10 +55,7 @@ typedef struct {
     u32 p[BLOWFISH_ROUNDS+2];
 } BLOWFISH_context;
 
-static int  bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen );
-static void encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf );
-static void decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf );
-
+static int bf_setkey( void *c, const byte *key, unsigned keylen );
 
 /* precomputed S boxes */
 static const u32 ks0[256] = {
@@ -253,27 +251,27 @@ function_F( BLOWFISH_context *bc, u32 x )
 {
     u16 a, b, c, d;
 
-  #ifdef BIG_ENDIAN_HOST
+#ifdef BIG_ENDIAN_HOST
     a = ((byte*)&x)[0];
     b = ((byte*)&x)[1];
     c = ((byte*)&x)[2];
     d = ((byte*)&x)[3];
-  #else
+#else
     a = ((byte*)&x)[3];
     b = ((byte*)&x)[2];
     c = ((byte*)&x)[1];
     d = ((byte*)&x)[0];
-  #endif
+#endif
 
     return ((bc->s0[a] + bc->s1[b]) ^ bc->s2[c] ) + bc->s3[d];
 }
 #endif
 
 #ifdef BIG_ENDIAN_HOST
-  #define F(x) ((( s0[((byte*)&x)[0]] + s1[((byte*)&x)[1]])     \
+#define F(x) ((( s0[((byte*)&x)[0]] + s1[((byte*)&x)[1]])       \
                   ^ s2[((byte*)&x)[2]]) + s3[((byte*)&x)[3]] )
 #else
-  #define F(x) ((( s0[((byte*)&x)[3]] + s1[((byte*)&x)[2]])     \
+#define F(x) ((( s0[((byte*)&x)[3]] + s1[((byte*)&x)[2]])       \
                   ^ s2[((byte*)&x)[1]]) + s3[((byte*)&x)[0]] )
 #endif
 #define R(l,r,i)  do { l ^= p[i]; r ^= F(l); } while(0)
@@ -283,7 +281,7 @@ burn_stack (int bytes)
 {
     char buf[64];
     
-    memset (buf, 0, sizeof buf);
+    wipememory(buf,sizeof buf);
     bytes -= sizeof buf;
     if (bytes > 0)
         burn_stack (bytes);
@@ -293,7 +291,7 @@ burn_stack (int bytes)
 static void
 do_encrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
 {
-  #if BLOWFISH_ROUNDS == 16
+#if BLOWFISH_ROUNDS == 16
     u32 xl, xr, *s0, *s1, *s2, *s3, *p;
 
     xl = *ret_xl;
@@ -327,7 +325,7 @@ do_encrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
     *ret_xl = xr;
     *ret_xr = xl;
 
-  #else
+#else
     u32 xl, xr, temp, *p;
     int i;
 
@@ -351,14 +349,14 @@ do_encrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
 
     *ret_xl = xl;
     *ret_xr = xr;
-  #endif
+#endif
 }
 
 
 static void
 decrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
 {
-  #if BLOWFISH_ROUNDS == 16
+#if BLOWFISH_ROUNDS == 16
     u32 xl, xr, *s0, *s1, *s2, *s3, *p;
 
     xl = *ret_xl;
@@ -392,7 +390,7 @@ decrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
     *ret_xl = xr;
     *ret_xr = xl;
 
-  #else
+#else
     u32 xl, xr, temp, *p;
     int i;
 
@@ -417,14 +415,14 @@ decrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
 
     *ret_xl = xl;
     *ret_xr = xr;
-  #endif
+#endif
 }
 
 #undef F
 #undef R
 
 static void
-do_encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
+do_encrypt_block( BLOWFISH_context *bc, byte *outbuf, const byte *inbuf )
 {
     u32 d1, d2;
 
@@ -442,14 +440,14 @@ do_encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
 }
 
 static void
-encrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
+encrypt_block( void *bc, byte *outbuf, const byte *inbuf )
 {
     do_encrypt_block (bc, outbuf, inbuf);
     burn_stack (64);
 }
 
 static void
-do_decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
+do_decrypt_block( BLOWFISH_context *bc, byte *outbuf, const byte *inbuf )
 {
     u32 d1, d2;
 
@@ -467,7 +465,7 @@ do_decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
 }
 
 static void
-decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
+decrypt_block( void *bc, byte *outbuf, const byte *inbuf )
 {
     do_decrypt_block (bc, outbuf, inbuf);
     burn_stack (64);
@@ -502,13 +500,9 @@ selftest(void)
     return NULL;
 }
 
-#ifdef __riscos__
-/* need to switch off CSE optimisation for Norcroft C (Acorn/Pace) */
-#pragma no_optimise_cse
-#endif /* __riscos__ */
 
 static int
-do_bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
+do_bf_setkey( BLOWFISH_context *c, const byte *key, unsigned keylen )
 {
     int i, j;
     u32 data, datal, datar;
@@ -534,17 +528,17 @@ do_bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
     }
 
     for(i=j=0; i < BLOWFISH_ROUNDS+2; i++ ) {
-      #ifdef BIG_ENDIAN_HOST
+#ifdef BIG_ENDIAN_HOST
        ((byte*)&data)[0] = key[j];
        ((byte*)&data)[1] = key[(j+1)%keylen];
        ((byte*)&data)[2] = key[(j+2)%keylen];
        ((byte*)&data)[3] = key[(j+3)%keylen];
-      #else
+#else
        ((byte*)&data)[3] = key[j];
        ((byte*)&data)[2] = key[(j+1)%keylen];
        ((byte*)&data)[1] = key[(j+2)%keylen];
        ((byte*)&data)[0] = key[(j+3)%keylen];
-      #endif
+#endif
        c->p[i] ^= data;
        j = (j+4) % keylen;
     }
@@ -590,12 +584,8 @@ do_bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
     return 0;
 }
 
-#ifdef __riscos__
-#pragma optimise_cse
-#endif /* __riscos__ */
-
 static int
-bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
+bf_setkey( void *c, const byte *key, unsigned keylen )
 {
     int rc = do_bf_setkey (c, key, keylen);
     burn_stack (64);
@@ -609,25 +599,21 @@ bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
  *         the ALGO is invalid.
  */
 const char *
-blowfish_get_info( int algo, size_t *keylen,
-                  size_t *blocksize, size_t *contextsize,
-                  int  (**r_setkey)( void *c, byte *key, unsigned keylen ),
-                  void (**r_encrypt)( void *c, byte *outbuf, byte *inbuf ),
-                  void (**r_decrypt)( void *c, byte *outbuf, byte *inbuf )
-                )
+blowfish_get_info(int algo, size_t *keylen,
+                 size_t *blocksize, size_t *contextsize,
+                 int (**r_setkey)(void *c, const byte *key, unsigned keylen),
+                 void (**r_encrypt)(void *c, byte *outbuf, const byte *inbuf),
+                 void (**r_decrypt)( void *c, byte *outbuf, const byte *inbuf)
+                 )
 {
     *keylen = 128;
     *blocksize = BLOWFISH_BLOCKSIZE;
     *contextsize = sizeof(BLOWFISH_context);
-    *(int  (**)(BLOWFISH_context*, byte*, unsigned))r_setkey
-                                                       = bf_setkey;
-    *(void (**)(BLOWFISH_context*, byte*, byte*))r_encrypt
-                                                       = encrypt_block;
-    *(void (**)(BLOWFISH_context*, byte*, byte*))r_decrypt
-                                                       = decrypt_block;
+    *r_setkey = bf_setkey;
+    *r_encrypt = encrypt_block;
+    *r_decrypt = decrypt_block;
 
     if( algo == CIPHER_ALGO_BLOWFISH )
        return "BLOWFISH";
     return NULL;
 }
-