Add PowerPC extra CFLAGS also for chacha20-ppc and crc-ppc
[libgcrypt.git] / cipher / idea.c
index 39c9720..abfe675 100644 (file)
@@ -1,5 +1,6 @@
 /* idea.c  -  IDEA function
- *     Copyright (c) 1997, 1998, 1999, 2001 by Werner Koch (dd9jn)
+ * Copyright 1997, 1998, 1999, 2001 Werner Koch (dd9jn)
+ * Copyright 2013 g10 Code GmbH
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -49,9 +50,6 @@
 #include "cipher.h"
 
 
-#define FNCCAST_SETKEY(f)  ((int(*)(void*, byte*, unsigned int))(f))
-#define FNCCAST_CRYPT(f)   ((void(*)(void*, byte*, byte*))(f))
-
 #define IDEA_KEYSIZE 16
 #define IDEA_BLOCKSIZE 8
 #define IDEA_ROUNDS 8
@@ -74,8 +72,8 @@ mul_inv( u16 x )
 
     if( x < 2 )
        return x;
-    t1 = 0x10001L / x;
-    y =  0x10001L % x;
+    t1 = 0x10001UL / x;
+    y =  0x10001UL % x;
     if( y == 1 )
        return (1-t1) & 0xffff;
 
@@ -154,17 +152,21 @@ invert_key( u16 *ek, u16 dk[IDEA_KEYLEN] )
     *--p = t2;
     *--p = t1;
     memcpy(dk, temp, sizeof(temp) );
-    memset(temp, 0, sizeof(temp) );  /* burn temp */
+    wipememory(temp, sizeof(temp));
 }
 
 
 static void
 cipher( byte *outbuf, const byte *inbuf, u16 *key )
 {
-    u16 x1, x2, x3,x4, s2, s3;
-    u16 *in, *out;
+    u16 s2, s3;
+    u16 in[4];
     int r = IDEA_ROUNDS;
-  #define MUL(x,y) \
+#define x1 (in[0])
+#define x2 (in[1])
+#define x3 (in[2])
+#define x4 (in[3])
+#define MUL(x,y) \
        do {u16 _t16; u32 _t32;                     \
            if( (_t16 = (y)) ) {                    \
                if( (x = (x)&0xffff) ) {            \
@@ -182,17 +184,13 @@ cipher( byte *outbuf, const byte *inbuf, u16 *key )
            }                                       \
        } while(0)
 
-    in = (u16*)inbuf;
-    x1 = *in++;
-    x2 = *in++;
-    x3 = *in++;
-    x4 = *in;
-  #ifndef WORDS_BIGENDIAN
+    memcpy (in, inbuf, sizeof in);
+#ifndef WORDS_BIGENDIAN
     x1 = (x1>>8) | (x1<<8);
     x2 = (x2>>8) | (x2<<8);
     x3 = (x3>>8) | (x3<<8);
     x4 = (x4>>8) | (x4<<8);
-  #endif
+#endif
     do {
        MUL(x1, *key++);
        x2 += *key++;
@@ -219,19 +217,21 @@ cipher( byte *outbuf, const byte *inbuf, u16 *key )
     x2 += *key++;
     MUL(x4, *key);
 
-    out = (u16*)outbuf;
-  #ifndef WORDS_BIGENDIAN
-    *out++ = (x1>>8) | (x1<<8);
-    *out++ = (x3>>8) | (x3<<8);
-    *out++ = (x2>>8) | (x2<<8);
-    *out   = (x4>>8) | (x4<<8);
-  #else
-    *out++ = x1;
-    *out++ = x3;
-    *out++ = x2;
-    *out   = x4;
-  #endif
-  #undef MUL
+#ifndef WORDS_BIGENDIAN
+    x1 = (x1>>8) | (x1<<8);
+    x2 = (x2>>8) | (x2<<8);
+    x3 = (x3>>8) | (x3<<8);
+    x4 = (x4>>8) | (x4<<8);
+#endif
+    memcpy (outbuf+0, &x1, 2);
+    memcpy (outbuf+2, &x3, 2);
+    memcpy (outbuf+4, &x2, 2);
+    memcpy (outbuf+6, &x4, 2);
+#undef MUL
+#undef x1
+#undef x2
+#undef x3
+#undef x4
 }
 
 
@@ -258,10 +258,12 @@ do_setkey( IDEA_context *c, const byte *key, unsigned int keylen )
 }
 
 static gcry_err_code_t
-idea_setkey (void *context, const byte *key, unsigned int keylen)
+idea_setkey (void *context, const byte *key, unsigned int keylen,
+             gcry_cipher_hd_t hd)
 {
     IDEA_context *ctx = context;
     int rc = do_setkey (ctx, key, keylen);
+    (void)hd;
     _gcry_burn_stack (23+6*sizeof(void*));
     return rc;
 }
@@ -272,12 +274,12 @@ encrypt_block( IDEA_context *c, byte *outbuf, const byte *inbuf )
     cipher( outbuf, inbuf, c->ek );
 }
 
-static void
+static unsigned int
 idea_encrypt (void *context, byte *out, const byte *in)
 {
     IDEA_context *ctx = context;
     encrypt_block (ctx, out, in);
-    _gcry_burn_stack (24+3*sizeof (void*));
+    return /*burn_stack*/ (24+3*sizeof (void*));
 }
 
 static void
@@ -290,12 +292,12 @@ decrypt_block( IDEA_context *c, byte *outbuf, const byte *inbuf )
     cipher( outbuf, inbuf, c->dk );
 }
 
-static void
+static unsigned int
 idea_decrypt (void *context, byte *out, const byte *in)
 {
     IDEA_context *ctx = context;
     decrypt_block (ctx, out, in);
-    _gcry_burn_stack (24+3*sizeof (void*));
+    return /*burn_stack*/ (24+3*sizeof (void*));
 }
 
 
@@ -371,8 +373,9 @@ static struct {
 
 
 gcry_cipher_spec_t _gcry_cipher_spec_idea =
-{
+  {
+    GCRY_CIPHER_IDEA, {0, 0},
     "IDEA", NULL, NULL, IDEA_BLOCKSIZE, 128,
     sizeof (IDEA_context),
     idea_setkey, idea_encrypt, idea_decrypt
-};
+  };