[svn] / ecrypt / trunk / submissions / mosquito / mosquito.c  

svn: ecrypt/trunk/submissions/mosquito/mosquito.c

File: [svn] / ecrypt / trunk / submissions / mosquito / mosquito.c (download) (as text)
Revision: 1, Sun Jun 26 18:46:26 2005 UTC (7 years, 10 months ago) by cdecanni
File size: 11340 byte(s)
* imported original ECRYPT submissions after first automatic cleanup.
/* ecrypt-Mosquito_cipher.c 
 * version June 21 2005
 * correction in init_ctx(): initialization of certain statebits to 0
 */


#include <stdio.h>
#include <stdlib.h>
#include "ecrypt-portable.h"
#include "ecrypt-machine.h"
#include "ecrypt-config.h"
#include "ecrypt-ssyn.h"

#define ONE  ((u8) 0x01)

void init_ctx(ECRYPT_ctx *s)
{
  int i;

  s->CCSR_0 = s->a0;      /* a[1...96]    is CCSR_0[1...96] */
  s->CCSR_1 = s->a0+8;    /* a[97...104]  is CCSR_1[89...96] */
  s->CCSR_2 = s->a0+8+4;  /* a[105...108] is CCSR_2[93...96] */
  s->CCSR_3 = s->a0+8+8;  /* a[109...112] is CCSR_3[93...96] */
  s->CCSR_4 = s->a0+16+2; /* a[113...114] is CCSR_4[95...96] */
  s->CCSR_5 = s->a0+16+4; /* a[115...116] is CCSR_5[95...96] */
  s->CCSR_6 = s->a0+16+6; /* a[117...118] is CCSR_6[95...96] */
  s->CCSR_7 = s->a0+16+8; /* a[119...120] is CCSR_7[95...96] */
  s->CCSR_8 = s->a0+24+1; /* a[121] is CCSR_8[96] */
  s->CCSR_9 = s->a0+24+2; /* a[122] is CCSR_9[96] */
  s->CCSR10 = s->a0+24+3; /* a[123] is CCSR_10[96] */
  s->CCSR11 = s->a0+24+4; /* a[124] is CCSR_11[96] */
  s->CCSR12 = s->a0+24+5; /* a[125] is CCSR_12[96] */
  s->CCSR13 = s->a0+24+6; /* a[126] is CCSR_13[96] */
  s->CCSR14 = s->a0+24+7; /* a[127] is CCSR_14[96] */
  s->CCSR15 = s->a0+24+8; /* a[128] is CCSR_15[96] */

  for( i=53 ; i<56 ; i++ ) { 
       s->a1[i] = s->a2[i] = s->a3[i] = s->a4[i] = s->a5[i] = 0;
       }
  /* these statebits are constant and are 
   * only present to simplify the code of iterate()
   */
}

void byte_to_bits(u8 byt,u8 *bit) /* MSB to bit[0], LSB to bit[7] */
{
   bit[7] = byt&ONE; byt >>= 1;
   bit[6] = byt&ONE; byt >>= 1;
   bit[5] = byt&ONE; byt >>= 1;
   bit[4] = byt&ONE; byt >>= 1;
   bit[3] = byt&ONE; byt >>= 1;
   bit[2] = byt&ONE; byt >>= 1;
   bit[1] = byt&ONE; byt >>= 1;
   bit[0] = byt&ONE;
} 

u8 bits_to_byte(u8* bit)  /* bit[0] to MSB, bit[7] to LSB */
{
   u8 byt;
   byt  = bit[0]; byt <<= 1;
   byt ^= bit[1]; byt <<= 1;
   byt ^= bit[2]; byt <<= 1;
   byt ^= bit[3]; byt <<= 1;
   byt ^= bit[4]; byt <<= 1;
   byt ^= bit[5]; byt <<= 1;
   byt ^= bit[6]; byt <<= 1;
   byt ^= bit[7];
return(byt);   
} 

