]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - skipjack/skipjack.c
fixing skipjack
[avr-crypto-lib.git] / skipjack / skipjack.c
index 07bc97bf9bf3412dd96d62752611ba27a0dd7b85..ec36edff403c4c826762ada4797b6057accf3ed3 100644 (file)
@@ -31,9 +31,9 @@
 #include <avr/pgmspace.h>
 
 #if NESSIE_COMPAT
-#define SKIPJACK_CNT_BIG 0
-#else
 #define SKIPJACK_CNT_BIG 1
+#else
+#define SKIPJACK_CNT_BIG 0
 #endif
 
 #if SKIPJACK_CNT_BIG
@@ -82,13 +82,13 @@ const uint8_t skipjack_ftable[] PROGMEM ={
 /*****************************************************************************/
 
 uint16_t skipjack_g(uint16_t g, uint8_t k, uint8_t *key){
-       #define G1 (((uint8_t*)&g)[0])
-       #define G2 (((uint8_t*)&g)[1])
+       #define G1 (((uint8_t*)&g)[1])
+       #define G2 (((uint8_t*)&g)[0])
        /* this could also be rolled up */
-       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[(4*k+0)%10]]));
-       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[(4*k+1)%10]]));
-       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[(4*k+2)%10]]));
-       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[(4*k+3)%10]]));
+       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[9-(4*k+0)%10]]));
+       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[9-(4*k+1)%10]]));
+       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[9-(4*k+2)%10]]));
+       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[9-(4*k+3)%10]]));
        return g;       
 }
 
@@ -98,10 +98,10 @@ uint16_t skipjack_g_inv(uint16_t g, uint8_t k, uint8_t *key){
 //     #define G1 (((uint8_t)&g)[1])
 //     #define G2 (((uint8_t)&g)[0])
        /* this could also be rolled up */
-       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[(4*k+3)%10]]));
-       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[(4*k+2)%10]]));
-       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[(4*k+1)%10]]));
-       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[(4*k+0)%10]]));
+       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[9-(4*k+3)%10]]));
+       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[9-(4*k+2)%10]]));
+       G2 ^= pgm_read_byte_near(&(skipjack_ftable[G1 ^ key[9-(4*k+1)%10]]));
+       G1 ^= pgm_read_byte_near(&(skipjack_ftable[G2 ^ key[9-(4*k+0)%10]]));
        return g;       
 }
 
@@ -109,45 +109,44 @@ uint16_t skipjack_g_inv(uint16_t g, uint8_t k, uint8_t *key){
 
 void skipjack_a(uint16_t* w, uint8_t k, uint8_t* key){
        uint16_t t;
-
-       t = w[3];
-       w[3] = w[2];
-       w[2] = w[1];
-       w[1] = skipjack_g(w[0],k-1,key);
-       w[0] = t ^ w[1] ^ (((uint16_t)k)SKIPJACK_CNT_SHIFT);
+       t = w[0];
+       w[0] = w[1];
+       w[1] = w[2];
+       w[2] = skipjack_g(w[3],k,key);
+       w[3] = t ^ w[2] ^ (((uint16_t)k+1)SKIPJACK_CNT_SHIFT);
 }
 
 /*****************************************************************************/
 
 void skipjack_a_inv(uint16_t* w, uint8_t k, uint8_t* key){
        uint16_t t;
-       t = w[0] ^ w[1];
-       w[0] = skipjack_g_inv(w[1],k-1,key);
-       w[1] = w[2];
-       w[2] = w[3];
-       w[3] = t ^ (((uint16_t)k)SKIPJACK_CNT_SHIFT);
+       t = w[3] ^ w[2];
+       w[3] = skipjack_g_inv(w[2],k,key);
+       w[2] = w[1];
+       w[1] = w[0];
+       w[0] = t ^ (((uint16_t)k+1)SKIPJACK_CNT_SHIFT);
 }
 
 /*****************************************************************************/
 
 void skipjack_b(uint16_t* w, uint8_t k, uint8_t* key){
        uint16_t t;
-       t = w[0];
-       w[0] = w[3];
-       w[3] = w[2];
-       w[2] = t ^ (((uint16_t)k)SKIPJACK_CNT_SHIFT) ^ w[1];
-       w[1] = skipjack_g(t,k-1,key);
+       t = w[3];
+       w[3] = w[0];
+       w[0] = w[1];
+       w[1] = t ^ (((uint16_t)k+1)SKIPJACK_CNT_SHIFT) ^ w[2];
+       w[2] = skipjack_g(t,k,key);
 }
 
 /*****************************************************************************/
 
 void skipjack_b_inv(uint16_t* w, uint8_t k, uint8_t* key){
        uint16_t t;
-       t = w[2];
-       w[2] = w[3];
-       w[3] = w[0];
-       w[0] = skipjack_g_inv(w[1],k-1,key);
-       w[1] = w[0] ^ t ^ (((uint16_t)k)SKIPJACK_CNT_SHIFT);
+       t = w[1];
+       w[1] = w[0];
+       w[0] = w[3];
+       w[3] = skipjack_g_inv(w[2],k,key);
+       w[2] = w[3] ^ t ^ (((uint16_t)k+1)SKIPJACK_CNT_SHIFT);
 }
 
 /*****************************************************************************/
@@ -159,13 +158,12 @@ void skipjack_enc(void* block, void* key){
        uint8_t k;
        for(k=0; k<32; ++k){
                if(k & 0x08){
-                       skipjack_b((uint16_t*)block, k+1, key);
+                       skipjack_b((uint16_t*)block, k, key);
                } else {
-                       skipjack_a((uint16_t*)block, k+1, key);
+                       skipjack_a((uint16_t*)block, k, key);
                }
        }
 }
-
 /*****************************************************************************/
 /**
  * block is 64 bits (=8 bytes) in size, key is 80 bits (=10 bytes) in size.
@@ -175,9 +173,9 @@ void skipjack_dec(void* block, void* key){
        int8_t k;
        for(k=31; k>=0; --k){
                if(k & 0x08){
-                       skipjack_b_inv((uint16_t*)block, k+1, key);
+                       skipjack_b_inv((uint16_t*)block, k, key);
                } else {
-                       skipjack_a_inv((uint16_t*)block, k+1, key);
+                       skipjack_a_inv((uint16_t*)block, k, key);
                }
        }
 }