Hi,

I'm trying to implement a new stream cipher algorithm in OpenSSL (stream
cipher Rabbit, see RFC 4503 -- in my previous email, there was a mistake, I
tiped 4509, really sorry). This new algorithm will be used for testing
purpose. I have written and added new lines in OpenSSL 0.9.8c. At present,
I'm working on the code for the cipher test ('rabbittest' - I adopted the
codes from rc4test.c). The code has already been working on encryption test
(test 0...3). Unfortunately, it shows errors when it tests the cipher length
test.

D:\Projects\Openssl-0.9.8c\out32dll>rabbittest

test 0 ok

test 1 ok

test 2 ok

test 3 ok

test end processing .

error in Rabbit length processing

output: 8e 65

expect: 8e 00

error in Rabbit length processing

output: 8e 65 b4

expect: 8e 65 00

error in Rabbit length processing

output: 8e 65 b4 ff

expect: 8e 65 b4 00

error in Rabbit length processing

output: 8e 65 b4 ff 14

expect: 8e 65 b4 ff 00

...

...

I've checked the code many times, but I couldn't find the bug. Below is the
'rabbittest' codes :

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "../e_os.h"

#ifdef OPENSSL_NO_RABBIT

int main(int argc, char *argv[])

{

printf("No Rabbit support\n");

return(0);

}

#else

#include <openssl/rabbit.h>

static unsigned char keys[7][30]={

{16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{16,0xAC,0xC3,0x51,0xDC,0xF1,0x62,0xFC,0x3B,0xFE,0x36,0x3D,0x2E,0x29,0x13,0x28,0x91},

{16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{16,0xAC,0xC3,0x51,0xDC,0xF1,0x62,0xFC,0x3B,0xFE,0x36,0x3D,0x2E,0x29,0x13,0x28,0x91},

};

static unsigned char data_len[7]={31,31,31,31};

static unsigned char data[7][32]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,

0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF},

{0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,

0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF},

{0},

};

static unsigned char output[7][32]={

{0x02,0xF7,0x4A,0x1C,0x26,0x45,0x6B,0xF5,0xEC,0xD6,0xA5,0x36,0xF0,0x54,0x57,0xB1,

0xA7,0x8A,0xC6,0x89,0x47,0x6C,0x69,0x7B,0x39,0x0C,0x9C,0xC5,0x15,0xD8,0xE8,0x88},

{0x9C,0x51,0xE2,0x87,0x84,0xC3,0x7F,0xE9,0xA1,0x27,0xF6,0x3E,0xC8,0xF3,0x2D,0x3D,

0x19,0xFC,0x54,0x85,0xAA,0x53,0xBF,0x96,0x88,0x5B,0x40,0xF4,0x61,0xCD,0x76,0xF5},

{0x10,0xC3,0x1C,0x64,0xB6,0xEE,0xA6,0x1A,0xFE,0xE2,0xF3,0x4E,0x60,0xFF,0x9A,0x5E,

0xB5,0xBE,0x90,0xF1,0xD7,0xC7,0xA4,0x94,0x2B,0x38,0xCA,0xBD,0x85,0x73,0x25,0x67},

{0x8E,0x65,0xB4,0xFF,0x14,0x68,0xB2,0x06,0xB3,0x13,0xA0,0x46,0x58,0x58,0xE0,0xD2,

0x0B,0xC8,0x02,0xFD,0x3A,0xF8,0x72,0x79,0x9A,0x6F,0x16,0x8C,0xF1,0x66,0xBB,0x1A},

{0},

};

int main(int argc, char *argv[])

{

int err=0;

unsigned int i, j;

unsigned char *p;

RABBIT_KEY key;

unsigned char obuf[512];

for (i=0; i<4; i++)

{

rabbit_key_setup(&key,&(keys[i][1]));

memset(obuf,0x00,sizeof(obuf));

rabbit(&key,&(data[i][0]),obuf,data_len[i]);

if (memcmp(obuf,output[i],data_len[i]+1) != 0)

{

printf("error calculating Rabbit\n");

printf("output:");

for (j=0; j<data_len[i]+1U; j++)

printf(" %02x",obuf[j]);

printf("\n");

printf("expect:");

p= &(output[i][0]);

for (j=0; j<data_len[i]+1U; j++)

printf(" %02x",*(p++));

printf("\n");

err++;

}

else

printf("test %d ok\n",i);

}

printf("test end processing\n");

for (i=0; i<data_len[3]; i++)

{

rabbit_key_setup(&key,&(keys[3][1]));

memset(obuf,0x00,sizeof(obuf));

rabbit(&key,&(data[3][0]),obuf,i);

if ((memcmp(obuf,output[3],i) != 0) || (obuf[i] != 0))

{

printf("\nerror in Rabbit length processing\n");

printf("output:");

for (j=0; j<i+1; j++)

printf(" %02x",obuf[j]);

printf("\n");

printf("expect:");

p= &(output[3][0]);

for (j=0; j<i; j++)

printf(" %02x",*(p++));

printf(" 00\n");

err++;

}

else

{

printf(".");

fflush(stdout);

}

}

printf("\ndone\n");

#ifdef OPENSSL_SYS_NETWARE

if (err) printf("ERROR: %d\n", err);

#endif

EXIT(err);

return(0);

}

#endif

I also included rabbit.c as attachment. I would thank so much if you can
help me to know what's the problem with the codes and how I can solve it.

Best regards,

--Endhy

Attachment: rabbit.c
Description: Binary data

Reply via email to