u8 iterate(ECRYPT_ctx *s, u8 c_t) 
/* single iteration taking ONE bit of ciphertext and returning ONE bit of keystream */
{
   u8 z_t;
   u16 i,j;

/* the output from stage 8*/
   z_t = s->a8[0];
/* stage 8 from stage 7*/
   s->a8[0] = (s->a7[0]^s->a7[1]^s->a7[2])&ONE ;

/* the stages */
   for( i=0 ; i<3 ; i++ )  s->a7[i] = s->a6[4*i] ^ s->a6[4*i+1] ^ s->a6[4*i+2] ^ s->a6[4*i+3];
   for( i=0 ; i<12 ; i++ ) s->a6[i] = s->a5[4*i] ^ s->a5[4*i+3] ^ (s->a5[4*i+1] & (s->a5[4*i+2] ^ ONE)) ^ ONE;
   for( i=0 ; i<53 ; i++ ) s->a5[(4*i)%53] = s->a4[i] ^ s->a4[i+3] ^ (s->a4[i+1] & (s->a4[i+2] ^ ONE)) ^ ONE;
   for( i=0 ; i<53 ; i++ ) s->a4[(4*i)%53] = s->a3[i] ^ s->a3[i+3] ^ (s->a3[i+1] & (s->a3[i+2] ^ ONE)) ^ ONE;
   for( i=0 ; i<53 ; i++ ) s->a3[(4*i)%53] = s->a2[i] ^ s->a2[i+3] ^ (s->a2[i+1] & (s->a2[i+2] ^ ONE)) ^ ONE;
   for( i=0 ; i<53 ; i++ ) s->a2[(4*i)%53] = s->a1[i] ^ s->a1[i+3] ^ (s->a1[i+1] & (s->a1[i+2] ^ ONE)) ^ ONE;
   for( i=0 ; i<53 ; i++ ) s->a1[(4*i)%53] = s->a0[128-i] ^ s->a0[i+18] ^ (s->a0[113-i] & (s->a0[i+1] ^ ONE)) ^ ONE;

/* the CCSR */
   s->CCSR15[96] = (s->CCSR_7[95]&(s->CCSR_0[95-15]^ONE)) ^ (s->CCSR_3[94]&(s->CCSR_0[94-15]^ONE)) ;
   s->CCSR14[96] = (s->CCSR_6[95]&(s->CCSR_0[95-14]^ONE)) ^ (s->CCSR_2[94]&(s->CCSR_0[94-14]^ONE)) ;
   s->CCSR13[96] = (s->CCSR_5[95]&(s->CCSR_0[95-13]^ONE)) ^ (s->CCSR_1[94]&(s->CCSR_0[94-13]^ONE)) ;
   s->CCSR12[96] = (s->CCSR_4[95]&(s->CCSR_0[95-12]^ONE)) ^ (s->CCSR_0[94]&(s->CCSR_0[94-12]^ONE)) ;
   s->CCSR11[96] = (s->CCSR_3[95]&(s->CCSR_0[95-11]^ONE)) ^ (s->CCSR_3[94]&(s->CCSR_0[94-11]^ONE)) ;
   s->CCSR10[96] = (s->CCSR_2[95]&(s->CCSR_0[95-10]^ONE)) ^ (s->CCSR_2[94]&(s->CCSR_0[94-10]^ONE)) ;
   s->CCSR_9[96] = (s->CCSR_1[95]&(s->CCSR_0[95- 9]^ONE)) ^ (s->CCSR_1[94]&(s->CCSR_0[94- 9]^ONE)) ;
   s->CCSR_8[96] = (s->CCSR_0[95]&(s->CCSR_0[95- 8]^ONE)) ^ (s->CCSR_0[94]&(s->CCSR_0[94- 8]^ONE)) ;
   s->CCSR_7[96] = (s->CCSR_7[95]&(s->CCSR_0[95- 7]^ONE)) ^ (s->CCSR_3[94]&(s->CCSR_0[94- 7]^ONE)) ;
   s->CCSR_6[96] = (s->CCSR_6[95]&(s->CCSR_0[95- 6]^ONE)) ^ (s->CCSR_2[94]&(s->CCSR_0[94- 6]^ONE)) ;
   s->CCSR_5[96] = (s->CCSR_5[95]&(s->CCSR_0[95- 5]^ONE)) ^ (s->CCSR_1[94]&(s->CCSR_1[94- 5]^ONE)) ;
   s->CCSR_4[96] = (s->CCSR_4[95]&(s->CCSR_0[95- 4]^ONE)) ^ (s->CCSR_0[94]&(s->CCSR_1[94- 4]^ONE)) ;
   s->CCSR_3[96] = (s->CCSR_3[95]&(s->CCSR_0[95- 3]^ONE)) ^ (s->CCSR_3[94]&(s->CCSR_1[94- 3]^ONE)) ;
   s->CCSR_2[96] = (s->CCSR_2[95]&(s->CCSR_0[95- 2]^ONE)) ^ (s->CCSR_2[94]&(s->CCSR_1[94- 2]^ONE)) ;
   s->CCSR_1[96] = (s->CCSR_1[95]&(s->CCSR_0[95- 1]^ONE)) ^ (s->CCSR_1[94]&(s->CCSR_1[94- 1]^ONE)) ;
   s->CCSR_0[96] = s->CCSR_0[95] ^ s->wrkey[95] ^ (s->CCSR_0[95-4]&(s->CCSR_0[95-2]^ONE)) ^ ONE;   /* i+j =  96 = 0 mod 3*/

   s->CCSR_7[95] = s->CCSR_3[94] ^ s->wrkey[94] ^ (s->CCSR_1[95-4+1]&(s->CCSR_3[95-2]^ONE)) ^ ONE; /* i+j = 102 = 0 mod 3 */
   s->CCSR_6[95] = s->CCSR_2[94] ^ s->wrkey[94] ^ (     s->CCSR_0[0]&(s->CCSR_2[95-2]^ONE)) ^ ONE; /* i+j = 101 = 5 mod 6*/
   s->CCSR_5[95] = s->CCSR_1[94] ^ s->wrkey[94] ^ (s->CCSR_1[95-6+1]&(s->CCSR_1[95-2]^ONE)) ^ ONE; /* i+j = 100 = 1 mod 3*/
   s->CCSR_4[95] = s->CCSR_0[94] ^ s->wrkey[94] ^ (s->CCSR_0[95-4  ]&(s->CCSR_0[95-2]^ONE)) ^ ONE; /* i+j =  99 = 0 mod 3*/
   s->CCSR_3[95] = s->CCSR_3[94] ^ s->wrkey[94] ^ (s->CCSR_1[95-5+1]&(s->CCSR_0[0]   ^ONE)) ^ ONE; /* i+j =  98 = 2 mod 6*/
   s->CCSR_2[95] = s->CCSR_2[94] ^ s->wrkey[94] ^ (s->CCSR_0[95-6  ]&(s->CCSR_2[95-2]^ONE)) ^ ONE; /* i+j =  97 = 1 mod 3*/
   s->CCSR_1[95] = s->CCSR_1[94] ^ s->wrkey[94] ^ (s->CCSR_1[95-4+1]&(s->CCSR_1[95-2]^ONE)) ^ ONE; /* i+j =  96 = 0 mod 3*/
   s->CCSR_0[95] = s->CCSR_0[94] ^ s->wrkey[94] ^ (     s->CCSR_0[0]&(s->CCSR_0[95-2]^ONE)) ^ ONE; /* i+j =  95 = 5 mod 6*/

   s->CCSR_3[94] = s->CCSR_3[93] ^ s->wrkey[93] ^ (s->CCSR_1[94-6+1]&(s->CCSR_1[94-2]^ONE)) ^ ONE; /* i+j =  97 = 1 mod 3*/
   s->CCSR_2[94] = s->CCSR_2[93] ^ s->wrkey[93] ^ (s->CCSR_0[94-4  ]&(s->CCSR_0[94-2]^ONE)) ^ ONE; /* i+j =  96 = 0 mod 3*/
   s->CCSR_1[94] = s->CCSR_1[93] ^ s->wrkey[93] ^ (     s->CCSR_0[0]&(s->CCSR_1[94-2]^ONE)) ^ ONE; /* i+j =  95 = 5 mod 6*/
   s->CCSR_0[94] = s->CCSR_0[93] ^ s->wrkey[93] ^ (s->CCSR_0[94-6  ]&(s->CCSR_0[94-2]^ONE)) ^ ONE; /* i+j =  94 = 1 mod 3*/

   s->CCSR_3[93] = s->CCSR_1[92] ^ s->wrkey[92] ^ (s->CCSR_1[93-4+1]&(s->CCSR_1[93-2]^ONE)) ^ ONE; /* i+j =  96 = 0 mod 3*/
   s->CCSR_2[93] = s->CCSR_0[92] ^ s->wrkey[92] ^ (     s->CCSR_0[0]&(s->CCSR_0[93-2]^ONE)) ^ ONE; /* i+j =  95 = 5 mod 6*/
   s->CCSR_1[93] = s->CCSR_1[92] ^ s->wrkey[92] ^ (s->CCSR_0[93-6+1]&(s->CCSR_1[93-2]^ONE)) ^ ONE; /* i+j =  94 = 1 mod 3*/
   s->CCSR_0[93] = s->CCSR_0[92] ^ s->wrkey[92] ^ (s->CCSR_0[93-4  ]&(s->CCSR_0[93-2]^ONE)) ^ ONE; /* i+j =  93 = 0 mod 3*/

   s->CCSR_1[92] = s->CCSR_1[91] ^ s->wrkey[91] ^ (s->CCSR_1[92-4+1]&(s->CCSR_1[92-2]^ONE)) ^ ONE; /* i+j =  93 = 0 mod 3*/
   s->CCSR_0[92] = s->CCSR_0[91] ^ s->wrkey[91] ^ (s->CCSR_0[92-5  ]&(s->CCSR_0[0]   ^ONE)) ^ ONE; /* i+j =  92 = 2 mod 6*/

   s->CCSR_1[91] = s->CCSR_1[90] ^ s->wrkey[90] ^ (s->CCSR_0[91-5+1]&(s->CCSR_0[0]   ^ONE)) ^ ONE; /* i+j =  92 = 2 mod 6*/
   s->CCSR_0[91] = s->CCSR_0[90] ^ s->wrkey[90] ^ (s->CCSR_0[91-6  ]&(s->CCSR_0[91-2]^ONE)) ^ ONE; /* i+j =  91 = 1 mod 3*/

   s->CCSR_1[90] = s->CCSR_1[89] ^ s->wrkey[89] ^ (s->CCSR_0[90-6+1]&(s->CCSR_0[90-2]^ONE)) ^ ONE; /* i+j =  91 = 1 mod 3*/
   s->CCSR_0[90] = s->CCSR_0[89] ^ s->wrkey[89] ^ (s->CCSR_0[90-4  ]&(s->CCSR_0[90-2]^ONE)) ^ ONE; /* i+j =  90 = 0 mod 3*/

   s->CCSR_1[89] = s->CCSR_0[88] ^ s->wrkey[88] ^ (s->CCSR_0[89-6+1]&(s->CCSR_0[89-2]^ONE)) ^ ONE; /* i+j =  90 = 0 mod 3*/
   s->CCSR_0[89] = s->CCSR_0[88] ^ s->wrkey[88] ^ (     s->CCSR_0[0]&(s->CCSR_0[89-2]^ONE)) ^ ONE; /* i+j =  89 = 5 mod 6*/

   for( j=88 ; j>4 ; j-- )
   {
      s->CCSR_0[j] = s->CCSR_0[j-1] ^ s->wrkey[j-1] ^ ONE;
      if( j%3 == 0 ) s->CCSR_0[j] ^= (s->CCSR_0[j-4]&(s->CCSR_0[j-2]^ONE));  /* note: i=0 */
      if( j%3 == 1 ) s->CCSR_0[j] ^= (s->CCSR_0[j-6]&(s->CCSR_0[j-2]^ONE));  /* note: i=0 */
      if( j%6 == 2 ) s->CCSR_0[j] ^= (s->CCSR_0[j-5]&(s->CCSR_0[0]  ^ONE));  /* note: i=0 */
      if( j%6 == 5 ) s->CCSR_0[j] ^= (  s->CCSR_0[0]&(s->CCSR_0[j-2]^ONE));  /* note: i=0 */
   }

   s->CCSR_0[4] = s->CCSR_0[3] ^ s->wrkey[3] ^ ONE;
   s->CCSR_0[3] = s->CCSR_0[2] ^ s->wrkey[2] ^ ONE;
   s->CCSR_0[2] = s->CCSR_0[1] ^ s->wrkey[1] ^ ONE;
   s->CCSR_0[1] = s->CCSR_0[0] ^ s->wrkey[0] ^ ONE;
   s->CCSR_0[0] = c_t&ONE;

   return(z_t);
}

