2
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
5
/* ====================================================================
6
* Copyright (c) 2005 The OpenSSL Project. All rights reserved.
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in
17
* the documentation and/or other materials provided with the
20
* 3. All advertising materials mentioning features or use of this
21
* software must display the following acknowledgment:
22
* "This product includes software developed by the OpenSSL Project
23
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
* endorse or promote products derived from this software without
27
* prior written permission. For written permission, please contact
28
* licensing@OpenSSL.org.
30
* 5. Products derived from this software may not be called "OpenSSL"
31
* nor may "OpenSSL" appear in their names without prior written
32
* permission of the OpenSSL Project.
34
* 6. Redistributions of any form whatsoever must retain the following
36
* "This product includes software developed by the OpenSSL Project
37
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
* OF THE POSSIBILITY OF SUCH DAMAGE.
51
* ====================================================================
53
* This product includes cryptographic software written by Eric Young
54
* (eay@cryptsoft.com). This product includes software written by Tim
55
* Hudson (tjh@cryptsoft.com).
62
#include <openssl/bio.h>
63
#include <openssl/evp.h>
64
#include <openssl/err.h>
65
#include <openssl/bn.h>
66
#include <openssl/x509v3.h>
70
int main(int argc, char *argv[])
72
printf("No FIPS SHAXXX support\n");
80
static int dgst_test(FILE *out, FILE *in);
81
static int print_dgst(const EVP_MD *md, FILE *out,
82
unsigned char *Msg, int Msglen);
83
static int print_monte(const EVP_MD *md, FILE *out,
84
unsigned char *Seed, int SeedLen);
86
int main(int argc, char **argv)
88
FILE *in = NULL, *out = NULL;
101
in = fopen(argv[1], "r");
106
out = fopen(argv[2], "w");
110
fprintf(stderr, "FATAL input initialization error\n");
116
fprintf(stderr, "FATAL output initialization error\n");
120
if (!dgst_test(out, in))
122
fprintf(stderr, "FATAL digest file processing error\n");
133
if (in && (in != stdin))
135
if (out && (out != stdout))
142
#define SHA_TEST_MAX_BITS 102400
143
#define SHA_TEST_MAXLINELEN (((SHA_TEST_MAX_BITS >> 3) * 2) + 100)
145
int dgst_test(FILE *out, FILE *in)
147
const EVP_MD *md = NULL;
148
char *linebuf, *olinebuf, *p, *q;
149
char *keyword, *value;
150
unsigned char *Msg = NULL, *Seed = NULL;
151
long MsgLen = -1, Len = -1, SeedLen = -1;
155
olinebuf = OPENSSL_malloc(SHA_TEST_MAXLINELEN);
156
linebuf = OPENSSL_malloc(SHA_TEST_MAXLINELEN);
158
if (!linebuf || !olinebuf)
162
while (fgets(olinebuf, SHA_TEST_MAXLINELEN, in))
165
strcpy(linebuf, olinebuf);
167
/* Skip leading space */
168
while (isspace((unsigned char)*keyword))
171
/* Look for = sign */
172
p = strchr(linebuf, '=');
174
/* If no = or starts with [ (for [L=20] line) just copy */
177
fputs(olinebuf, out);
183
/* Remove trailing space */
184
while (isspace((unsigned char)*q))
190
/* Remove leading space from value */
191
while (isspace((unsigned char)*value))
194
/* Remove trailing space from value */
195
p = value + strlen(value) - 1;
196
while (*p == '\n' || isspace((unsigned char)*p))
199
if (!strcmp(keyword,"[L") && *p==']')
203
case 20: md=EVP_sha1(); break;
204
case 28: md=EVP_sha224(); break;
205
case 32: md=EVP_sha256(); break;
206
case 48: md=EVP_sha384(); break;
207
case 64: md=EVP_sha512(); break;
208
default: goto parse_error;
211
else if (!strcmp(keyword, "Len"))
218
/* Only handle multiples of 8 bits */
221
if (Len > SHA_TEST_MAX_BITS)
226
else if (!strcmp(keyword, "Msg"))
229
if (strlen(value) & 1)
233
Msg = hex2bin_m(value, &tmplen);
237
else if (!strcmp(keyword, "Seed"))
239
if (strlen(value) & 1)
243
Seed = hex2bin_m(value, &SeedLen);
247
else if (!strcmp(keyword, "MD"))
252
fputs(olinebuf, out);
254
if (md && Msg && (MsgLen >= 0))
256
if (!print_dgst(md, out, Msg, MsgLen))
263
else if (md && Seed && (SeedLen > 0))
265
if (!print_monte(md, out, Seed, SeedLen))
282
OPENSSL_free(olinebuf);
284
OPENSSL_free(linebuf);
294
fprintf(stderr, "FATAL parse error processing line %d\n", lnum);
300
static int print_dgst(const EVP_MD *emd, FILE *out,
301
unsigned char *Msg, int Msglen)
304
unsigned char md[EVP_MAX_MD_SIZE];
305
if (!EVP_Digest(Msg, Msglen, md, (unsigned int *)&mdlen, emd, NULL))
307
fputs("Error calculating HASH\n", stderr);
311
for (i = 0; i < mdlen; i++)
312
fprintf(out, "%02x", md[i]);
317
static int print_monte(const EVP_MD *md, FILE *out,
318
unsigned char *Seed, int SeedLen)
320
unsigned int i, j, k;
323
unsigned char *m1, *m2, *m3, *p;
324
unsigned int mlen, m1len, m2len, m3len;
326
EVP_MD_CTX_init(&ctx);
328
if (SeedLen > EVP_MAX_MD_SIZE)
331
mlen = EVP_MAX_MD_SIZE;
333
m1 = OPENSSL_malloc(mlen);
334
m2 = OPENSSL_malloc(mlen);
335
m3 = OPENSSL_malloc(mlen);
337
if (!m1 || !m2 || !m3)
340
m1len = m2len = m3len = SeedLen;
341
memcpy(m1, Seed, SeedLen);
342
memcpy(m2, Seed, SeedLen);
343
memcpy(m3, Seed, SeedLen);
347
for (j = 0; j < 100; j++)
349
for (i = 0; i < 1000; i++)
351
EVP_DigestInit_ex(&ctx, md, NULL);
352
EVP_DigestUpdate(&ctx, m1, m1len);
353
EVP_DigestUpdate(&ctx, m2, m2len);
354
EVP_DigestUpdate(&ctx, m3, m3len);
361
EVP_DigestFinal_ex(&ctx, m3, &m3len);
363
fprintf(out, "COUNT = %d\n", j);
365
for (k = 0; k < m3len; k++)
366
fprintf(out, "%02x", m3[k]);
368
memcpy(m1, m3, m3len);
369
memcpy(m2, m3, m3len);
370
m1len = m2len = m3len;
383
EVP_MD_CTX_cleanup(&ctx);