/* crypto/rc5/rc5test.c */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

/* This has been a quickly hacked 'ideatest.c'.  When I add tests for other
 * RC5 modes, more of the code will be uncommented. */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/rc5.h>

unsigned char RC5key[5][16]={
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x91,0x5f,0x46,0x19,0xbe,0x41,0xb2,0x51,
	 0x63,0x55,0xa5,0x01,0x10,0xa9,0xce,0x91},
	{0x78,0x33,0x48,0xe7,0x5a,0xeb,0x0f,0x2f,
	 0xd7,0xb1,0x69,0xbb,0x8d,0xc1,0x67,0x87},
	{0xdc,0x49,0xdb,0x13,0x75,0xa5,0x58,0x4f,
	 0x64,0x85,0xb4,0x13,0xb5,0xf1,0x2b,0xaf},
	{0x52,0x69,0xf1,0x49,0xd4,0x1b,0xa0,0x15,
	 0x24,0x97,0x57,0x4d,0x7f,0x15,0x31,0x25},
	};

unsigned char RC5plain[5][8]={
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x21,0xA5,0xDB,0xEE,0x15,0x4B,0x8F,0x6D},
	{0xF7,0xC0,0x13,0xAC,0x5B,0x2B,0x89,0x52},
	{0x2F,0x42,0xB3,0xB7,0x03,0x69,0xFC,0x92},
	{0x65,0xC1,0x78,0xB2,0x84,0xD1,0x97,0xCC},
	};

unsigned char RC5cipher[5][8]={
	{0x21,0xA5,0xDB,0xEE,0x15,0x4B,0x8F,0x6D},
	{0xF7,0xC0,0x13,0xAC,0x5B,0x2B,0x89,0x52},
	{0x2F,0x42,0xB3,0xB7,0x03,0x69,0xFC,0x92},
	{0x65,0xC1,0x78,0xB2,0x84,0xD1,0x97,0xCC},
	{0xEB,0x44,0xE4,0x15,0xDA,0x31,0x98,0x24},
	};

#define RC5_CBC_NUM 27
unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8]={
	{0x7a,0x7b,0xba,0x4d,0x79,0x11,0x1d,0x1e},
	{0x79,0x7b,0xba,0x4d,0x78,0x11,0x1d,0x1e},
	{0x7a,0x7b,0xba,0x4d,0x79,0x11,0x1d,0x1f},
	{0x7a,0x7b,0xba,0x4d,0x79,0x11,0x1d,0x1f},
	{0x8b,0x9d,0xed,0x91,0xce,0x77,0x94,0xa6},
	{0x2f,0x75,0x9f,0xe7,0xad,0x86,0xa3,0x78},
	{0xdc,0xa2,0x69,0x4b,0xf4,0x0e,0x07,0x88},
	{0xdc,0xa2,0x69,0x4b,0xf4,0x0e,0x07,0x88},
	{0xdc,0xfe,0x09,0x85,0x77,0xec,0xa5,0xff},
	{0x96,0x46,0xfb,0x77,0x63,0x8f,0x9c,0xa8},
	{0xb2,0xb3,0x20,0x9d,0xb6,0x59,0x4d,0xa4},
	{0x54,0x5f,0x7f,0x32,0xa5,0xfc,0x38,0x36},
	{0x82,0x85,0xe7,0xc1,0xb5,0xbc,0x74,0x02},
	{0xfc,0x58,0x6f,0x92,0xf7,0x08,0x09,0x34},
	{0xcf,0x27,0x0e,0xf9,0x71,0x7f,0xf7,0xc4},
	{0xe4,0x93,0xf1,0xc1,0xbb,0x4d,0x6e,0x8c},
	{0x5c,0x4c,0x04,0x1e,0x0f,0x21,0x7a,0xc3},
	{0x92,0x1f,0x12,0x48,0x53,0x73,0xb4,0xf7},
	{0x5b,0xa0,0xca,0x6b,0xbe,0x7f,0x5f,0xad},
	{0xc5,0x33,0x77,0x1c,0xd0,0x11,0x0e,0x63},
	{0x29,0x4d,0xdb,0x46,0xb3,0x27,0x8d,0x60},
	{0xda,0xd6,0xbd,0xa9,0xdf,0xe8,0xf7,0xe8},
	{0x97,0xe0,0x78,0x78,0x37,0xed,0x31,0x7f},
	{0x78,0x75,0xdb,0xf6,0x73,0x8c,0x64,0x78},
	{0x8f,0x34,0xc3,0xc6,0x81,0xc9,0x96,0x95},
	{0x7c,0xb3,0xf1,0xdf,0x34,0xf9,0x48,0x11},
	{0x7f,0xd1,0xa0,0x23,0xa5,0xbb,0xa2,0x17},
	};

