#define OPENSSL_FIPSAPI
+#include <openssl/crypto.h>
#include <openssl/rand.h>
#include <openssl/fips_rand.h>
#include <openssl/err.h>
#include <openssl/hmac.h>
#include <openssl/rsa.h>
#include <openssl/dsa.h>
+#include <openssl/ecdsa.h>
#include <string.h>
#include <limits.h>
#include "fips_locl.h"
static int fips_selftest_fail;
static int fips_mode;
+static int fips_started = 0;
static const void *fips_rand_check;
+static int fips_is_owning_thread(void);
+static int fips_set_owning_thread(void);
+static int fips_clear_owning_thread(void);
+static unsigned char *fips_signature_witness(void);
+
+static void fips_w_lock(void) { CRYPTO_w_lock(CRYPTO_LOCK_FIPS); }
+static void fips_w_unlock(void) { CRYPTO_w_unlock(CRYPTO_LOCK_FIPS); }
+static void fips_r_lock(void) { CRYPTO_r_lock(CRYPTO_LOCK_FIPS); }
+static void fips_r_unlock(void) { CRYPTO_r_unlock(CRYPTO_LOCK_FIPS); }
+
static void fips_set_mode(int onoff)
{
int owning_thread = fips_is_owning_thread();
- if (fips_is_started())
+ if (fips_started)
{
if (!owning_thread) fips_w_lock();
fips_mode = onoff;
{
int owning_thread = fips_is_owning_thread();
- if (fips_is_started())
+ if (fips_started)
{
if (!owning_thread) fips_w_lock();
fips_rand_check = rand_check;
int ret = 0;
int owning_thread = fips_is_owning_thread();
- if (fips_is_started())
+ if (fips_started)
{
if (!owning_thread) fips_r_lock();
ret = fips_mode;
const void *ret = 0;
int owning_thread = fips_is_owning_thread();
- if (fips_is_started())
+ if (fips_started)
{
if (!owning_thread) fips_r_lock();
ret = fips_rand_check;
int FIPS_selftest_failed(void)
{
int ret = 0;
- if (fips_is_started())
+ if (fips_started)
{
int owning_thread = fips_is_owning_thread();
return FIPS_selftest_sha1()
&& FIPS_selftest_hmac()
+ && FIPS_selftest_cmac()
&& FIPS_selftest_aes()
+ && FIPS_selftest_aes_gcm()
&& FIPS_selftest_des()
&& FIPS_selftest_rsa()
+ && FIPS_selftest_ecdsa()
&& FIPS_selftest_dsa();
}
int ret = 0;
fips_w_lock();
- fips_set_started();
+ fips_started = 1;
fips_set_owning_thread();
if(onoff)
{
- unsigned char buf[48];
fips_selftest_fail = 0;
goto end;
}
+ if (!FIPS_selftest_drbg())
+ {
+ fips_selftest_fail = 1;
+ ret = 0;
+ goto end;
+ }
+
/* Perform RNG KAT before seeding */
if (!FIPS_selftest_rng())
{
ret = 0;
goto end;
}
-
+#if 0
/* automagically seed PRNG if not already seeded */
if(!FIPS_rand_status())
{
+ unsigned char buf[48];
if(RAND_bytes(buf,sizeof buf) <= 0)
{
fips_selftest_fail = 1;
/* now switch into FIPS mode */
fips_set_rand_check(FIPS_rand_method());
RAND_set_rand_method(FIPS_rand_method());
+#else
+ fips_set_rand_check(FIPS_drbg_method());
+ RAND_set_rand_method(FIPS_drbg_method());
+#endif
if(FIPS_selftest())
fips_set_mode(1);
else
return ret;
}
-void fips_w_lock(void) { CRYPTO_w_lock(CRYPTO_LOCK_FIPS); }
-void fips_w_unlock(void) { CRYPTO_w_unlock(CRYPTO_LOCK_FIPS); }
-void fips_r_lock(void) { CRYPTO_r_lock(CRYPTO_LOCK_FIPS); }
-void fips_r_unlock(void) { CRYPTO_r_unlock(CRYPTO_LOCK_FIPS); }
-
-static int fips_started = 0;
static CRYPTO_THREADID fips_thread;
static int fips_thread_set = 0;
-void fips_set_started(void)
- {
- fips_started = 1;
- }
-
-int fips_is_started(void)
- {
- return fips_started;
- }
-
-int fips_is_owning_thread(void)
+static int fips_is_owning_thread(void)
{
int ret = 0;
- if (fips_is_started())
+ if (fips_started)
{
CRYPTO_r_lock(CRYPTO_LOCK_FIPS2);
if (fips_thread_set)
{
int ret = 0;
- if (fips_is_started())
+ if (fips_started)
{
CRYPTO_w_lock(CRYPTO_LOCK_FIPS2);
if (!fips_thread_set)
{
int ret = 0;
- if (fips_is_started())
+ if (fips_started)
{
CRYPTO_w_lock(CRYPTO_LOCK_FIPS2);
if (fips_thread_set)
unsigned char sigtmp[256], *sig = sigtmp;
unsigned int siglen;
DSA_SIG *dsig = NULL;
+ ECDSA_SIG *esig = NULL;
EVP_MD_CTX mctx;
- EVP_MD_CTX_init(&mctx);
+ FIPS_md_ctx_init(&mctx);
if ((pkey->type == EVP_PKEY_RSA)
&& ((size_t)RSA_size(pkey->pkey.rsa) > sizeof(sigtmp)))
if (tbslen == -1)
tbslen = strlen((char *)tbs);
- if (!EVP_DigestInit_ex(&mctx, digest, NULL))
+ if (digest == NULL)
+ digest = EVP_sha256();
+
+ if (!FIPS_digestinit(&mctx, digest))
goto error;
- if (!EVP_DigestUpdate(&mctx, tbs, tbslen))
+ if (!FIPS_digestupdate(&mctx, tbs, tbslen))
goto error;
if (pkey->type == EVP_PKEY_RSA)
{
if (!dsig)
goto error;
}
+ else if (pkey->type == EVP_PKEY_EC)
+ {
+ esig = FIPS_ecdsa_sign_ctx(pkey->pkey.ec, &mctx);
+ if (!esig)
+ goto error;
+ }
#if 0
else if (!EVP_SignFinal(&mctx, sig, &siglen, pkey))
goto error;
if (kat && ((siglen != katlen) || memcmp(kat, sig, katlen)))
goto error;
- if (!EVP_DigestInit_ex(&mctx, digest, NULL))
+ if (!FIPS_digestinit(&mctx, digest))
goto error;
- if (!EVP_DigestUpdate(&mctx, tbs, tbslen))
+ if (!FIPS_digestupdate(&mctx, tbs, tbslen))
goto error;
if (pkey->type == EVP_PKEY_RSA)
{
{
ret = FIPS_dsa_verify_ctx(pkey->pkey.dsa, &mctx, dsig);
}
+ else if (pkey->type == EVP_PKEY_EC)
+ {
+ ret = FIPS_ecdsa_verify_ctx(pkey->pkey.ec, &mctx, esig);
+ }
#if 0
else
ret = EVP_VerifyFinal(&mctx, sig, siglen, pkey);
error:
if (dsig != NULL)
- DSA_SIG_free(dsig);
+ FIPS_dsa_sig_free(dsig);
+ if (esig != NULL)
+ FIPS_ecdsa_sig_free(esig);
if (sig != sigtmp)
OPENSSL_free(sig);
- EVP_MD_CTX_cleanup(&mctx);
+ FIPS_md_ctx_cleanup(&mctx);
if (ret != 1)
{
FIPSerr(FIPS_F_FIPS_PKEY_SIGNATURE_TEST,FIPS_R_TEST_FAILURE);
if (fail_str)
- ERR_add_error_data(2, "Type=", fail_str);
+ FIPS_add_error_data(2, "Type=", fail_str);
return 0;
}
return 1;
unsigned char pltmp[FIPS_MAX_CIPHER_TEST_SIZE];
unsigned char citmp[FIPS_MAX_CIPHER_TEST_SIZE];
OPENSSL_assert(len <= FIPS_MAX_CIPHER_TEST_SIZE);
- if (EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, 1) <= 0)
+ if (FIPS_cipherinit(ctx, cipher, key, iv, 1) <= 0)
return 0;
- EVP_Cipher(ctx, citmp, plaintext, len);
+ FIPS_cipher(ctx, citmp, plaintext, len);
if (memcmp(citmp, ciphertext, len))
return 0;
- if (EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, 0) <= 0)
+ if (FIPS_cipherinit(ctx, cipher, key, iv, 0) <= 0)
return 0;
- EVP_Cipher(ctx, pltmp, citmp, len);
+ FIPS_cipher(ctx, pltmp, citmp, len);
if (memcmp(pltmp, plaintext, len))
return 0;
return 1;