]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
(byte_swap_32): Deleted macro.
authorNiels Möller <nisse@lysator.liu.se>
Tue, 31 May 2011 21:13:16 +0000 (23:13 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Tue, 31 May 2011 21:13:16 +0000 (23:13 +0200)
(serpent_key_prepare): Use LE_READ_UINT32. Don't require aligned
input, and support arbitrary key sizes.

Rev: nettle/ChangeLog:1.171
Rev: nettle/serpent.c:1.5

ChangeLog
serpent.c

index 96a910f2a7a59974201efd20f385057eaadac092..fd80301fdaaa72d08406cdf0b3cace922ea84d81 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-31  Niels Möller  <nisse@lysator.liu.se>
+
+       * serpent.c (byte_swap_32): Deleted macro.
+       (serpent_key_prepare): Use LE_READ_UINT32. Don't require aligned
+       input, and support arbitrary key sizes.
+
 2011-05-30  Simon Josefsson  <simon@josefsson.org>
 
        * serpent.c: Rewrite, based on libgcrypt code.  License changed
index 1667d65f5191df0d474972ab4e5b71a8d0dfa3e3..6c4ed96a7e63bf306da2f487aff05573e4f9961f 100644 (file)
--- a/serpent.c
+++ b/serpent.c
@@ -60,11 +60,6 @@ typedef uint32_t serpent_block_t[4];
    than 256 bits, it is padded.  */
 typedef uint32_t serpent_key_t[8];
 
-#define byte_swap_32(x) \
-  (0 \
-   | (((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) \
-   | (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
-
 #define rol(x,n) ((((uint32_t)(x))<<(n))|      \
                   (((uint32_t)(x))>>(32-(n))))
 #define ror(x,n) ((((uint32_t)(x))<<(32-(n)))| \
@@ -593,24 +588,25 @@ serpent_key_prepare (const uint8_t * key, unsigned int key_length,
 {
   unsigned int i;
 
+  assert (key_length <= SERPENT_MAX_KEY_SIZE);
+  
   /* Copy key.  */
-  for (i = 0; i < key_length / 4; i++)
-    {
-#ifdef WORDS_BIGENDIAN
-      key_prepared[i] = byte_swap_32 (((uint32_t *) key)[i]);
-#else
-      key_prepared[i] = ((uint32_t *) key)[i];
-#endif
-    }
+  for (i = 0; key_length >= 4; key_length -=4, key += 4)
+    key_prepared[i++] = LE_READ_UINT32(key);
 
   if (i < 8)
     {
-      /* Key must be padded according to the Serpent
-         specification.  */
-      key_prepared[i] = 0x00000001;
+      /* Key must be padded according to the Serpent specification.
+         "aabbcc" -> "aabbcc0100...00" -> 0x01ccbbaa. */
+      uint32_t pad = 0x01;
+      
+      while (key_length > 0)
+       pad = pad << 8 | key[--key_length];
+
+      key_prepared[i++] = pad;
 
-      for (i++; i < 8; i++)
-       key_prepared[i] = 0;
+      while (i < 8)
+       key_prepared[i++] = 0;
     }
 }