chiark / gitweb /
Ripped out a lot of crap. Now it compiles and passes the test vectors.
[chiark-tcl.git] / crypto / algtables.c
index 87b365b412491a7b653f3282b9b30f89f15bc64d..7a651f06aa66e0a9d90529dea2ea7dd564fbd413 100644 (file)
@@ -9,7 +9,7 @@
 #include "sha1.h"
 #include "md5.h"
 
-static void alg_serpent_byteswap_block(Byte *b) {
+static void alg_serpent_b_byteswap_block(Byte *b) {
   uint32_t t, *a= (void*)b;
 
   t=    htonl(a[0]);
@@ -21,21 +21,41 @@ static void alg_serpent_byteswap_block(Byte *b) {
   a[2]= t;
 }
 
+static void alg_serpent_l_byteswap_block(Byte *b) {
+  uint32_t t, *a= (void*)b;
+  int i;
+
+  if (htonl(0x01020304UL) == 0x04030201UL) /* little endian */
+    return;
+  
+  for (i=0; i<4; i++) {
+    t= htonl(a[i]);
+    a[i]= ((t & 0x000000ffUL) << 24 |
+          (t & 0x0000ff00UL) << 8 |
+          (t & 0x00ff0000UL) >> 8 |
+          (t & 0xff000000UL) >> 24);
+  }
+}
+
 static void alg_serpent_makekey(void *schedule, const Byte *key, int keylen) {
-  serpent_makekey(schedule, keylen*8, key);
+  serpent_makekey(schedule, key, keylen);
 }
 
 static void alg_serpent_encrypt(const void *sch, const void *in, void *out) {
-  serpent_encrypt(sch, in, out);
+  serpent_encrypt(in, out, sch);
 }
   
 static void alg_serpent_decrypt(const void *sch, const void *in, void *out) {
-  serpent_decrypt(sch, in, out);
+  serpent_decrypt(in, out, sch);
 }
 
 const BlockCipherAlgInfo blockcipheralginfos[]= {
-  { "serpent", 16, sizeof(struct SerpentKeyInstance), 16,32,
-    alg_serpent_byteswap_block,
+  { "serpent-l", 16, sizeof(SerpentKeySchedule), 16,32,
+    alg_serpent_l_byteswap_block,
+    { alg_serpent_makekey, alg_serpent_encrypt },
+    { alg_serpent_makekey, alg_serpent_decrypt } },
+  { "serpent-b", 16, sizeof(SerpentKeySchedule), 16,32,
+    alg_serpent_b_byteswap_block,
     { alg_serpent_makekey, alg_serpent_encrypt },
     { alg_serpent_makekey, alg_serpent_decrypt } },
   { 0 }