Blame crypto/fips/fips_sha_selftest.c

Packit c4476c
/* ====================================================================
Packit c4476c
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
Packit c4476c
 *
Packit c4476c
 * Redistribution and use in source and binary forms, with or without
Packit c4476c
 * modification, are permitted provided that the following conditions
Packit c4476c
 * are met:
Packit c4476c
 *
Packit c4476c
 * 1. Redistributions of source code must retain the above copyright
Packit c4476c
 *    notice, this list of conditions and the following disclaimer. 
Packit c4476c
 *
Packit c4476c
 * 2. Redistributions in binary form must reproduce the above copyright
Packit c4476c
 *    notice, this list of conditions and the following disclaimer in
Packit c4476c
 *    the documentation and/or other materials provided with the
Packit c4476c
 *    distribution.
Packit c4476c
 *
Packit c4476c
 * 3. All advertising materials mentioning features or use of this
Packit c4476c
 *    software must display the following acknowledgment:
Packit c4476c
 *    "This product includes software developed by the OpenSSL Project
Packit c4476c
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
Packit c4476c
 *
Packit c4476c
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
Packit c4476c
 *    endorse or promote products derived from this software without
Packit c4476c
 *    prior written permission. For written permission, please contact
Packit c4476c
 *    openssl-core@openssl.org.
Packit c4476c
 *
Packit c4476c
 * 5. Products derived from this software may not be called "OpenSSL"
Packit c4476c
 *    nor may "OpenSSL" appear in their names without prior written
Packit c4476c
 *    permission of the OpenSSL Project.
Packit c4476c
 *
Packit c4476c
 * 6. Redistributions of any form whatsoever must retain the following
Packit c4476c
 *    acknowledgment:
Packit c4476c
 *    "This product includes software developed by the OpenSSL Project
Packit c4476c
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
Packit c4476c
 *
Packit c4476c
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
Packit c4476c
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit c4476c
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
Packit c4476c
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
Packit c4476c
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit c4476c
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit c4476c
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Packit c4476c
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit c4476c
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit c4476c
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit c4476c
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
Packit c4476c
 * OF THE POSSIBILITY OF SUCH DAMAGE.
Packit c4476c
 *
Packit c4476c
 */
