/* 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>

#ifdef OPENSSL_NO_RC5
int main(int argc, char *argv[])
{
    printf("No RC5 support\n");
    return(0);
}
#else
#include <openssl/rc5.h>

static 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},
	};

static 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},
	};

static 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
static 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},
	};

static 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},
	};

static 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},
	};

static 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,
	};

static 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
#endif