u8 encrypt_bit(ECRYPT_ctx *s, u8 p) 
{
   u8 c;
   c = p ^ iterate(s,0);
   s->CCSR_0[0] = c;
   return(c);
}

u8 decrypt_bit(ECRYPT_ctx *s, u8 c) 
{
   u8 p;
   p = c ^ iterate(s,c);
   return(p);
}


u8 encrypt_byte(ECRYPT_ctx *s, u8 p) 
{
   u8 pbit[8], cbit[8];	
   u16 i;

   byte_to_bits(p,pbit);
   for( i=0 ; i<8 ; i++) cbit[i] = encrypt_bit(s,pbit[i]);
   return(bits_to_byte(cbit));
}

u8 decrypt_byte(ECRYPT_ctx *s, u8 c) 
{
   u8 pbit[8], cbit[8];	
   u16 i;

   byte_to_bits(c,cbit);
   for( i=0 ; i<8 ; i++) pbit[i] = decrypt_bit(s,cbit[i]);
   return(bits_to_byte(pbit));
}


void ECRYPT_init()
{
/* no need for any operations here */
}

void ECRYPT_keysetup(
  ECRYPT_ctx* ctx, 
  const u8* key, 
  u32 keysize,      /* Key size in bits, ignored as key must be 12 bytes long */ 
  u32 ivsize)       /* IV size in bits, should be a multiple of 8 */ 
{
   u16 i,j;
   u8 tmp[8];
   ctx->IVsize = ivsize;
   for( i=0 ; i<12 ; i++)
   {
      byte_to_bits(key[i],tmp);	
      for( j=0 ; j<8 ; j++) ctx->wrkey[i*8+j] = tmp[j];
   }
} 

