Blame crypto/fips/fips_hmac_selftest.c

Packit c4476c
/* ====================================================================
Packit c4476c
 * Copyright (c) 2005 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/hmac.h>
Packit c4476c
Packit c4476c
#ifdef OPENSSL_FIPS
Packit c4476c
typedef struct {
Packit c4476c
    const EVP_MD *(*alg) (void);
Packit c4476c
    const char *key, *iv;
Packit c4476c
    unsigned char kaval[EVP_MAX_MD_SIZE];
Packit c4476c
} HMAC_KAT;
Packit c4476c
Packit c4476c
static const HMAC_KAT vector[] = {
Packit c4476c
    {EVP_sha1,
Packit c4476c
     /* from http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf */
Packit c4476c
     "0123456789:;<=>?@ABC",
Packit c4476c
     "Sample #2",
Packit c4476c
     {0x09, 0x22, 0xd3, 0x40, 0x5f, 0xaa, 0x3d, 0x19,
Packit c4476c
      0x4f, 0x82, 0xa4, 0x58, 0x30, 0x73, 0x7d, 0x5c,
Packit c4476c
      0xc6, 0xc7, 0x5d, 0x24}
Packit c4476c
     },
Packit c4476c
    {EVP_sha224,
Packit c4476c
     /* just keep extending the above... */
Packit c4476c
     "0123456789:;<=>?@ABC",
Packit c4476c
     "Sample #2",
Packit c4476c
     {0xdd, 0xef, 0x0a, 0x40, 0xcb, 0x7d, 0x50, 0xfb,
Packit c4476c
      0x6e, 0xe6, 0xce, 0xa1, 0x20, 0xba, 0x26, 0xaa,
Packit c4476c
      0x08, 0xf3, 0x07, 0x75, 0x87, 0xb8, 0xad, 0x1b,
Packit c4476c
      0x8c, 0x8d, 0x12, 0xc7}
Packit c4476c
     },
Packit c4476c
    {EVP_sha256,
Packit c4476c
     "0123456789:;<=>?@ABC",
Packit c4476c
     "Sample #2",
Packit c4476c
     {0xb8, 0xf2, 0x0d, 0xb5, 0x41, 0xea, 0x43, 0x09,
Packit c4476c
      0xca, 0x4e, 0xa9, 0x38, 0x0c, 0xd0, 0xe8, 0x34,
Packit c4476c
      0xf7, 0x1f, 0xbe, 0x91, 0x74, 0xa2, 0x61, 0x38,
Packit c4476c
      0x0d, 0xc1, 0x7e, 0xae, 0x6a, 0x34, 0x51, 0xd9}
Packit c4476c
     },
Packit c4476c
    {EVP_sha384,
Packit c4476c
     "0123456789:;<=>?@ABC",
Packit c4476c
     "Sample #2",
Packit c4476c
     {0x08, 0xbc, 0xb0, 0xda, 0x49, 0x1e, 0x87, 0xad,
Packit c4476c
      0x9a, 0x1d, 0x6a, 0xce, 0x23, 0xc5, 0x0b, 0xf6,
Packit c4476c
      0xb7, 0x18, 0x06, 0xa5, 0x77, 0xcd, 0x49, 0x04,
Packit c4476c
      0x89, 0xf1, 0xe6, 0x23, 0x44, 0x51, 0x51, 0x9f,
Packit c4476c
      0x85, 0x56, 0x80, 0x79, 0x0c, 0xbd, 0x4d, 0x50,
Packit c4476c
      0xa4, 0x5f, 0x29, 0xe3, 0x93, 0xf0, 0xe8, 0x7f}
Packit c4476c
     },
Packit c4476c
    {EVP_sha512,
Packit c4476c
     "0123456789:;<=>?@ABC",
Packit c4476c
     "Sample #2",
Packit c4476c
     {0x80, 0x9d, 0x44, 0x05, 0x7c, 0x5b, 0x95, 0x41,
Packit c4476c
      0x05, 0xbd, 0x04, 0x13, 0x16, 0xdb, 0x0f, 0xac,
Packit c4476c
      0x44, 0xd5, 0xa4, 0xd5, 0xd0, 0x89, 0x2b, 0xd0,
Packit c4476c
      0x4e, 0x86, 0x64, 0x12, 0xc0, 0x90, 0x77, 0x68,
Packit c4476c
      0xf1, 0x87, 0xb7, 0x7c, 0x4f, 0xae, 0x2c, 0x2f,
Packit c4476c
      0x21, 0xa5, 0xb5, 0x65, 0x9a, 0x4f, 0x4b, 0xa7,
Packit c4476c
      0x47, 0x02, 0xa3, 0xde, 0x9b, 0x51, 0xf1, 0x45,
Packit c4476c
      0xbd, 0x4f, 0x25, 0x27, 0x42, 0x98, 0x99, 0x05}
Packit c4476c
     },
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_hmac()
Packit c4476c
{
Packit c4476c
    int n;
Packit c4476c
    unsigned int outlen;
Packit c4476c
    unsigned char out[EVP_MAX_MD_SIZE];
Packit c4476c
    const EVP_MD *md;
Packit c4476c
    const HMAC_KAT *t;
Packit c4476c
Packit c4476c
    for (n = 0, t = vector; n < sizeof(vector) / sizeof(vector[0]); n++, t++) {
Packit c4476c
        md = (*t->alg) ();
Packit c4476c
        HMAC(md, t->key, strlen(t->key),
Packit c4476c
             (const unsigned char *)t->iv, strlen(t->iv), out, &outlen);
Packit c4476c
Packit c4476c
        if (memcmp(out, t->kaval, outlen)) {
Packit c4476c
            FIPSerr(FIPS_F_FIPS_SELFTEST_HMAC, FIPS_R_SELFTEST_FAILED);
Packit c4476c
            return 0;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    return 1;
Packit c4476c
}
Packit c4476c
#endif