Blame crypto/fips/fips_cmac_selftest.c

Packit c4476c
/* ====================================================================
Packit c4476c
 * Copyright (c) 2011 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
#include <openssl/fips.h>
Packit c4476c
#include "crypto/fips.h"
Packit c4476c
#include <openssl/cmac.h>
Packit c4476c
#include "fips_locl.h"
Packit c4476c
Packit c4476c
#ifdef OPENSSL_FIPS
Packit c4476c
typedef struct {
Packit c4476c
    int nid;
Packit c4476c
    const unsigned char key[EVP_MAX_KEY_LENGTH];
Packit c4476c
    size_t keysize;
Packit c4476c
    const unsigned char msg[64];
Packit c4476c
    size_t msgsize;
Packit c4476c
    const unsigned char mac[32];
Packit c4476c
    size_t macsize;
Packit c4476c
} CMAC_KAT;
Packit c4476c
Packit c4476c
/* from http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf */
Packit c4476c
static const CMAC_KAT vector[] = {
Packit c4476c
    {NID_aes_128_cbc,           /* Count = 32 from CMACGenAES128.txt */
Packit c4476c
     {0x77, 0xa7, 0x7f, 0xaf, 0x29, 0x0c, 0x1f, 0xa3,
Packit c4476c
      0x0c, 0x68, 0x3d, 0xf1, 0x6b, 0xa7, 0xa7, 0x7b,}, 128,
Packit c4476c
     {0x02, 0x06, 0x83, 0xe1, 0xf0, 0x39, 0x2f, 0x4c,
Packit c4476c
      0xac, 0x54, 0x31, 0x8b, 0x60, 0x29, 0x25, 0x9e,
Packit c4476c
      0x9c, 0x55, 0x3d, 0xbc, 0x4b, 0x6a, 0xd9, 0x98,
Packit c4476c
      0xe6, 0x4d, 0x58, 0xe4, 0xe7, 0xdc, 0x2e, 0x13,}, 256,
Packit c4476c
     {0xfb, 0xfe, 0xa4, 0x1b,}, 32},
Packit c4476c
    {NID_aes_192_cbc,           /* Count = 23 from CMACGenAES192.txt */
Packit c4476c
     {0x7b, 0x32, 0x39, 0x13, 0x69, 0xaa, 0x4c, 0xa9,
Packit c4476c
      0x75, 0x58, 0x09, 0x5b, 0xe3, 0xc3, 0xec, 0x86,
Packit c4476c
      0x2b, 0xd0, 0x57, 0xce, 0xf1, 0xe3, 0x2d, 0x62,}, 192,
Packit c4476c
     {0x0}, 0,
Packit c4476c
     {0xe4, 0xd9, 0x34, 0x0b, 0x03, 0xe6, 0x7d, 0xef,
Packit c4476c
      0xd4, 0x96, 0x9c, 0xc1, 0xed, 0x37, 0x35, 0xe6,}, 128,
Packit c4476c
     },
Packit c4476c
    {NID_aes_256_cbc,           /* Count = 33 from CMACGenAES256.txt */
Packit c4476c
     {0x0b, 0x12, 0x2a, 0xc8, 0xf3, 0x4e, 0xd1, 0xfe,
Packit c4476c
      0x08, 0x2a, 0x36, 0x25, 0xd1, 0x57, 0x56, 0x14,
Packit c4476c
      0x54, 0x16, 0x7a, 0xc1, 0x45, 0xa1, 0x0b, 0xbf,
Packit c4476c
      0x77, 0xc6, 0xa7, 0x05, 0x96, 0xd5, 0x74, 0xf1,}, 256,
Packit c4476c
     {0x49, 0x8b, 0x53, 0xfd, 0xec, 0x87, 0xed, 0xcb,
Packit c4476c
      0xf0, 0x70, 0x97, 0xdc, 0xcd, 0xe9, 0x3a, 0x08,
Packit c4476c
      0x4b, 0xad, 0x75, 0x01, 0xa2, 0x24, 0xe3, 0x88,
Packit c4476c
      0xdf, 0x34, 0x9c, 0xe1, 0x89, 0x59, 0xfe, 0x84,
Packit c4476c
      0x85, 0xf8, 0xad, 0x15, 0x37, 0xf0, 0xd8, 0x96,
Packit c4476c
      0xea, 0x73, 0xbe, 0xdc, 0x72, 0x14, 0x71, 0x3f,}, 384,
Packit c4476c
     {0xf6, 0x2c, 0x46, 0x32, 0x9b,}, 40,
Packit c4476c
     },
Packit c4476c
    {NID_des_ede3_cbc,          /* Count = 41 from CMACGenTDES3.req */
Packit c4476c
     {0x89, 0xbc, 0xd9, 0x52, 0xa8, 0xc8, 0xab, 0x37,
Packit c4476c
      0x1a, 0xf4, 0x8a, 0xc7, 0xd0, 0x70, 0x85, 0xd5,
Packit c4476c
      0xef, 0xf7, 0x02, 0xe6, 0xd6, 0x2c, 0xdc, 0x23,}, 192,
Packit c4476c
     {0xfa, 0x62, 0x0c, 0x1b, 0xbe, 0x97, 0x31, 0x9e,
Packit c4476c
      0x9a, 0x0c, 0xf0, 0x49, 0x21, 0x21, 0xf7, 0xa2,
Packit c4476c
      0x0e, 0xb0, 0x8a, 0x6a, 0x70, 0x9d, 0xcb, 0xd0,
Packit c4476c
      0x0a, 0xaf, 0x38, 0xe4, 0xf9, 0x9e, 0x75, 0x4e,}, 256,
Packit c4476c
     {0x8f, 0x49, 0xa1, 0xb7, 0xd6, 0xaa, 0x22, 0x58,}, 64,
Packit c4476c
     },
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_cmac()
Packit c4476c
{
Packit c4476c
    size_t n, outlen;
Packit c4476c
    unsigned char out[32];
Packit c4476c
    const EVP_CIPHER *cipher;
Packit c4476c
    CMAC_CTX *ctx = CMAC_CTX_new();
Packit c4476c
    const CMAC_KAT *t;
Packit c4476c
    int rv = 1;
Packit c4476c
Packit c4476c
    for (n = 0, t = vector; n < sizeof(vector) / sizeof(vector[0]); n++, t++) {
Packit c4476c
        cipher = EVP_get_cipherbynid(t->nid);
Packit c4476c
        if (!cipher) {
Packit c4476c
            rv = -1;
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
        if (!CMAC_Init(ctx, t->key, t->keysize / 8, cipher, 0)) {
Packit c4476c
            rv = -1;
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
        if (!CMAC_Update(ctx, t->msg, t->msgsize / 8)) {
Packit c4476c
            rv = -1;
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
Packit c4476c
        if (!CMAC_Final(ctx, out, &outlen)) {
Packit c4476c
            rv = -1;
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
Packit c4476c
        if (outlen < t->macsize / 8 || memcmp(out, t->mac, t->macsize / 8)) {
Packit c4476c
            rv = 0;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
Packit c4476c
 err:
Packit c4476c
    CMAC_CTX_free(ctx);
Packit c4476c
Packit c4476c
    if (rv == -1) {
Packit c4476c
        rv = 0;
Packit c4476c
    }
Packit c4476c
    if (!rv)
Packit c4476c
        FIPSerr(FIPS_F_FIPS_SELFTEST_CMAC, FIPS_R_SELFTEST_FAILED);
Packit c4476c
Packit c4476c
    return rv;
Packit c4476c
}
Packit c4476c
#endif