Home | History | Annotate | Download | only in rc2
      1 /* crypto/rc2/rc2test.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 
     59 /* This has been a quickly hacked 'ideatest.c'.  When I add tests for other
     60  * RC2 modes, more of the code will be uncommented. */
     61 
     62 #include <stdio.h>
     63 #include <string.h>
     64 #include <stdlib.h>
     65 
     66 #include "../e_os.h"
     67 
     68 #ifdef OPENSSL_NO_RC2
     69 int main(int argc, char *argv[])
     70 {
     71     printf("No RC2 support\n");
     72     return(0);
     73 }
     74 #else
     75 #include <openssl/rc2.h>
     76 
     77 static unsigned char RC2key[4][16]={
     78 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     79 	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
     80 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     81 	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
     82 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     83 	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
     84 	{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
     85 	 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
     86 	};
     87 
     88 static unsigned char RC2plain[4][8]={
     89 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
     90 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
     91 	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
     92 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
     93 	};
     94 
     95 static unsigned char RC2cipher[4][8]={
     96 	{0x1C,0x19,0x8A,0x83,0x8D,0xF0,0x28,0xB7},
     97 	{0x21,0x82,0x9C,0x78,0xA9,0xF9,0xC0,0x74},
     98 	{0x13,0xDB,0x35,0x17,0xD3,0x21,0x86,0x9E},
     99 	{0x50,0xDC,0x01,0x62,0xBD,0x75,0x7F,0x31},
    100 	};
    101 /************/
    102 #ifdef undef
    103 unsigned char k[16]={
    104 	0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
    105 	0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08};
    106 
    107 unsigned char in[8]={0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03};
    108 unsigned char  c[8]={0x11,0xFB,0xED,0x2B,0x01,0x98,0x6D,0xE5};
    109 unsigned char out[80];
    110 
    111 char *text="Hello to all people out there";
    112 
    113 static unsigned char cfb_key[16]={
    114 	0xe1,0xf0,0xc3,0xd2,0xa5,0xb4,0x87,0x96,
    115 	0x69,0x78,0x4b,0x5a,0x2d,0x3c,0x0f,0x1e,
    116 	};
    117 static unsigned char cfb_iv[80]={0x34,0x12,0x78,0x56,0xab,0x90,0xef,0xcd};
    118 static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8];
    119 #define CFB_TEST_SIZE 24
    120 static unsigned char plain[CFB_TEST_SIZE]=
    121         {
    122         0x4e,0x6f,0x77,0x20,0x69,0x73,
    123         0x20,0x74,0x68,0x65,0x20,0x74,
    124         0x69,0x6d,0x65,0x20,0x66,0x6f,
    125         0x72,0x20,0x61,0x6c,0x6c,0x20
    126         };
    127 static unsigned char cfb_cipher64[CFB_TEST_SIZE]={
    128 	0x59,0xD8,0xE2,0x65,0x00,0x58,0x6C,0x3F,
    129 	0x2C,0x17,0x25,0xD0,0x1A,0x38,0xB7,0x2A,
    130 	0x39,0x61,0x37,0xDC,0x79,0xFB,0x9F,0x45
    131 
    132 /*	0xF9,0x78,0x32,0xB5,0x42,0x1A,0x6B,0x38,
    133 	0x9A,0x44,0xD6,0x04,0x19,0x43,0xC4,0xD9,
    134 	0x3D,0x1E,0xAE,0x47,0xFC,0xCF,0x29,0x0B,*/
    135 	};
    136 
    137 
    138 /*static int cfb64_test(unsigned char *cfb_cipher);*/
    139 static char *pt(unsigned char *p);
    140 #endif
    141 
    142 int main(int argc, char *argv[])
    143 	{
    144 	int i,n,err=0;
    145 	RC2_KEY key;
    146 	unsigned char buf[8],buf2[8];
    147 
    148 	for (n=0; n<4; n++)
    149 		{
    150 		RC2_set_key(&key,16,&(RC2key[n][0]),0 /* or 1024 */);
    151 
    152 		RC2_ecb_encrypt(&(RC2plain[n][0]),buf,&key,RC2_ENCRYPT);
    153 		if (memcmp(&(RC2cipher[n][0]),buf,8) != 0)
    154 			{
    155 			printf("ecb rc2 error encrypting\n");
    156 			printf("got     :");
    157 			for (i=0; i<8; i++)
    158 				printf("%02X ",buf[i]);
    159 			printf("\n");
    160 			printf("expected:");
    161 			for (i=0; i<8; i++)
    162 				printf("%02X ",RC2cipher[n][i]);
    163 			err=20;
    164 			printf("\n");
    165 			}
    166 
    167 		RC2_ecb_encrypt(buf,buf2,&key,RC2_DECRYPT);
    168 		if (memcmp(&(RC2plain[n][0]),buf2,8) != 0)
    169 			{
    170 			printf("ecb RC2 error decrypting\n");
    171 			printf("got     :");
    172 			for (i=0; i<8; i++)
    173 				printf("%02X ",buf[i]);
    174 			printf("\n");
    175 			printf("expected:");
    176 			for (i=0; i<8; i++)
    177 				printf("%02X ",RC2plain[n][i]);
    178 			printf("\n");
    179 			err=3;
    180 			}
    181 		}
    182 
    183 	if (err == 0) printf("ecb RC2 ok\n");
    184 #ifdef undef
    185 	memcpy(iv,k,8);
    186 	idea_cbc_encrypt((unsigned char *)text,out,strlen(text)+1,&key,iv,1);
    187 	memcpy(iv,k,8);
    188 	idea_cbc_encrypt(out,out,8,&dkey,iv,0);
    189 	idea_cbc_encrypt(&(out[8]),&(out[8]),strlen(text)+1-8,&dkey,iv,0);
    190 	if (memcmp(text,out,strlen(text)+1) != 0)
    191 		{
    192 		printf("cbc idea bad\n");
    193 		err=4;
    194 		}
    195 	else
    196 		printf("cbc idea ok\n");
    197 
    198 	printf("cfb64 idea ");
    199 	if (cfb64_test(cfb_cipher64))
    200 		{
    201 		printf("bad\n");
    202 		err=5;
    203 		}
    204 	else
    205 		printf("ok\n");
    206 #endif
    207 
    208 #ifdef OPENSSL_SYS_NETWARE
    209     if (err) printf("ERROR: %d\n", err);
    210 #endif
    211 	EXIT(err);
    212 	return(err);
    213 	}
    214 
    215 #ifdef undef
    216 static int cfb64_test(unsigned char *cfb_cipher)
    217         {
    218         IDEA_KEY_SCHEDULE eks,dks;
    219         int err=0,i,n;
    220 
    221         idea_set_encrypt_key(cfb_key,&eks);
    222         idea_set_decrypt_key(&eks,&dks);
    223         memcpy(cfb_tmp,cfb_iv,8);
    224         n=0;
    225         idea_cfb64_encrypt(plain,cfb_buf1,(long)12,&eks,
    226                 cfb_tmp,&n,IDEA_ENCRYPT);
    227         idea_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
    228                 (long)CFB_TEST_SIZE-12,&eks,
    229                 cfb_tmp,&n,IDEA_ENCRYPT);
    230         if (memcmp(cfb_cipher,cfb_buf1,CFB_TEST_SIZE) != 0)
    231                 {
    232                 err=1;
    233                 printf("idea_cfb64_encrypt encrypt error\n");
    234                 for (i=0; i<CFB_TEST_SIZE; i+=8)
    235                         printf("%s\n",pt(&(cfb_buf1[i])));
    236                 }
    237         memcpy(cfb_tmp,cfb_iv,8);
    238         n=0;
    239         idea_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,&eks,
    240                 cfb_tmp,&n,IDEA_DECRYPT);
    241         idea_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
    242                 (long)CFB_TEST_SIZE-17,&dks,
    243                 cfb_tmp,&n,IDEA_DECRYPT);
    244         if (memcmp(plain,cfb_buf2,CFB_TEST_SIZE) != 0)
    245                 {
    246                 err=1;
    247                 printf("idea_cfb_encrypt decrypt error\n");
    248                 for (i=0; i<24; i+=8)
    249                         printf("%s\n",pt(&(cfb_buf2[i])));
    250                 }
    251         return(err);
    252         }
    253 
    254 static char *pt(unsigned char *p)
    255 	{
    256 	static char bufs[10][20];
    257 	static int bnum=0;
    258 	char *ret;
    259 	int i;
    260 	static char *f="0123456789ABCDEF";
    261 
    262 	ret= &(bufs[bnum++][0]);
    263 	bnum%=10;
    264 	for (i=0; i<8; i++)
    265 		{
    266 		ret[i*2]=f[(p[i]>>4)&0xf];
    267 		ret[i*2+1]=f[p[i]&0xf];
    268 		}
    269 	ret[16]='\0';
    270 	return(ret);
    271 	}
    272 
    273 #endif
    274 #endif
    275