void ECRYPT_ivsetup(
  ECRYPT_ctx* ctx,
  u8* previous,
  const u8* iv)
{
   u16 i, IVsizebytes;
   u8 tmpzero;
   tmpzero = 0;
   IVsizebytes = (ctx->IVsize)/8;
   decrypt_bit(ctx, tmpzero);  /* first bit of initialization vector is 0 */
   for( i=0 ; i<IVsizebytes ; i++) decrypt_byte(ctx, iv[i]);   
   for( i=IVsizebytes ; i<13 ; i++) decrypt_byte(ctx, tmpzero);   /* padding with zeroes */
} /* initialises internal state, leaves previous[...] alone */


void ECRYPT_encrypt_bytes(
  ECRYPT_ctx* ctx,     /* no longer constant */
  const u8* previous,  /* not used */
  const u8* plaintext, 
  u8* ciphertext, 
  u32 msglen)          /* Message length in bytes. */ 
{
   u32 i;
   for( i=0 ; i<msglen ; i++) ciphertext[i] = encrypt_byte(ctx, plaintext[i]);
}

void ECRYPT_decrypt_bytes(
  ECRYPT_ctx* ctx, /* no longer constant */
  const u8* previous,    /* not used */
  const u8* ciphertext, 
  u8* plaintext, 
  u32 msglen)                /* Message length in bytes. */ 
{
   u32 i;
   for( i=0 ; i<msglen ; i++) plaintext[i] = decrypt_byte(ctx, ciphertext[i]);
} 

#ifdef ECRYPT_USES_DEFAULT_ALL_IN_ONE

/*
 * Default implementation of all-in-one encryption/decryption of
 * (short) packets.
 */

void ECRYPT_encrypt_packet(
  ECRYPT_ctx* ctx,
  const u8* iv,
  const u8* plaintext,
  u8* ciphertext,
  u32 msglen)
{
  u8 previous[ECRYPT_SYNCLENGTH];

  ECRYPT_ivsetup(ctx, previous, iv);
  ECRYPT_encrypt_bytes(ctx, previous, plaintext, ciphertext, msglen);
}

void ECRYPT_decrypt_packet(
  ECRYPT_ctx* ctx,
  const u8* iv,
  const u8* ciphertext,
  u8* plaintext,
  u32 msglen)
{
  u8 previous[ECRYPT_SYNCLENGTH];

  ECRYPT_ivsetup(ctx, previous, iv);
  ECRYPT_decrypt_bytes(ctx, previous, ciphertext, plaintext, msglen);
}

#endif
 


eSTREAM Project

Powered by ViewCVS 1.0-dev
(Powered by Apache)

ViewCVS and CVS Help