Packit c4476c
Packit c4476c
#include <string.h>
Packit c4476c
#include <openssl/err.h>
Packit c4476c
#ifdef OPENSSL_FIPS
Packit c4476c
# include <openssl/fips.h>
Packit c4476c
#endif
Packit c4476c
#include <openssl/evp.h>
Packit c4476c
#include <openssl/sha.h>
Packit c4476c
Packit c4476c
#ifdef OPENSSL_FIPS
Packit c4476c
static const char test[][60] = {
Packit c4476c
    "",
Packit c4476c
    "abc",
Packit c4476c
    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char ret[][SHA_DIGEST_LENGTH] = {
Packit c4476c
    {0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
Packit c4476c
     0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09},
Packit c4476c
    {0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
Packit c4476c
     0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d},
Packit c4476c
    {0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
Packit c4476c
     0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1},
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_sha1()
Packit c4476c
{
Packit c4476c
    int n;
Packit c4476c
Packit c4476c
    for (n = 0; n < sizeof(test) / sizeof(test[0]); ++n) {
Packit c4476c
        unsigned char md[SHA_DIGEST_LENGTH];
Packit c4476c
Packit c4476c
        EVP_Digest(test[n], strlen(test[n]), md, NULL,
Packit c4476c
                   EVP_sha1(), NULL);
Packit c4476c
        if (memcmp(md, ret[n], sizeof md)) {
Packit c4476c
            FIPSerr(FIPS_F_FIPS_SELFTEST_SHA1, FIPS_R_SELFTEST_FAILED);
Packit c4476c
            return 0;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    return 1;
Packit c4476c
}
Packit c4476c
Packit c4476c
static const unsigned char msg_sha256[] =
Packit c4476c
    { 0xfa, 0x48, 0x59, 0x2a, 0xe1, 0xae, 0x1f, 0x30,
Packit c4476c
    0xfc
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_sha256[] =
Packit c4476c
    { 0xf7, 0x26, 0xd8, 0x98, 0x47, 0x91, 0x68, 0x5b,
Packit c4476c
    0x9e, 0x39, 0xb2, 0x58, 0xbb, 0x75, 0xbf, 0x01,
Packit c4476c
    0x17, 0x0c, 0x84, 0x00, 0x01, 0x7a, 0x94, 0x83,
Packit c4476c
    0xf3, 0x0b, 0x15, 0x84, 0x4b, 0x69, 0x88, 0x8a
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char msg_sha512[] =
Packit c4476c
    { 0x37, 0xd1, 0x35, 0x9d, 0x18, 0x41, 0xe9, 0xb7,
Packit c4476c
    0x6d, 0x9a, 0x13, 0xda, 0x5f, 0xf3, 0xbd
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_sha512[] =
Packit c4476c
    { 0x11, 0x13, 0xc4, 0x19, 0xed, 0x2b, 0x1d, 0x16,
Packit c4476c
    0x11, 0xeb, 0x9b, 0xbe, 0xf0, 0x7f, 0xcf, 0x44,
Packit c4476c
    0x8b, 0xd7, 0x57, 0xbd, 0x8d, 0xa9, 0x25, 0xb0,
Packit c4476c
    0x47, 0x25, 0xd6, 0x6c, 0x9a, 0x54, 0x7f, 0x8f,
Packit c4476c
    0x0b, 0x53, 0x1a, 0x10, 0x68, 0x32, 0x03, 0x38,
Packit c4476c
    0x82, 0xc4, 0x87, 0xc4, 0xea, 0x0e, 0xd1, 0x04,
Packit c4476c
    0xa9, 0x98, 0xc1, 0x05, 0xa3, 0xf3, 0xf8, 0xb1,
Packit c4476c
    0xaf, 0xbc, 0xd9, 0x78, 0x7e, 0xee, 0x3d, 0x43
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_sha2(void)
Packit c4476c
{
Packit c4476c
    unsigned char md[SHA512_DIGEST_LENGTH];
Packit c4476c
Packit c4476c
    EVP_Digest(msg_sha256, sizeof(msg_sha256), md, NULL, EVP_sha256(), NULL);
Packit c4476c
    if (memcmp(dig_sha256, md, sizeof(dig_sha256))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST_SHA2, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    EVP_Digest(msg_sha512, sizeof(msg_sha512), md, NULL, EVP_sha512(), NULL);
Packit c4476c
    if (memcmp(dig_sha512, md, sizeof(dig_sha512))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST_SHA2, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    return 1;
Packit c4476c
}
Packit c4476c
Packit c4476c
static const unsigned char msg_sha3_256[] = {
Packit c4476c
    0xa1, 0xd7, 0xce, 0x51, 0x04, 0xeb, 0x25, 0xd6,
Packit c4476c
    0x13, 0x1b, 0xb8, 0xf6, 0x6e, 0x1f, 0xb1, 0x3f,
Packit c4476c
    0x35, 0x23
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_sha3_256[] = {
Packit c4476c
    0xee, 0x90, 0x62, 0xf3, 0x97, 0x20, 0xb8, 0x21,
Packit c4476c
    0xb8, 0x8b, 0xe5, 0xe6, 0x46, 0x21, 0xd7, 0xe0,
Packit c4476c
    0xca, 0x02, 0x6a, 0x9f, 0xe7, 0x24, 0x8d, 0x78,
Packit c4476c
    0x15, 0x0b, 0x14, 0xbd, 0xba, 0xa4, 0x0b, 0xed
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char msg_sha3_512[] = {
Packit c4476c
    0x13, 0x3b, 0x49, 0x7b, 0x00, 0x93, 0x27, 0x73,
Packit c4476c
    0xa5, 0x3b, 0xa9, 0xbf, 0x8e, 0x61, 0xd5, 0x9f,
Packit c4476c
    0x05, 0xf4
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_sha3_512[] = {
Packit c4476c
    0x78, 0x39, 0x64, 0xa1, 0xcf, 0x41, 0xd6, 0xd2,
Packit c4476c
    0x10, 0xa8, 0xd7, 0xc8, 0x1c, 0xe6, 0x97, 0x0a,
Packit c4476c
    0xa6, 0x2c, 0x90, 0x53, 0xcb, 0x89, 0xe1, 0x5f,
Packit c4476c
    0x88, 0x05, 0x39, 0x57, 0xec, 0xf6, 0x07, 0xf4,
Packit c4476c
    0x2a, 0xf0, 0x88, 0x04, 0xe7, 0x6f, 0x2f, 0xbd,
Packit c4476c
    0xbb, 0x31, 0x80, 0x9c, 0x9e, 0xef, 0xc6, 0x0e,
Packit c4476c
    0x23, 0x3d, 0x66, 0x24, 0x36, 0x7a, 0x3b, 0x9c,
Packit c4476c
    0x30, 0xf8, 0xee, 0x5f, 0x65, 0xbe, 0x56, 0xac
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char msg_shake_128[] = {
Packit c4476c
    0x43, 0xbd, 0xb1, 0x1e, 0xac, 0x71, 0x03, 0x1f,
Packit c4476c
    0x02, 0xa1, 0x1c, 0x15, 0xa1, 0x88, 0x5f, 0xa4,
Packit c4476c
    0x28, 0x98
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_shake_128[] = {
Packit c4476c
    0xde, 0x68, 0x02, 0x7d, 0xa1, 0x30, 0x66, 0x3a,
Packit c4476c
    0x73, 0x98, 0x0e, 0x35, 0x25, 0xb8, 0x8c, 0x75
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char msg_shake_256[] = {
Packit c4476c
    0x8f, 0x84, 0xa3, 0x7d, 0xbd, 0x44, 0xd0, 0xf6,
Packit c4476c
    0x95, 0x36, 0xc5, 0xf4, 0x44, 0x6b, 0xa3, 0x23,
Packit c4476c
    0x9b, 0xfc
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dig_shake_256[] = {
Packit c4476c
    0x05, 0xca, 0x83, 0x5e, 0x0c, 0xdb, 0xfa, 0xf5,
Packit c4476c
    0x95, 0xc6, 0x86, 0x7e, 0x2d, 0x9d, 0xb9, 0x3f,
Packit c4476c
    0xca, 0x9c, 0x8b, 0xc6, 0x65, 0x02, 0x2e, 0xdd,
Packit c4476c
    0x6f, 0xe7, 0xb3, 0xda, 0x5e, 0x07, 0xc4, 0xcf
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_sha3(void)
Packit c4476c
{
Packit c4476c
    unsigned char md[SHA512_DIGEST_LENGTH];
Packit c4476c
Packit c4476c
    EVP_Digest(msg_sha3_256, sizeof(msg_sha3_256), md, NULL, EVP_sha3_256(), NULL);
Packit c4476c
    if (memcmp(dig_sha3_256, md, sizeof(dig_sha3_256))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    EVP_Digest(msg_sha3_512, sizeof(msg_sha3_512), md, NULL, EVP_sha3_512(), NULL);
Packit c4476c
    if (memcmp(dig_sha3_512, md, sizeof(dig_sha3_512))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    EVP_Digest(msg_shake_128, sizeof(msg_shake_128), md, NULL, EVP_shake128(), NULL);
Packit c4476c
    if (memcmp(dig_shake_128, md, sizeof(dig_shake_128))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    EVP_Digest(msg_shake_256, sizeof(msg_shake_256), md, NULL, EVP_shake256(), NULL);
Packit c4476c
    if (memcmp(dig_shake_256, md, sizeof(dig_shake_256))) {
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST, FIPS_R_SELFTEST_FAILED);
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    return 1;
Packit c4476c
}
Packit c4476c
Packit c4476c
#endif