1160814Ssimon/* crypto/sha/sha512t.c */
2160814Ssimon/* ====================================================================
3160814Ssimon * Copyright (c) 2004 The OpenSSL Project.  All rights reserved.
4160814Ssimon * ====================================================================
5160814Ssimon */
6160814Ssimon#include <stdio.h>
7160814Ssimon#include <string.h>
8160814Ssimon#include <stdlib.h>
9160814Ssimon
10160814Ssimon#include <openssl/sha.h>
11160814Ssimon#include <openssl/evp.h>
12160814Ssimon#include <openssl/crypto.h>
13160814Ssimon
14160814Ssimon#if defined(OPENSSL_NO_SHA) || defined(OPENSSL_NO_SHA512)
15160814Ssimonint main(int argc, char *argv[])
16160814Ssimon{
17160814Ssimon    printf("No SHA512 support\n");
18280304Sjkim    return (0);
19160814Ssimon}
20160814Ssimon#else
21160814Ssimon
22160814Ssimonunsigned char app_c1[SHA512_DIGEST_LENGTH] = {
23280304Sjkim    0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
24280304Sjkim    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
25280304Sjkim    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
26280304Sjkim    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
27280304Sjkim    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
28280304Sjkim    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
29280304Sjkim    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
30280304Sjkim    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f
31280304Sjkim};
32160814Ssimon
33160814Ssimonunsigned char app_c2[SHA512_DIGEST_LENGTH] = {
34280304Sjkim    0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
35280304Sjkim    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
36280304Sjkim    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
37280304Sjkim    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
38280304Sjkim    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
39280304Sjkim    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
40280304Sjkim    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
41280304Sjkim    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09
42280304Sjkim};
43160814Ssimon
44160814Ssimonunsigned char app_c3[SHA512_DIGEST_LENGTH] = {
45280304Sjkim    0xe7, 0x18, 0x48, 0x3d, 0x0c, 0xe7, 0x69, 0x64,
46280304Sjkim    0x4e, 0x2e, 0x42, 0xc7, 0xbc, 0x15, 0xb4, 0x63,
47280304Sjkim    0x8e, 0x1f, 0x98, 0xb1, 0x3b, 0x20, 0x44, 0x28,
48280304Sjkim    0x56, 0x32, 0xa8, 0x03, 0xaf, 0xa9, 0x73, 0xeb,
49280304Sjkim    0xde, 0x0f, 0xf2, 0x44, 0x87, 0x7e, 0xa6, 0x0a,
50280304Sjkim    0x4c, 0xb0, 0x43, 0x2c, 0xe5, 0x77, 0xc3, 0x1b,
51280304Sjkim    0xeb, 0x00, 0x9c, 0x5c, 0x2c, 0x49, 0xaa, 0x2e,
52280304Sjkim    0x4e, 0xad, 0xb2, 0x17, 0xad, 0x8c, 0xc0, 0x9b
53280304Sjkim};
54160814Ssimon
55160814Ssimonunsigned char app_d1[SHA384_DIGEST_LENGTH] = {
56280304Sjkim    0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
57280304Sjkim    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
58280304Sjkim    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
59280304Sjkim    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
60280304Sjkim    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
61280304Sjkim    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7
62280304Sjkim};
63160814Ssimon
64160814Ssimonunsigned char app_d2[SHA384_DIGEST_LENGTH] = {
65280304Sjkim    0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
66280304Sjkim    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
67280304Sjkim    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
68280304Sjkim    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
69280304Sjkim    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
70280304Sjkim    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39
71280304Sjkim};
72160814Ssimon
73160814Ssimonunsigned char app_d3[SHA384_DIGEST_LENGTH] = {
74280304Sjkim    0x9d, 0x0e, 0x18, 0x09, 0x71, 0x64, 0x74, 0xcb,
75280304Sjkim    0x08, 0x6e, 0x83, 0x4e, 0x31, 0x0a, 0x4a, 0x1c,
76280304Sjkim    0xed, 0x14, 0x9e, 0x9c, 0x00, 0xf2, 0x48, 0x52,
77280304Sjkim    0x79, 0x72, 0xce, 0xc5, 0x70, 0x4c, 0x2a, 0x5b,
78280304Sjkim    0x07, 0xb8, 0xb3, 0xdc, 0x38, 0xec, 0xc4, 0xeb,
79280304Sjkim    0xae, 0x97, 0xdd, 0xd8, 0x7f, 0x3d, 0x89, 0x85
80280304Sjkim};
81160814Ssimon
82280304Sjkimint main(int argc, char **argv)
83280304Sjkim{
84280304Sjkim    unsigned char md[SHA512_DIGEST_LENGTH];
85280304Sjkim    int i;
86280304Sjkim    EVP_MD_CTX evp;
87160814Ssimon
88280304Sjkim# ifdef OPENSSL_IA32_SSE2
89280304Sjkim    /*
90280304Sjkim     * Alternative to this is to call OpenSSL_add_all_algorithms... The below
91280304Sjkim     * code is retained exclusively for debugging purposes.
92280304Sjkim     */
93280304Sjkim    {
94280304Sjkim        char *env;
95160814Ssimon
96280304Sjkim        if ((env = getenv("OPENSSL_ia32cap")))
97280304Sjkim            OPENSSL_ia32cap = strtoul(env, NULL, 0);
98160814Ssimon    }
99280304Sjkim# endif
100160814Ssimon
101280304Sjkim    fprintf(stdout, "Testing SHA-512 ");
102160814Ssimon
103280304Sjkim    EVP_Digest("abc", 3, md, NULL, EVP_sha512(), NULL);
104280304Sjkim    if (memcmp(md, app_c1, sizeof(app_c1))) {
105280304Sjkim        fflush(stdout);
106280304Sjkim        fprintf(stderr, "\nTEST 1 of 3 failed.\n");
107280304Sjkim        return 1;
108280304Sjkim    } else
109280304Sjkim        fprintf(stdout, ".");
110280304Sjkim    fflush(stdout);
111160814Ssimon
112280304Sjkim    EVP_Digest("abcdefgh" "bcdefghi" "cdefghij" "defghijk"
113280304Sjkim               "efghijkl" "fghijklm" "ghijklmn" "hijklmno"
114280304Sjkim               "ijklmnop" "jklmnopq" "klmnopqr" "lmnopqrs"
115280304Sjkim               "mnopqrst" "nopqrstu", 112, md, NULL, EVP_sha512(), NULL);
116280304Sjkim    if (memcmp(md, app_c2, sizeof(app_c2))) {
117280304Sjkim        fflush(stdout);
118280304Sjkim        fprintf(stderr, "\nTEST 2 of 3 failed.\n");
119280304Sjkim        return 1;
120280304Sjkim    } else
121280304Sjkim        fprintf(stdout, ".");
122280304Sjkim    fflush(stdout);
123160814Ssimon
124280304Sjkim    EVP_MD_CTX_init(&evp);
125280304Sjkim    EVP_DigestInit_ex(&evp, EVP_sha512(), NULL);
126280304Sjkim    for (i = 0; i < 1000000; i += 288)
127280304Sjkim        EVP_DigestUpdate(&evp, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
128280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
129280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
130280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
131280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
132280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
133280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
134280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
135280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
136280304Sjkim                         (1000000 - i) < 288 ? 1000000 - i : 288);
137280304Sjkim    EVP_DigestFinal_ex(&evp, md, NULL);
138280304Sjkim    EVP_MD_CTX_cleanup(&evp);
139160814Ssimon
140280304Sjkim    if (memcmp(md, app_c3, sizeof(app_c3))) {
141280304Sjkim        fflush(stdout);
142280304Sjkim        fprintf(stderr, "\nTEST 3 of 3 failed.\n");
143280304Sjkim        return 1;
144280304Sjkim    } else
145280304Sjkim        fprintf(stdout, ".");
146280304Sjkim    fflush(stdout);
147160814Ssimon
148280304Sjkim    fprintf(stdout, " passed.\n");
149280304Sjkim    fflush(stdout);
150160814Ssimon
151280304Sjkim    fprintf(stdout, "Testing SHA-384 ");
152160814Ssimon
153280304Sjkim    EVP_Digest("abc", 3, md, NULL, EVP_sha384(), NULL);
154280304Sjkim    if (memcmp(md, app_d1, sizeof(app_d1))) {
155280304Sjkim        fflush(stdout);
156280304Sjkim        fprintf(stderr, "\nTEST 1 of 3 failed.\n");
157280304Sjkim        return 1;
158280304Sjkim    } else
159280304Sjkim        fprintf(stdout, ".");
160280304Sjkim    fflush(stdout);
161160814Ssimon
162280304Sjkim    EVP_Digest("abcdefgh" "bcdefghi" "cdefghij" "defghijk"
163280304Sjkim               "efghijkl" "fghijklm" "ghijklmn" "hijklmno"
164280304Sjkim               "ijklmnop" "jklmnopq" "klmnopqr" "lmnopqrs"
165280304Sjkim               "mnopqrst" "nopqrstu", 112, md, NULL, EVP_sha384(), NULL);
166280304Sjkim    if (memcmp(md, app_d2, sizeof(app_d2))) {
167280304Sjkim        fflush(stdout);
168280304Sjkim        fprintf(stderr, "\nTEST 2 of 3 failed.\n");
169280304Sjkim        return 1;
170280304Sjkim    } else
171280304Sjkim        fprintf(stdout, ".");
172280304Sjkim    fflush(stdout);
173160814Ssimon
174280304Sjkim    EVP_MD_CTX_init(&evp);
175280304Sjkim    EVP_DigestInit_ex(&evp, EVP_sha384(), NULL);
176280304Sjkim    for (i = 0; i < 1000000; i += 64)
177280304Sjkim        EVP_DigestUpdate(&evp, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
178280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
179280304Sjkim                         (1000000 - i) < 64 ? 1000000 - i : 64);
180280304Sjkim    EVP_DigestFinal_ex(&evp, md, NULL);
181280304Sjkim    EVP_MD_CTX_cleanup(&evp);
182160814Ssimon
183280304Sjkim    if (memcmp(md, app_d3, sizeof(app_d3))) {
184280304Sjkim        fflush(stdout);
185280304Sjkim        fprintf(stderr, "\nTEST 3 of 3 failed.\n");
186280304Sjkim        return 1;
187280304Sjkim    } else
188280304Sjkim        fprintf(stdout, ".");
189280304Sjkim    fflush(stdout);
190160814Ssimon
191280304Sjkim    fprintf(stdout, " passed.\n");
192280304Sjkim    fflush(stdout);
193160814Ssimon
194280304Sjkim    return 0;
195160814Ssimon}
196160814Ssimon#endif
197