/* 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 "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(argc,argv)
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(cfb_cipher)
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(p)
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
