Blame crypto/fips/fips_dh_selftest.c

Packit c4476c
/* ====================================================================
Packit c4476c
 * Copyright (c) 2011 The OpenSSL Project.  All rights reserved.
Packit c4476c
 * Copyright (c) 2013 Red Hat, Inc.
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/crypto.h>
Packit c4476c
#include <openssl/dh.h>
Packit c4476c
#include <openssl/fips.h>
Packit c4476c
#include <openssl/err.h>
Packit c4476c
#include <openssl/evp.h>
Packit c4476c
#include <openssl/bn.h>
Packit c4476c
#include "fips_locl.h"
Packit c4476c
Packit c4476c
#ifdef OPENSSL_FIPS
Packit c4476c
Packit c4476c
static const unsigned char dh_test_2048_p[] = {
Packit c4476c
    0xAE, 0xEC, 0xEE, 0x22, 0xFA, 0x3A, 0xA5, 0x22, 0xC0, 0xDE, 0x0F, 0x09,
Packit c4476c
    0x7E, 0x17, 0xC0, 0x05, 0xF9, 0xF1, 0xE7, 0xC6, 0x87, 0x14, 0x6D, 0x11,
Packit c4476c
    0xE7, 0xAE, 0xED, 0x2F, 0x72, 0x59, 0xC5, 0xA9, 0x9B, 0xB8, 0x02, 0xA5,
Packit c4476c
    0xF3, 0x69, 0x70, 0xD6, 0xDD, 0x90, 0xF9, 0x19, 0x79, 0xBE, 0x60, 0x8F,
Packit c4476c
    0x25, 0x92, 0x30, 0x1C, 0x51, 0x51, 0x38, 0x26, 0x82, 0x25, 0xE6, 0xFC,
Packit c4476c
    0xED, 0x65, 0x96, 0x8F, 0x57, 0xE5, 0x53, 0x8B, 0x38, 0x63, 0xC7, 0xCE,
Packit c4476c
    0xBC, 0x1B, 0x4D, 0x18, 0x2A, 0x5B, 0x04, 0x3F, 0x6A, 0x3C, 0x94, 0x39,
Packit c4476c
    0xAE, 0x36, 0xD6, 0x5E, 0x0F, 0xA2, 0xCC, 0xD0, 0xD4, 0xD5, 0xC6, 0x1E,
Packit c4476c
    0xF6, 0xA0, 0xF5, 0x89, 0x4E, 0xB4, 0x0B, 0xA4, 0xB3, 0x2B, 0x3D, 0xE2,
Packit c4476c
    0x4E, 0xE1, 0x49, 0x25, 0x99, 0x5F, 0x32, 0x16, 0x33, 0x32, 0x1B, 0x7A,
Packit c4476c
    0xA5, 0x5C, 0x6B, 0x34, 0x0D, 0x39, 0x99, 0xDC, 0xF0, 0x76, 0xE5, 0x5A,
Packit c4476c
    0xD4, 0x71, 0x00, 0xED, 0x5A, 0x73, 0xFB, 0xC8, 0x01, 0xAD, 0x99, 0xCF,
Packit c4476c
    0x99, 0x52, 0x7C, 0x9C, 0x64, 0xC6, 0x76, 0x40, 0x57, 0xAF, 0x59, 0xD7,
Packit c4476c
    0x38, 0x0B, 0x40, 0xDE, 0x33, 0x0D, 0xB8, 0x76, 0xEC, 0xA9, 0xD8, 0x73,
Packit c4476c
    0xF8, 0xEF, 0x26, 0x66, 0x06, 0x27, 0xDD, 0x7C, 0xA4, 0x10, 0x9C, 0xA6,
Packit c4476c
    0xAA, 0xF9, 0x53, 0x62, 0x73, 0x1D, 0xBA, 0x1C, 0xF1, 0x67, 0xF4, 0x35,
Packit c4476c
    0xED, 0x6F, 0x37, 0x92, 0xE8, 0x4F, 0x6C, 0xBA, 0x52, 0x6E, 0xA1, 0xED,
Packit c4476c
    0xDA, 0x9F, 0x85, 0x11, 0x82, 0x52, 0x62, 0x08, 0x44, 0xF1, 0x30, 0x03,
Packit c4476c
    0xC3, 0x38, 0x2C, 0x79, 0xBD, 0xD4, 0x43, 0x45, 0xEE, 0x8E, 0x50, 0xFC,
Packit c4476c
    0x29, 0x46, 0x9A, 0xFE, 0x54, 0x1A, 0x19, 0x8F, 0x4B, 0x84, 0x08, 0xDE,
Packit c4476c
    0x20, 0x62, 0x73, 0xCC, 0xDD, 0x7E, 0xF0, 0xEF, 0xA2, 0xFD, 0x86, 0x58,
Packit c4476c
    0x4B, 0xD8, 0x37, 0xEB
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dh_test_2048_g[] = {
Packit c4476c
    0x02
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dh_test_2048_pub_key[] = {
Packit c4476c
    0xA0, 0x39, 0x11, 0x77, 0x9A, 0xC1, 0x30, 0x1F, 0xBE, 0x48, 0xA7, 0xAA,
Packit c4476c
    0xA0, 0x84, 0x54, 0x64, 0xAD, 0x1B, 0x70, 0xFA, 0x13, 0x55, 0x63, 0xD2,
Packit c4476c
    0x1F, 0x62, 0x32, 0x93, 0x8E, 0xC9, 0x3E, 0x09, 0xA7, 0x64, 0xE4, 0x12,
Packit c4476c
    0x6E, 0x1B, 0xF2, 0x92, 0x3B, 0xB9, 0xCB, 0x56, 0xEA, 0x07, 0x88, 0xB5,
Packit c4476c
    0xA6, 0xBC, 0x16, 0x1F, 0x27, 0xFE, 0xD8, 0xAA, 0x40, 0xB2, 0xB0, 0x2D,
Packit c4476c
    0x37, 0x76, 0xA6, 0xA4, 0x82, 0x2C, 0x0E, 0x22, 0x64, 0x9D, 0xCB, 0xD1,
Packit c4476c
    0x00, 0xB7, 0x89, 0x14, 0x72, 0x4E, 0xBE, 0x48, 0x41, 0xF8, 0xB2, 0x51,
Packit c4476c
    0x11, 0x09, 0x4B, 0x22, 0x01, 0x23, 0x39, 0x96, 0xE0, 0x15, 0xD7, 0x9F,
Packit c4476c
    0x60, 0xD1, 0xB7, 0xAE, 0xFE, 0x5F, 0xDB, 0xE7, 0x03, 0x17, 0x97, 0xA6,
Packit c4476c
    0x16, 0x74, 0xBD, 0x53, 0x81, 0x19, 0xC5, 0x47, 0x5E, 0xCE, 0x8D, 0xED,
Packit c4476c
    0x45, 0x5D, 0x3C, 0x00, 0xA0, 0x0A, 0x68, 0x6A, 0xE0, 0x8E, 0x06, 0x46,
Packit c4476c
    0x6F, 0xD7, 0xF9, 0xDF, 0x31, 0x7E, 0x77, 0x44, 0x0D, 0x98, 0xE0, 0xCA,
Packit c4476c
    0x98, 0x09, 0x52, 0x04, 0x90, 0xEA, 0x6D, 0xF4, 0x30, 0x69, 0x8F, 0xB1,
Packit c4476c
    0x9B, 0xC1, 0x43, 0xDB, 0xD5, 0x8D, 0xC8, 0x8E, 0xB6, 0x0B, 0x05, 0xBE,
Packit c4476c
    0x0E, 0xC5, 0x99, 0xC8, 0x6E, 0x4E, 0xF3, 0xCB, 0xC3, 0x5E, 0x9B, 0x53,
Packit c4476c
    0xF7, 0x06, 0x1C, 0x4F, 0xC7, 0xB8, 0x6E, 0x30, 0x18, 0xCA, 0x9B, 0xB9,
Packit c4476c
    0xBC, 0x5F, 0x17, 0x72, 0x29, 0x5A, 0xE5, 0xD9, 0x96, 0xB7, 0x0B, 0xF3,
Packit c4476c
    0x2D, 0x8C, 0xF1, 0xE1, 0x0E, 0x0D, 0x74, 0xD5, 0x9D, 0xF0, 0x06, 0xA9,
Packit c4476c
    0xB4, 0x95, 0x63, 0x76, 0x46, 0x55, 0x48, 0x82, 0x39, 0x90, 0xEF, 0x56,
Packit c4476c
    0x75, 0x34, 0xB8, 0x34, 0xC3, 0x18, 0x6E, 0x1E, 0xAD, 0xE3, 0x48, 0x7E,
Packit c4476c
    0x93, 0x2C, 0x23, 0xE7, 0xF8, 0x90, 0x73, 0xB1, 0x77, 0x80, 0x67, 0xA9,
Packit c4476c
    0x36, 0x9E, 0xDA, 0xD2
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char dh_test_2048_priv_key[] = {
Packit c4476c
    0x0C, 0x4B, 0x30, 0x89, 0xD1, 0xB8, 0x62, 0xCB, 0x3C, 0x43, 0x64, 0x91,
Packit c4476c
    0xF0, 0x91, 0x54, 0x70, 0xC5, 0x27, 0x96, 0xE3, 0xAC, 0xBE, 0xE8, 0x00,
Packit c4476c
    0xEC, 0x55, 0xF6, 0xCC
Packit c4476c
};
Packit c4476c
Packit c4476c
int FIPS_selftest_dh()
Packit c4476c
{
Packit c4476c
    DH *dh = NULL;
Packit c4476c
    int ret = 0;
Packit c4476c
    void *pub_key_bin = NULL;
Packit c4476c
    int len;
Packit c4476c
    BIGNUM *p = NULL, *g = NULL, *priv_key = NULL, *tmp_pub_key = NULL;
Packit c4476c
    const BIGNUM *pub_key;
Packit c4476c
Packit c4476c
    fips_load_key_component(p, dh_test_2048);
Packit c4476c
    fips_load_key_component(g, dh_test_2048);
Packit c4476c
    /* note that the private key is much shorter than normally used
Packit c4476c
     * but still g ** priv_key > p
Packit c4476c
     */
