]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - threefish1024_enc.c
backporting uart_i and cli
[avr-crypto-lib.git] / threefish1024_enc.c
index 2fa1957b1995c8437649b5f47375e155e0cda71f..41a35902d695752987360b67ca5c9e2a5ac91177 100644 (file)
 #include <string.h>
 #include "threefish.h"
 
-#define X0 (((uint64_t*)data)[0])
-#define X1 (((uint64_t*)data)[1])
-static
-void mix(void* data, uint8_t rot){
-       uint64_t x;
-       x = X1;
-       X0 += x;
-       X1 = ((x<<rot)|(x>>(64-rot))) ^ X0;
-}
-
 #define X(a) (((uint64_t*)data)[(a)])
 
 static
@@ -70,19 +60,23 @@ void permute_16(void* data){
 #define K(s) (((uint64_t*)key)[(s)])
 #define T(s) (((uint64_t*)tweak)[(s)])
 
-void threefish1024_init(void* key, void* tweak, threefish1024_ctx_t* ctx){
+void threefish1024_init(const void* key, const void* tweak, threefish1024_ctx_t* ctx){
        memcpy(ctx->k, key, 16*8);
-       memcpy(ctx->t, tweak, 2*8);
+       if(tweak){
+               memcpy(ctx->t, tweak, 2*8);
+               ctx->t[2] = T(0) ^ T(1);
+       }else{
+               memset(ctx, 0, 3*8);
+       }
        uint8_t i;
        ctx->k[16] = THREEFISH_KEY_CONST;
        for(i=0; i<16; ++i){
                ctx->k[16] ^= K(i);
        }
-       ctx->t[2] = T(0) ^ T(1);
 }
 
 static
-void add_key_16(void* data, threefish1024_ctx_t* ctx, uint8_t s){
+void add_key_16(void* data, const threefish1024_ctx_t* ctx, uint8_t s){
        uint8_t i;
        for(i=0; i<13; ++i){
                X(i) += ctx->k[(s+i)%17];
@@ -92,7 +86,7 @@ void add_key_16(void* data, threefish1024_ctx_t* ctx, uint8_t s){
        X(15) += ctx->k[(s+15)%17] + s;
 }
 
-void threefish1024_enc(void* data, threefish1024_ctx_t* ctx){
+void threefish1024_enc(void* data, const threefish1024_ctx_t* ctx){
        uint8_t i=0,s=0;
        uint8_t r0[8] = {55, 25, 33, 34, 28, 17, 58, 47};
        uint8_t r1[8] = {43, 25,  8, 43,  7,  6,  7, 49};
@@ -108,14 +102,14 @@ void threefish1024_enc(void* data, threefish1024_ctx_t* ctx){
                        add_key_16(data, ctx, s);
                        ++s;
                }
-               mix((uint8_t*)data +  0, r0[i%8]);
-               mix((uint8_t*)data + 16, r1[i%8]);
-               mix((uint8_t*)data + 32, r2[i%8]);
-               mix((uint8_t*)data + 48, r3[i%8]);
-               mix((uint8_t*)data + 64, r4[i%8]);
-               mix((uint8_t*)data + 80, r5[i%8]);
-               mix((uint8_t*)data + 96, r6[i%8]);
-               mix((uint8_t*)data +112, r7[i%8]);
+               threefish_mix((uint8_t*)data +  0, r0[i%8]);
+               threefish_mix((uint8_t*)data + 16, r1[i%8]);
+               threefish_mix((uint8_t*)data + 32, r2[i%8]);
+               threefish_mix((uint8_t*)data + 48, r3[i%8]);
+               threefish_mix((uint8_t*)data + 64, r4[i%8]);
+               threefish_mix((uint8_t*)data + 80, r5[i%8]);
+               threefish_mix((uint8_t*)data + 96, r6[i%8]);
+               threefish_mix((uint8_t*)data +112, r7[i%8]);
                permute_16(data);
                ++i;
        }while(i!=80);