xref: /onnv-gate/usr/src/common/openssl/crypto/sha/shatest.c (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /* crypto/sha/shatest.c */
2*0Sstevel@tonic-gate /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3*0Sstevel@tonic-gate  * All rights reserved.
4*0Sstevel@tonic-gate  *
5*0Sstevel@tonic-gate  * This package is an SSL implementation written
6*0Sstevel@tonic-gate  * by Eric Young (eay@cryptsoft.com).
7*0Sstevel@tonic-gate  * The implementation was written so as to conform with Netscapes SSL.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * This library is free for commercial and non-commercial use as long as
10*0Sstevel@tonic-gate  * the following conditions are aheared to.  The following conditions
11*0Sstevel@tonic-gate  * apply to all code found in this distribution, be it the RC4, RSA,
12*0Sstevel@tonic-gate  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13*0Sstevel@tonic-gate  * included with this distribution is covered by the same copyright terms
14*0Sstevel@tonic-gate  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15*0Sstevel@tonic-gate  *
16*0Sstevel@tonic-gate  * Copyright remains Eric Young's, and as such any Copyright notices in
17*0Sstevel@tonic-gate  * the code are not to be removed.
18*0Sstevel@tonic-gate  * If this package is used in a product, Eric Young should be given attribution
19*0Sstevel@tonic-gate  * as the author of the parts of the library used.
20*0Sstevel@tonic-gate  * This can be in the form of a textual message at program startup or
21*0Sstevel@tonic-gate  * in documentation (online or textual) provided with the package.
22*0Sstevel@tonic-gate  *
23*0Sstevel@tonic-gate  * Redistribution and use in source and binary forms, with or without
24*0Sstevel@tonic-gate  * modification, are permitted provided that the following conditions
25*0Sstevel@tonic-gate  * are met:
26*0Sstevel@tonic-gate  * 1. Redistributions of source code must retain the copyright
27*0Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer.
28*0Sstevel@tonic-gate  * 2. Redistributions in binary form must reproduce the above copyright
29*0Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer in the
30*0Sstevel@tonic-gate  *    documentation and/or other materials provided with the distribution.
31*0Sstevel@tonic-gate  * 3. All advertising materials mentioning features or use of this software
32*0Sstevel@tonic-gate  *    must display the following acknowledgement:
33*0Sstevel@tonic-gate  *    "This product includes cryptographic software written by
34*0Sstevel@tonic-gate  *     Eric Young (eay@cryptsoft.com)"
35*0Sstevel@tonic-gate  *    The word 'cryptographic' can be left out if the rouines from the library
36*0Sstevel@tonic-gate  *    being used are not cryptographic related :-).
37*0Sstevel@tonic-gate  * 4. If you include any Windows specific code (or a derivative thereof) from
38*0Sstevel@tonic-gate  *    the apps directory (application code) you must include an acknowledgement:
39*0Sstevel@tonic-gate  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40*0Sstevel@tonic-gate  *
41*0Sstevel@tonic-gate  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42*0Sstevel@tonic-gate  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43*0Sstevel@tonic-gate  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44*0Sstevel@tonic-gate  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45*0Sstevel@tonic-gate  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46*0Sstevel@tonic-gate  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47*0Sstevel@tonic-gate  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48*0Sstevel@tonic-gate  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49*0Sstevel@tonic-gate  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50*0Sstevel@tonic-gate  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51*0Sstevel@tonic-gate  * SUCH DAMAGE.
52*0Sstevel@tonic-gate  *
53*0Sstevel@tonic-gate  * The licence and distribution terms for any publically available version or
54*0Sstevel@tonic-gate  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55*0Sstevel@tonic-gate  * copied and put under another distribution licence
56*0Sstevel@tonic-gate  * [including the GNU Public Licence.]
57*0Sstevel@tonic-gate  */
58*0Sstevel@tonic-gate 
59*0Sstevel@tonic-gate #include <stdio.h>
60*0Sstevel@tonic-gate #include <string.h>
61*0Sstevel@tonic-gate #include <stdlib.h>
62*0Sstevel@tonic-gate 
63*0Sstevel@tonic-gate #include "../e_os.h"
64*0Sstevel@tonic-gate 
65*0Sstevel@tonic-gate #ifdef OPENSSL_NO_SHA
66*0Sstevel@tonic-gate int main(int argc, char *argv[])
67*0Sstevel@tonic-gate {
68*0Sstevel@tonic-gate     printf("No SHA support\n");
69*0Sstevel@tonic-gate     return(0);
70*0Sstevel@tonic-gate }
71*0Sstevel@tonic-gate #else
72*0Sstevel@tonic-gate #include <openssl/evp.h>
73*0Sstevel@tonic-gate #include <openssl/sha.h>
74*0Sstevel@tonic-gate 
75*0Sstevel@tonic-gate #ifdef CHARSET_EBCDIC
76*0Sstevel@tonic-gate #include <openssl/ebcdic.h>
77*0Sstevel@tonic-gate #endif
78*0Sstevel@tonic-gate 
79*0Sstevel@tonic-gate #define SHA_0 /* FIPS 180 */
80*0Sstevel@tonic-gate #undef  SHA_1 /* FIPS 180-1 */
81*0Sstevel@tonic-gate 
82*0Sstevel@tonic-gate static char *test[]={
83*0Sstevel@tonic-gate 	"abc",
84*0Sstevel@tonic-gate 	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
85*0Sstevel@tonic-gate 	NULL,
86*0Sstevel@tonic-gate 	};
87*0Sstevel@tonic-gate 
88*0Sstevel@tonic-gate #ifdef SHA_0
89*0Sstevel@tonic-gate static char *ret[]={
90*0Sstevel@tonic-gate 	"0164b8a914cd2a5e74c4f7ff082c4d97f1edf880",
91*0Sstevel@tonic-gate 	"d2516ee1acfa5baf33dfc1c471e438449ef134c8",
92*0Sstevel@tonic-gate 	};
93*0Sstevel@tonic-gate static char *bigret=
94*0Sstevel@tonic-gate 	"3232affa48628a26653b5aaa44541fd90d690603";
95*0Sstevel@tonic-gate #endif
96*0Sstevel@tonic-gate #ifdef SHA_1
97*0Sstevel@tonic-gate static char *ret[]={
98*0Sstevel@tonic-gate 	"a9993e364706816aba3e25717850c26c9cd0d89d",
99*0Sstevel@tonic-gate 	"84983e441c3bd26ebaae4aa1f95129e5e54670f1",
100*0Sstevel@tonic-gate 	};
101*0Sstevel@tonic-gate static char *bigret=
102*0Sstevel@tonic-gate 	"34aa973cd4c4daa4f61eeb2bdbad27316534016f";
103*0Sstevel@tonic-gate #endif
104*0Sstevel@tonic-gate 
105*0Sstevel@tonic-gate static char *pt(unsigned char *md);
106*0Sstevel@tonic-gate int main(int argc, char *argv[])
107*0Sstevel@tonic-gate 	{
108*0Sstevel@tonic-gate 	int i,err=0;
109*0Sstevel@tonic-gate 	unsigned char **P,**R;
110*0Sstevel@tonic-gate 	static unsigned char buf[1000];
111*0Sstevel@tonic-gate 	char *p,*r;
112*0Sstevel@tonic-gate 	EVP_MD_CTX c;
113*0Sstevel@tonic-gate 	unsigned char md[SHA_DIGEST_LENGTH];
114*0Sstevel@tonic-gate 
115*0Sstevel@tonic-gate #ifdef CHARSET_EBCDIC
116*0Sstevel@tonic-gate 	ebcdic2ascii(test[0], test[0], strlen(test[0]));
117*0Sstevel@tonic-gate 	ebcdic2ascii(test[1], test[1], strlen(test[1]));
118*0Sstevel@tonic-gate #endif
119*0Sstevel@tonic-gate 
120*0Sstevel@tonic-gate 	EVP_MD_CTX_init(&c);
121*0Sstevel@tonic-gate 	P=(unsigned char **)test;
122*0Sstevel@tonic-gate 	R=(unsigned char **)ret;
123*0Sstevel@tonic-gate 	i=1;
124*0Sstevel@tonic-gate 	while (*P != NULL)
125*0Sstevel@tonic-gate 		{
126*0Sstevel@tonic-gate 		EVP_Digest(*P,(unsigned long)strlen((char *)*P),md,NULL,EVP_sha(), NULL);
127*0Sstevel@tonic-gate 		p=pt(md);
128*0Sstevel@tonic-gate 		if (strcmp(p,(char *)*R) != 0)
129*0Sstevel@tonic-gate 			{
130*0Sstevel@tonic-gate 			printf("error calculating SHA on '%s'\n",*P);
131*0Sstevel@tonic-gate 			printf("got %s instead of %s\n",p,*R);
132*0Sstevel@tonic-gate 			err++;
133*0Sstevel@tonic-gate 			}
134*0Sstevel@tonic-gate 		else
135*0Sstevel@tonic-gate 			printf("test %d ok\n",i);
136*0Sstevel@tonic-gate 		i++;
137*0Sstevel@tonic-gate 		R++;
138*0Sstevel@tonic-gate 		P++;
139*0Sstevel@tonic-gate 		}
140*0Sstevel@tonic-gate 
141*0Sstevel@tonic-gate 	memset(buf,'a',1000);
142*0Sstevel@tonic-gate #ifdef CHARSET_EBCDIC
143*0Sstevel@tonic-gate 	ebcdic2ascii(buf, buf, 1000);
144*0Sstevel@tonic-gate #endif /*CHARSET_EBCDIC*/
145*0Sstevel@tonic-gate 	EVP_DigestInit_ex(&c,EVP_sha(), NULL);
146*0Sstevel@tonic-gate 	for (i=0; i<1000; i++)
147*0Sstevel@tonic-gate 		EVP_DigestUpdate(&c,buf,1000);
148*0Sstevel@tonic-gate 	EVP_DigestFinal_ex(&c,md,NULL);
149*0Sstevel@tonic-gate 	p=pt(md);
150*0Sstevel@tonic-gate 
151*0Sstevel@tonic-gate 	r=bigret;
152*0Sstevel@tonic-gate 	if (strcmp(p,r) != 0)
153*0Sstevel@tonic-gate 		{
154*0Sstevel@tonic-gate 		printf("error calculating SHA on '%s'\n",p);
155*0Sstevel@tonic-gate 		printf("got %s instead of %s\n",p,r);
156*0Sstevel@tonic-gate 		err++;
157*0Sstevel@tonic-gate 		}
158*0Sstevel@tonic-gate 	else
159*0Sstevel@tonic-gate 		printf("test 3 ok\n");
160*0Sstevel@tonic-gate 	EVP_MD_CTX_cleanup(&c);
161*0Sstevel@tonic-gate 	EXIT(err);
162*0Sstevel@tonic-gate 	return(0);
163*0Sstevel@tonic-gate 	}
164*0Sstevel@tonic-gate 
165*0Sstevel@tonic-gate static char *pt(unsigned char *md)
166*0Sstevel@tonic-gate 	{
167*0Sstevel@tonic-gate 	int i;
168*0Sstevel@tonic-gate 	static char buf[80];
169*0Sstevel@tonic-gate 
170*0Sstevel@tonic-gate 	for (i=0; i<SHA_DIGEST_LENGTH; i++)
171*0Sstevel@tonic-gate 		sprintf(&(buf[i*2]),"%02x",md[i]);
172*0Sstevel@tonic-gate 	return(buf);
173*0Sstevel@tonic-gate 	}
174*0Sstevel@tonic-gate #endif
175