unsigned char rc5_cbc_key[RC5_CBC_NUM][17]={
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x11},
	{ 1,0x00},
	{ 4,0x00,0x00,0x00,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 1,0x00},
	{ 4,0x01,0x02,0x03,0x04},
	{ 4,0x01,0x02,0x03,0x04},
	{ 4,0x01,0x02,0x03,0x04},
	{ 8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{ 8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{ 8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{ 8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{16,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	    0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{16,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	    0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{16,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	    0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{ 5,0x01,0x02,0x03,0x04,0x05},
	{ 5,0x01,0x02,0x03,0x04,0x05},
	{ 5,0x01,0x02,0x03,0x04,0x05},
	{ 5,0x01,0x02,0x03,0x04,0x05},
	{ 5,0x01,0x02,0x03,0x04,0x05},
	};

unsigned char rc5_cbc_plain[RC5_CBC_NUM][8]={
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{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},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
	{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x01},
	};

int rc5_cbc_rounds[RC5_CBC_NUM]={
	 0, 0, 0, 0, 0, 1, 2, 2,
	 8, 8,12,16, 8,12,16,12,
	 8,12,16, 8,12,16,12, 8,
	 8, 8, 8,
	};

unsigned char rc5_cbc_iv[RC5_CBC_NUM][8]={
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{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},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{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},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x78,0x75,0xdb,0xf6,0x73,0x8c,0x64,0x78},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x7c,0xb3,0xf1,0xdf,0x34,0xf9,0x48,0x11},
	};

int main(int argc, char *argv[])
	{
	int i,n,err=0;
	RC5_32_KEY key; 
	unsigned char buf[8],buf2[8],ivb[8];

	for (n=0; n<5; n++)
		{
		RC5_32_set_key(&key,16,&(RC5key[n][0]),12);

		RC5_32_ecb_encrypt(&(RC5plain[n][0]),buf,&key,RC5_ENCRYPT);
		if (memcmp(&(RC5cipher[n][0]),buf,8) != 0)
			{
			printf("ecb RC5 error encrypting (%d)\n",n+1);
			printf("got     :");
			for (i=0; i<8; i++)
				printf("%02X ",buf[i]);
			printf("\n");
			printf("expected:");
			for (i=0; i<8; i++)
				printf("%02X ",RC5cipher[n][i]);
			err=20;
			printf("\n");
			}

		RC5_32_ecb_encrypt(buf,buf2,&key,RC5_DECRYPT);
		if (memcmp(&(RC5plain[n][0]),buf2,8) != 0)
			{
			printf("ecb RC5 error decrypting (%d)\n",n+1);
			printf("got     :");
			for (i=0; i<8; i++)
				printf("%02X ",buf2[i]);
			printf("\n");
			printf("expected:");
			for (i=0; i<8; i++)
				printf("%02X ",RC5plain[n][i]);
			printf("\n");
			err=3;
			}
		}
	if (err == 0) printf("ecb RC5 ok\n");

	for (n=0; n<RC5_CBC_NUM; n++)
		{
		i=rc5_cbc_rounds[n];
		if (i < 8) continue;

		RC5_32_set_key(&key,rc5_cbc_key[n][0],&(rc5_cbc_key[n][1]),i);

		memcpy(ivb,&(rc5_cbc_iv[n][0]),8);
		RC5_32_cbc_encrypt(&(rc5_cbc_plain[n][0]),buf,8,
			&key,&(ivb[0]),RC5_ENCRYPT);

		if (memcmp(&(rc5_cbc_cipher[n][0]),buf,8) != 0)
			{
			printf("cbc RC5 error encrypting (%d)\n",n+1);
			printf("got     :");
			for (i=0; i<8; i++)
				printf("%02X ",buf[i]);
			printf("\n");
			printf("expected:");
			for (i=0; i<8; i++)
				printf("%02X ",rc5_cbc_cipher[n][i]);
			err=30;
			printf("\n");
			}

		memcpy(ivb,&(rc5_cbc_iv[n][0]),8);
		RC5_32_cbc_encrypt(buf,buf2,8,
			&key,&(ivb[0]),RC5_DECRYPT);
		if (memcmp(&(rc5_cbc_plain[n][0]),buf2,8) != 0)
			{
			printf("cbc RC5 error decrypting (%d)\n",n+1);
			printf("got     :");
			for (i=0; i<8; i++)
				printf("%02X ",buf2[i]);
			printf("\n");
			printf("expected:");
			for (i=0; i<8; i++)
				printf("%02X ",rc5_cbc_plain[n][i]);
			printf("\n");
			err=3;
			}
		}
	if (err == 0) printf("cbc RC5 ok\n");

	exit(err);
	return(err);
	}

#ifdef undef
static int cfb64_test(unsigned char *cfb_cipher)
        {
        IDEA_KEY_SCHEDULE eks,dks;
        int err=0,i,n;

        idea_set_encrypt_key(cfb_key,&eks);
        idea_set_decrypt_key(&eks,&dks);
        memcpy(cfb_tmp,cfb_iv,8);
        n=0;
        idea_cfb64_encrypt(plain,cfb_buf1,(long)12,&eks,
                cfb_tmp,&n,IDEA_ENCRYPT);
        idea_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
                (long)CFB_TEST_SIZE-12,&eks,
                cfb_tmp,&n,IDEA_ENCRYPT);
        if (memcmp(cfb_cipher,cfb_buf1,CFB_TEST_SIZE) != 0)
                {
                err=1;
                printf("idea_cfb64_encrypt encrypt error\n");
                for (i=0; i<CFB_TEST_SIZE; i+=8)
                        printf("%s\n",pt(&(cfb_buf1[i])));
                }
        memcpy(cfb_tmp,cfb_iv,8);
        n=0;
        idea_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,&eks,
                cfb_tmp,&n,IDEA_DECRYPT);
        idea_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
                (long)CFB_TEST_SIZE-17,&dks,
                cfb_tmp,&n,IDEA_DECRYPT);
        if (memcmp(plain,cfb_buf2,CFB_TEST_SIZE) != 0)
                {
                err=1;
                printf("idea_cfb_encrypt decrypt error\n");
                for (i=0; i<24; i+=8)
                        printf("%s\n",pt(&(cfb_buf2[i])));
                }
        return(err);
        }

static char *pt(unsigned char *p)
	{
	static char bufs[10][20];
	static int bnum=0;
	char *ret;
	int i;
	static char *f="0123456789ABCDEF";

	ret= &(bufs[bnum++][0]);
	bnum%=10;
	for (i=0; i<8; i++)
		{
		ret[i*2]=f[(p[i]>>4)&0xf];
		ret[i*2+1]=f[p[i]&0xf];
		}
	ret[16]='\0';
	return(ret);
	}
	
#endif