Packit c4476c
    fips_load_key_component(priv_key, dh_test_2048);
Packit c4476c
    if ((tmp_pub_key = BN_new()) == NULL)
Packit c4476c
        goto err;
Packit c4476c
Packit c4476c
    dh = DH_new();
Packit c4476c
Packit c4476c
    if (dh == NULL)
Packit c4476c
        goto err;
Packit c4476c
Packit c4476c
    DH_set0_pqg(dh, p, NULL, g);
Packit c4476c
    DH_set0_key(dh, tmp_pub_key, priv_key);
Packit c4476c
Packit c4476c
    if (DH_generate_key(dh) <= 0)
Packit c4476c
        goto err;
Packit c4476c
Packit c4476c
    DH_get0_key(dh, &pub_key, NULL);
Packit c4476c
Packit c4476c
    if (pub_key == NULL)
Packit c4476c
        goto err;
Packit c4476c
Packit c4476c
    len = BN_num_bytes(pub_key);
Packit c4476c
    if ((pub_key_bin = OPENSSL_malloc(len)) == NULL)
Packit c4476c
        goto err;
Packit c4476c
    BN_bn2bin(pub_key, pub_key_bin);
Packit c4476c
Packit c4476c
    if (len != sizeof(dh_test_2048_pub_key) ||
Packit c4476c
        memcmp(pub_key_bin, dh_test_2048_pub_key, len) != 0)
Packit c4476c
        goto err;
Packit c4476c
Packit c4476c
    ret = 1;
Packit c4476c
Packit c4476c
 err:
Packit c4476c
    if (dh)
Packit c4476c
        DH_free(dh);
Packit c4476c
    else {
Packit c4476c
        BN_free(p);
Packit c4476c
        BN_free(g);
Packit c4476c
        BN_free(priv_key);
Packit c4476c
        BN_free(tmp_pub_key);
Packit c4476c
    }
Packit c4476c
Packit c4476c
    OPENSSL_free(pub_key_bin);
Packit c4476c
    return ret;
Packit c4476c
}
Packit c4476c
#endif