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");
18280297Sjkim    return (0);
19160814Ssimon}
20160814Ssimon#else
21160814Ssimon
22160814Ssimonunsigned char app_c1[SHA512_DIGEST_LENGTH] = {
23280297Sjkim    0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
24280297Sjkim    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
25280297Sjkim    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
26280297Sjkim    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
27280297Sjkim    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
28280297Sjkim    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
29280297Sjkim    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
30280297Sjkim    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f
31280297Sjkim};
32160814Ssimon
33160814Ssimonunsigned char app_c2[SHA512_DIGEST_LENGTH] = {
34280297Sjkim    0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
35280297Sjkim    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
36280297Sjkim    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
37280297Sjkim    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
38280297Sjkim    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
39280297Sjkim    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
40280297Sjkim    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
41280297Sjkim    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09
42280297Sjkim};
43160814Ssimon
44160814Ssimonunsigned char app_c3[SHA512_DIGEST_LENGTH] = {
45280297Sjkim    0xe7, 0x18, 0x48, 0x3d, 0x0c, 0xe7, 0x69, 0x64,
46280297Sjkim    0x4e, 0x2e, 0x42, 0xc7, 0xbc, 0x15, 0xb4, 0x63,
47280297Sjkim    0x8e, 0x1f, 0x98, 0xb1, 0x3b, 0x20, 0x44, 0x28,
48280297Sjkim    0x56, 0x32, 0xa8, 0x03, 0xaf, 0xa9, 0x73, 0xeb,
49280297Sjkim    0xde, 0x0f, 0xf2, 0x44, 0x87, 0x7e, 0xa6, 0x0a,
50280297Sjkim    0x4c, 0xb0, 0x43, 0x2c, 0xe5, 0x77, 0xc3, 0x1b,
51280297Sjkim    0xeb, 0x00, 0x9c, 0x5c, 0x2c, 0x49, 0xaa, 0x2e,
52280297Sjkim    0x4e, 0xad, 0xb2, 0x17, 0xad, 0x8c, 0xc0, 0x9b
53280297Sjkim};
54160814Ssimon
55160814Ssimonunsigned char app_d1[SHA384_DIGEST_LENGTH] = {
56280297Sjkim    0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
57280297Sjkim    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
58280297Sjkim    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
59280297Sjkim    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
60280297Sjkim    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
61280297Sjkim    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7
62280297Sjkim};
63160814Ssimon
64160814Ssimonunsigned char app_d2[SHA384_DIGEST_LENGTH] = {
65280297Sjkim    0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
66280297Sjkim    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
67280297Sjkim    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
68280297Sjkim    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
69280297Sjkim    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
70280297Sjkim    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39
71280297Sjkim};
72160814Ssimon
73160814Ssimonunsigned char app_d3[SHA384_DIGEST_LENGTH] = {
74280297Sjkim    0x9d, 0x0e, 0x18, 0x09, 0x71, 0x64, 0x74, 0xcb,
75280297Sjkim    0x08, 0x6e, 0x83, 0x4e, 0x31, 0x0a, 0x4a, 0x1c,
76280297Sjkim    0xed, 0x14, 0x9e, 0x9c, 0x00, 0xf2, 0x48, 0x52,
77280297Sjkim    0x79, 0x72, 0xce, 0xc5, 0x70, 0x4c, 0x2a, 0x5b,
78280297Sjkim    0x07, 0xb8, 0xb3, 0xdc, 0x38, 0xec, 0xc4, 0xeb,
79280297Sjkim    0xae, 0x97, 0xdd, 0xd8, 0x7f, 0x3d, 0x89, 0x85
80280297Sjkim};
81160814Ssimon
82280297Sjkimint main(int argc, char **argv)
83280297Sjkim{
84280297Sjkim    unsigned char md[SHA512_DIGEST_LENGTH];
85280297Sjkim    int i;
86280297Sjkim    EVP_MD_CTX evp;
87160814Ssimon
88280297Sjkim# ifdef OPENSSL_IA32_SSE2
89280297Sjkim    /*
90280297Sjkim     * Alternative to this is to call OpenSSL_add_all_algorithms... The below
91280297Sjkim     * code is retained exclusively for debugging purposes.
92280297Sjkim     */
93280297Sjkim    {
94280297Sjkim        char *env;
95160814Ssimon
96280297Sjkim        if ((env = getenv("OPENSSL_ia32cap")))
97280297Sjkim            OPENSSL_ia32cap = strtoul(env, NULL, 0);
98160814Ssimon    }
99280297Sjkim# endif
100160814Ssimon
101280297Sjkim    fprintf(stdout, "Testing SHA-512 ");
102160814Ssimon
103280297Sjkim    EVP_Digest("abc", 3, md, NULL, EVP_sha512(), NULL);
104280297Sjkim    if (memcmp(md, app_c1, sizeof(app_c1))) {
105280297Sjkim        fflush(stdout);
106280297Sjkim        fprintf(stderr, "\nTEST 1 of 3 failed.\n");
107280297Sjkim        return 1;
108280297Sjkim    } else
109280297Sjkim        fprintf(stdout, ".");
110280297Sjkim    fflush(stdout);
111160814Ssimon
112280297Sjkim    EVP_Digest("abcdefgh" "bcdefghi" "cdefghij" "defghijk"
113280297Sjkim               "efghijkl" "fghijklm" "ghijklmn" "hijklmno"
114280297Sjkim               "ijklmnop" "jklmnopq" "klmnopqr" "lmnopqrs"
115280297Sjkim               "mnopqrst" "nopqrstu", 112, md, NULL, EVP_sha512(), NULL);
116280297Sjkim    if (memcmp(md, app_c2, sizeof(app_c2))) {
117280297Sjkim        fflush(stdout);
118280297Sjkim        fprintf(stderr, "\nTEST 2 of 3 failed.\n");
119280297Sjkim        return 1;
120280297Sjkim    } else
121280297Sjkim        fprintf(stdout, ".");
122280297Sjkim    fflush(stdout);
123160814Ssimon
124280297Sjkim    EVP_MD_CTX_init(&evp);
125280297Sjkim    EVP_DigestInit_ex(&evp, EVP_sha512(), NULL);
126280297Sjkim    for (i = 0; i < 1000000; i += 288)
127280297Sjkim        EVP_DigestUpdate(&evp, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
128280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
129280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
130280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
131280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
132280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
133280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
134280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
135280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
136280297Sjkim                         (1000000 - i) < 288 ? 1000000 - i : 288);
137280297Sjkim    EVP_DigestFinal_ex(&evp, md, NULL);
138280297Sjkim    EVP_MD_CTX_cleanup(&evp);
139160814Ssimon
140280297Sjkim    if (memcmp(md, app_c3, sizeof(app_c3))) {
141280297Sjkim        fflush(stdout);
142280297Sjkim        fprintf(stderr, "\nTEST 3 of 3 failed.\n");
143280297Sjkim        return 1;
144280297Sjkim    } else
145280297Sjkim        fprintf(stdout, ".");
146280297Sjkim    fflush(stdout);
147160814Ssimon
148280297Sjkim    fprintf(stdout, " passed.\n");
149280297Sjkim    fflush(stdout);
150160814Ssimon
151280297Sjkim    fprintf(stdout, "Testing SHA-384 ");
152160814Ssimon
153280297Sjkim    EVP_Digest("abc", 3, md, NULL, EVP_sha384(), NULL);
154280297Sjkim    if (memcmp(md, app_d1, sizeof(app_d1))) {
155280297Sjkim        fflush(stdout);
156280297Sjkim        fprintf(stderr, "\nTEST 1 of 3 failed.\n");
157280297Sjkim        return 1;
158280297Sjkim    } else
159280297Sjkim        fprintf(stdout, ".");
160280297Sjkim    fflush(stdout);
161160814Ssimon
162280297Sjkim    EVP_Digest("abcdefgh" "bcdefghi" "cdefghij" "defghijk"
163280297Sjkim               "efghijkl" "fghijklm" "ghijklmn" "hijklmno"
164280297Sjkim               "ijklmnop" "jklmnopq" "klmnopqr" "lmnopqrs"
165280297Sjkim               "mnopqrst" "nopqrstu", 112, md, NULL, EVP_sha384(), NULL);
166280297Sjkim    if (memcmp(md, app_d2, sizeof(app_d2))) {
167280297Sjkim        fflush(stdout);
168280297Sjkim        fprintf(stderr, "\nTEST 2 of 3 failed.\n");
169280297Sjkim        return 1;
170280297Sjkim    } else
171280297Sjkim        fprintf(stdout, ".");
172280297Sjkim    fflush(stdout);
173160814Ssimon
174280297Sjkim    EVP_MD_CTX_init(&evp);
175280297Sjkim    EVP_DigestInit_ex(&evp, EVP_sha384(), NULL);
176280297Sjkim    for (i = 0; i < 1000000; i += 64)
177280297Sjkim        EVP_DigestUpdate(&evp, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
178280297Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
179280297Sjkim                         (1000000 - i) < 64 ? 1000000 - i : 64);
180280297Sjkim    EVP_DigestFinal_ex(&evp, md, NULL);
181280297Sjkim    EVP_MD_CTX_cleanup(&evp);
182160814Ssimon
183280297Sjkim    if (memcmp(md, app_d3, sizeof(app_d3))) {
184280297Sjkim        fflush(stdout);
185280297Sjkim        fprintf(stderr, "\nTEST 3 of 3 failed.\n");
186280297Sjkim        return 1;
187280297Sjkim    } else
188280297Sjkim        fprintf(stdout, ".");
189280297Sjkim    fflush(stdout);
190160814Ssimon
191280297Sjkim    fprintf(stdout, " passed.\n");
192280297Sjkim    fflush(stdout);
193160814Ssimon
194280297Sjkim    return 0;
195160814Ssimon}
196160814Ssimon#endif
197