|
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 |
# include "crypto/fips.h"
|
|
Packit |
c4476c |
#endif
|
|
Packit |
c4476c |
#include <openssl/opensslconf.h>
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
#ifdef OPENSSL_FIPS
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
static const struct {
|
|
Packit |
c4476c |
const unsigned char key[16];
|
|
Packit |
c4476c |
const unsigned char plaintext[8];
|
|
Packit |
c4476c |
const unsigned char ciphertext[8];
|
|
Packit |
c4476c |
} tests2[] = {
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
0x7c, 0x4f, 0x6e, 0xf7, 0xa2, 0x04, 0x16, 0xec,
|
|
Packit |
c4476c |
0x0b, 0x6b, 0x7c, 0x9e, 0x5e, 0x19, 0xa7, 0xc4}, {
|
|
Packit |
c4476c |
0x06, 0xa7, 0xd8, 0x79, 0xaa, 0xce, 0x69, 0xef}, {
|
|
Packit |
c4476c |
0x4c, 0x11, 0x17, 0x55, 0xbf, 0xc4, 0x4e, 0xfd}
|
|
Packit |
c4476c |
}, {
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
0x5d, 0x9e, 0x01, 0xd3, 0x25, 0xc7, 0x3e, 0x34,
|
|
Packit |
c4476c |
0x01, 0x16, 0x7c, 0x85, 0x23, 0xdf, 0xe0, 0x68}, {
|
|
Packit |
c4476c |
0x9c, 0x50, 0x09, 0x0f, 0x5e, 0x7d, 0x69, 0x7e}, {
|
|
Packit |
c4476c |
0xd2, 0x0b, 0x18, 0xdf, 0xd9, 0x0d, 0x9e, 0xff},}
|
|
Packit |
c4476c |
};
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
static const struct {
|
|
Packit |
c4476c |
const unsigned char key[24];
|
|
Packit |
c4476c |
const unsigned char plaintext[8];
|
|
Packit |
c4476c |
const unsigned char ciphertext[8];
|
|
Packit |
c4476c |
} tests3[] = {
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
Packit |
c4476c |
0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
|
|
Packit |
c4476c |
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0}, {
|
|
Packit |
c4476c |
0x8f, 0x8f, 0xbf, 0x9b, 0x5d, 0x48, 0xb4, 0x1c}, {
|
|
Packit |
c4476c |
0x59, 0x8c, 0xe5, 0xd3, 0x6c, 0xa2, 0xea, 0x1b},}, {
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE,
|
|
Packit |
c4476c |
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
|
|
Packit |
c4476c |
0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4}, {
|
|
Packit |
c4476c |
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, {
|
|
Packit |
c4476c |
0x11, 0x25, 0xb0, 0x35, 0xbe, 0xa0, 0x82, 0x86},},};
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
int FIPS_selftest_des()
|
|
Packit |
c4476c |
{
|
|
Packit |
c4476c |
int n, ret = 0;
|
|
Packit |
c4476c |
EVP_CIPHER_CTX *ctx;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
ctx = EVP_CIPHER_CTX_new();
|
|
Packit |
c4476c |
if (ctx == NULL)
|
|
Packit |
c4476c |
goto err;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
/* Encrypt/decrypt with 2-key 3DES and compare to known answers */
|
|
Packit |
c4476c |
for (n = 0; n < 2; ++n) {
|
|
Packit |
c4476c |
unsigned char plaintext[8];
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
memcpy(plaintext, tests2[n].plaintext, sizeof(plaintext));
|
|
Packit |
c4476c |
if (!fips_cipher_test(ctx, EVP_des_ede_ecb(),
|
|
Packit |
c4476c |
tests2[n].key, NULL,
|
|
Packit |
c4476c |
plaintext, tests2[n].ciphertext, 8))
|
|
Packit |
c4476c |
goto err;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
/* Encrypt/decrypt with 3DES and compare to known answers */
|
|
Packit |
c4476c |
for (n = 0; n < 2; ++n) {
|
|
Packit |
c4476c |
if (!fips_cipher_test(ctx, EVP_des_ede3_ecb(),
|
|
Packit |
c4476c |
tests3[n].key, NULL,
|
|
Packit |
c4476c |
tests3[n].plaintext, tests3[n].ciphertext, 8))
|
|
Packit |
c4476c |
goto err;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
ret = 1;
|
|
Packit |
c4476c |
err:
|
|
Packit |
c4476c |
EVP_CIPHER_CTX_free(ctx);
|
|
Packit |
c4476c |
if (ret == 0)
|
|
Packit |
c4476c |
FIPSerr(FIPS_F_FIPS_SELFTEST_DES, FIPS_R_SELFTEST_FAILED);
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
return ret;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
#endif
|