Compare commits

..

32 Commits

Author SHA1 Message Date
Dr. Stephen Henson
3b4f1f302d update DRBG to handle new file format 2012-10-19 20:53:35 +00:00
Dr. Stephen Henson
986b927fb3 aix[64]-cc: get MT support right (gcc targets are not affected).
(backport from HEAD)
2012-10-16 22:47:44 +00:00
Dr. Stephen Henson
add13802cf Don't require tag before ciphertext in AESGCM mode 2012-10-16 22:47:00 +00:00
Dr. Stephen Henson
b6c1d4b7f0 e_aes.c: uninitialized variable in aes_ccm_init_key.
PR: 2874
Submitted by: Tomas Mraz
(backport from HEAD)
2012-10-15 11:28:59 +00:00
Dr. Stephen Henson
933c9d00da reset ctx->num for CTR mode for FIPS EVP 2012-10-14 12:38:58 +00:00
Dr. Stephen Henson
aaf8b56fc8 sha1-armv4-large.pl: comply with ABI.
(backport from HEAD)
2012-10-14 12:30:12 +00:00
Dr. Stephen Henson
799602e489 gcm128.c: fix AAD-only case with AAD length not divisible by 16.
PR: 2859
Submitted by: John Foley
(backport from HEAD)
2012-10-14 12:29:25 +00:00
Dr. Stephen Henson
82607b291f optimize make_kn (from HEAD, by Andy) 2012-10-14 12:26:02 +00:00
Dr. Stephen Henson
fd9d2eaf16 CMAC reset fix (from HEAD) 2012-10-14 12:24:24 +00:00
Dr. Stephen Henson
3e1beaf43e Add BSD-ppc85xx support and avoid copying overlapping buffers in fips_dssvs.c 2012-10-14 12:03:34 +00:00
Dr. Stephen Henson
ea11fc17cf Add support for Windows CE and C64+ to FIPS module. (from fips2-stable) 2012-10-04 14:27:39 +00:00
Dr. Stephen Henson
05b751c96b file TI_CGTOOLS.pl was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:39 +0000 2012-10-04 13:27:12 +00:00
Dr. Stephen Henson
9fe1f397aa file fips_standalone_sha1 was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:38 +0000 2012-10-04 13:27:10 +00:00
Dr. Stephen Henson
be739df6c5 file run6x was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:09 +00:00
Dr. Stephen Henson
d26196803e file incore6x was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:08 +00:00
Dr. Stephen Henson
1c540214e0 file hmac_sha1.pl was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:07 +00:00
Dr. Stephen Henson
79f0c30e7e file fipscanister.cmd was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:06 +00:00
Dr. Stephen Henson
3d75000cc3 file fips_standalone_sha1 was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:05 +00:00
Dr. Stephen Henson
b82ac9947e file env was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:04 +00:00
Dr. Stephen Henson
23c7979fcf file do_fips was added on branch OpenSSL-fips-2_0-dev on 2012-10-04 14:27:33 +0000 2012-10-04 13:27:03 +00:00
Dr. Stephen Henson
88e9264dd2 automatically make output directory is using minimal script 2012-06-07 17:14:31 +00:00
Dr. Stephen Henson
83db979256 Version of "incore" for Windows executables. Original by Andy. 2012-05-23 17:07:23 +00:00
Dr. Stephen Henson
4feb7ef394 Add --script-sfprefix option to insert a prefix before the request and
response filenames in output script.
2012-05-23 12:44:48 +00:00
Dr. Stephen Henson
4972d50da0 add comment 2012-05-23 11:47:01 +00:00
Dr. Stephen Henson
35b412322f fix typo 2012-05-23 11:45:21 +00:00
Dr. Stephen Henson
b75ff26d7b Don't install fips_standalone_sha1.exe if it isn't being built 2012-05-23 00:39:01 +00:00
Dr. Stephen Henson
b440c25d36 Changes needed to support WinCE compilation:
Don't try to raise SIGABRT if not defined.
Return from fips_dhvs.c main instead of calling exit.
Workaround for lack of GetSystemFileAsFileTime.
Disable optimisation for part of bn_nist.c to avoid compiler bug.
Remove /WX flag so we don't exist on warnings.
2012-05-22 23:57:22 +00:00
Dr. Stephen Henson
76f4af202e cross compile target support for do_fips script 2012-05-18 15:55:40 +00:00
Dr. Stephen Henson
fcb81a191d don't insert time in response files: it breaks some systems and we shouldn't be doing this anyway 2012-05-18 15:05:33 +00:00
Dr. Stephen Henson
05703abd9f Make Windows FIPS build work more like other builds. Add build_tests
target to build FIPS test utilities and build_algvs target to build the
multicall fips_algvs utility.
2012-05-17 11:09:46 +00:00
Dr. Stephen Henson
455ecb3a06 initial mk1mf cross compilation support 2012-05-16 18:56:33 +00:00
cvs2svn
d8e5830423 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
2_0-dev'.
2012-01-18 15:07:12 +00:00
19 changed files with 2329 additions and 136 deletions

View File

@@ -356,7 +356,6 @@ my %table=(
"linux-ia64-ecc","ecc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"linux-ia64-icc","icc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"linux-x86_64", "gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
"linux-x86_64-cross", "gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DFIPS_REF_POINT_IS_CROSS_COMPILER_AWARE::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
"linux64-s390x", "gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${s390x_asm}:64:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
#### So called "highgprs" target for z/Architecture CPUs
# "Highgprs" is kernel feature first implemented in Linux 2.6.32, see
@@ -398,8 +397,6 @@ my %table=(
"linux-alpha+bwx-gcc","gcc:-O3 -DL_ENDIAN -DTERMIO::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}",
"linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}",
# eCos ARMv4/5
"ecos-armv4", "gcc:-D__ECOS__ -I\$(ECOSCFG)/include -Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Wno-write-strings -mno-thumb-interwork -mcpu=arm926ej-s -g -O2 -fno-exceptions::-D_REENTRANT::-nostartfiles -L\$(ECOSCFG)/lib -Ttarget.ld::".eval{my $asm=$armv4_asm;$asm=~s/armcap.o//;$asm},
# Android: linux-* but without -DTERMIO and pointers to headers and libs.
"android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
@@ -434,7 +431,6 @@ my %table=(
# QNX
"qnx4", "cc:-DL_ENDIAN -DTERMIO::(unknown):::${x86_gcc_des} ${x86_gcc_opts}:",
"QNX6", "gcc:-DTERMIOS::::-lsocket::${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"QNX6-armv4", "gcc:-DTERMIOS -O2 -Wall:::::BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"QNX6-i386", "gcc:-DL_ENDIAN -DTERMIOS -O2 -Wall::::-lsocket:${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
# BeOS
@@ -467,8 +463,8 @@ my %table=(
"aix64-gcc","gcc:-maix64 -O -DB_ENDIAN::-pthread:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-maix64 -shared -Wl,-G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X64",
# Below targets assume AIX 5. Idea is to effectively disregard $OBJECT_MODE
# at build time. $OBJECT_MODE is respected at ./config stage!
"aix-cc", "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
"aix-cc", "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
#
# Cray T90 and similar (SDSC)
@@ -586,7 +582,6 @@ my %table=(
"debug-darwin-ppc-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DB_ENDIAN -g -Wall -O::-D_REENTRANT:MACOSX::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
# iPhoneOS/iOS
"iphoneos-cross","llvm-gcc:-O3 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fomit-frame-pointer -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
"ios64-cross","clang:-O3 -arch arm64 -mios-version-min=7.0.0 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR -RC4_CHUNK DES_INT DES_UNROLL -BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
##### A/UX
"aux3-gcc","gcc:-O2 -DTERMIO::(unknown):AUX:-lbsd:RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:::",

4
TABLE
View File

@@ -862,7 +862,7 @@ $multilib =
$cc = cc
$cflags = -q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst
$unistd =
$thread_cflag = -qthreaded
$thread_cflag = -qthreaded -D_THREAD_SAFE
$sys_id = AIX
$lflags =
$bn_ops = BN_LLONG RC4_CHAR
@@ -961,7 +961,7 @@ $multilib =
$cc = cc
$cflags = -q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst
$unistd =
$thread_cflag = -qthreaded
$thread_cflag = -qthreaded -D_THREAD_SAFE
$sys_id = AIX
$lflags =
$bn_ops = SIXTY_FOUR_BIT_LONG RC4_CHAR

14
config
View File

@@ -134,10 +134,6 @@ case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in
echo "${MACHINE}-dg-dgux"; exit 0
;;
ecos:*)
echo "${MACHINE}-whatever-ecos"; exit 0
;;
HI-UX:*)
echo "${MACHINE}-hi-hiux"; exit 0
;;
@@ -166,10 +162,6 @@ case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in
echo "mips4-sgi-irix64"; exit 0
;;
Linux:[2-9].*:cross:x86_64)
echo "${MACHINE}-cross-linux"; exit 0
;;
Linux:[2-9].*)
echo "${MACHINE}-whatever-linux2"; exit 0
;;
@@ -584,9 +576,6 @@ case "$GUESSOS" in
*-*-iphoneos)
options="$options -arch%20${MACHINE}"
OUT="iphoneos-cross" ;;
arm64-*-ios64)
options="$options -arch%20${MACHINE}"
OUT="ios64-cross" ;;
alpha-*-linux2)
ISA=`awk '/cpu model/{print$4;exit(0);}' /proc/cpuinfo`
case ${ISA:-generic} in
@@ -656,7 +645,6 @@ case "$GUESSOS" in
options="$options -DB_ENDIAN -mschedule=$CPUSCHEDULE -march=$CPUARCH"
OUT="linux-generic32" ;;
armv[45]*-*-ecos) OUT="ecos-armv4" ;;
armv[1-3]*-*-linux2) OUT="linux-generic32" ;;
armv[7-9]*-*-linux2) OUT="linux-armv4"; options="$options -march=armv7-a" ;;
arm*-*-linux2) OUT="linux-armv4" ;;
@@ -691,7 +679,6 @@ case "$GUESSOS" in
fi ;;
*-*-linux1) OUT="linux-aout" ;;
*-*-linux2) OUT="linux-generic32" ;;
*-cross-linux) OUT="linux-x86_64-cross" ;;
sun4[uv]*-*-solaris2)
OUT="solaris-sparcv9-$CC"
ISA64=`(isalist) 2>/dev/null | grep sparcv9`
@@ -861,7 +848,6 @@ case "$GUESSOS" in
j90-cray-unicos) OUT="cray-j90" ;;
nsr-tandem-nsk) OUT="tandem-c89" ;;
beos-*) OUT="$GUESSOS" ;;
armv4-*-qnx6) OUT="QNX6-armv4" ;;
x86pc-*-qnx6) OUT="QNX6-i386" ;;
*-*-qnx6) OUT="QNX6" ;;
x86-*-android|i?86-*-android) OUT="android-x86" ;;

View File

@@ -77,19 +77,17 @@ struct CMAC_CTX_st
/* Make temporary keys K1 and K2 */
static void make_kn(unsigned char *k1, unsigned char *l, int bl)
static void make_kn(unsigned char *k1, const unsigned char *l, int bl)
{
int i;
unsigned char c = l[0], carry = c>>7, cnext;
/* Shift block to left, including carry */
for (i = 0; i < bl; i++)
{
k1[i] = l[i] << 1;
if (i < bl - 1 && l[i + 1] & 0x80)
k1[i] |= 1;
}
for (i = 0; i < bl-1; i++, c = cnext)
k1[i] = (c << 1) | ((cnext=l[i+1]) >> 7);
/* If MSB set fixup with R */
if (l[0] & 0x80)
k1[bl - 1] ^= bl == 16 ? 0x87 : 0x1b;
k1[i] = (c << 1) ^ ((0-carry)&(bl==16?0x87:0x1b));
}
CMAC_CTX *CMAC_CTX_new(void)
@@ -153,6 +151,8 @@ int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
return 0;
if (!M_EVP_EncryptInit_ex(&ctx->cctx, NULL, NULL, NULL, zero_iv))
return 0;
memset(ctx->tbl, 0, M_EVP_CIPHER_CTX_block_size(&ctx->cctx));
ctx->nlast_block = 0;
return 1;
}
/* Initialiase context */

View File

@@ -1195,6 +1195,7 @@ static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
vpaes_set_encrypt_key(key, ctx->key_len*8, &cctx->ks);
CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
&cctx->ks, (block128_f)vpaes_encrypt);
cctx->str = NULL;
cctx->key_set = 1;
break;
}

View File

@@ -1403,7 +1403,7 @@ int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx,const unsigned char *tag,
void (*gcm_gmult_p)(u64 Xi[2],const u128 Htable[16]) = ctx->gmult;
#endif
if (ctx->mres)
if (ctx->mres || ctx->ares)
GCM_MUL(ctx,Xi);
if (is_endian.little) {

View File

@@ -208,6 +208,8 @@ static void gcmtest(FILE *in, FILE *out, int encrypt)
ct = OPENSSL_malloc(ptlen);
rv = FIPS_cipher(&ctx, ct, pt, ptlen);
}
else
FIPS_cipher(&ctx, iv, iv, 0);
FIPS_cipher(&ctx, NULL, NULL, 0);
FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG,
taglen, tag);
@@ -242,6 +244,8 @@ static void gcmtest(FILE *in, FILE *out, int encrypt)
pt = OPENSSL_malloc(ptlen);
rv = FIPS_cipher(&ctx, pt, ct, ptlen);
}
else
FIPS_cipher(&ctx, iv, iv, 0);
rv = FIPS_cipher(&ctx, NULL, NULL, 0);
if (rv < 0)
fprintf(out, "FAIL" RESP_EOL);

View File

@@ -34,13 +34,10 @@ const void *FIPS_text_end(void);
defined(__mips__)|| defined(__mips))) || \
(defined(__NetBSD__) && (defined(__powerpc__) || defined(__i386))) || \
(defined(__linux) && ((defined(__PPC__) && !defined(__PPC64__)) || \
defined(__arm__) || defined(__arm)) || \
defined(__mips__)) || \
defined(__arm__) || defined(__arm))) || \
(defined(__APPLE__) /* verified on all MacOS X & iOS flavors */)|| \
(defined(_TMS320C6X)) || \
(defined(__ECOS__)) || \
(defined(_WIN32) && defined(_MSC_VER)) || \
(defined(__QNX__) && defined(__ARM__))
(defined(_WIN32) && defined(_MSC_VER))
# define FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
# endif
#endif

View File

@@ -714,6 +714,18 @@ static int do_drbg_all(void)
{NID_aes_128_ctr, DRBG_FLAG_CTR_USE_DF},
{NID_aes_192_ctr, DRBG_FLAG_CTR_USE_DF},
{NID_aes_256_ctr, DRBG_FLAG_CTR_USE_DF},
{(NID_X9_62_prime256v1 << 16)|NID_sha1, 0},
{(NID_X9_62_prime256v1 << 16)|NID_sha224, 0},
{(NID_X9_62_prime256v1 << 16)|NID_sha256, 0},
{(NID_X9_62_prime256v1 << 16)|NID_sha384, 0},
{(NID_X9_62_prime256v1 << 16)|NID_sha512, 0},
{(NID_secp384r1 << 16)|NID_sha224, 0},
{(NID_secp384r1 << 16)|NID_sha256, 0},
{(NID_secp384r1 << 16)|NID_sha384, 0},
{(NID_secp384r1 << 16)|NID_sha512, 0},
{(NID_secp521r1 << 16)|NID_sha256, 0},
{(NID_secp521r1 << 16)|NID_sha384, 0},
{(NID_secp521r1 << 16)|NID_sha512, 0},
{0, 0}
};
DRBG_LIST *lst;

View File

@@ -20,8 +20,8 @@ my @fips_dsa_test_list = (
);
my @fips_dsa_pqgver_test_list = (
"DSA",
[ "PQGVer", "fips_dssvs pqgver"]
[ "PQGVer", "fips_dssvs pqgver", "path:[^C]DSA/.*PQGVer" ]
);
@@ -34,7 +34,7 @@ my @fips_dsa2_test_list = (
[ "KeyPair", "fips_dssvs keypair", "path:[^C]DSA2/.*KeyPair" ],
[ "SigGen", "fips_dssvs siggen", "path:[^C]DSA2/.*SigGen" ],
[ "SigVer", "fips_dssvs sigver", "path:[^C]DSA2/.*SigVer" ],
[ "PQGVer", "fips_dssvs pqgver", "file:L\\s*=.*N\\s*=" ]
[ "PQGVer", "fips_dssvs pqgver", "path:[^C]DSA2/.*PQGVer" ]
);
@@ -47,9 +47,7 @@ my @fips_ecdsa_test_list = (
[ "PKV", "fips_ecdsavs PKV", "path:/ECDSA/.*PKV" ],
[ "SigGen", "fips_ecdsavs SigGen", "path:/ECDSA/.*SigGen" ],
[ "SigVer", "fips_ecdsavs SigVer", "path:/ECDSA/.*SigVer" ],
);
my @fips_ecdsa2_test_list = (
"ECDSA2",
[ "KeyPair", "fips_ecdsavs KeyPair", "path:/ECDSA2/.*KeyPair" ],
@@ -67,9 +65,9 @@ my @fips_rsa_test_list = (
[ "SigGen15", "fips_rsastest" ],
[ "SigVer15", "fips_rsavtest" ],
[ "SigVer(X9.31)", "fips_rsavtest -x931", 'file:9\.31' ],
[ "SigVerRSA", "fips_rsavtest -x931" ],
[ "KeyGenRSA", "fips_rsagtest" ],
[ "SigGen(X9.31)", "fips_rsastest -x931" , 'file:9\.31']
[ "SigGenRSA", "fips_rsastest -x931" ]
);
@@ -81,22 +79,21 @@ my @fips_rsa_test_list = (
# RSA PSS salt length 0 tests
my @fips_rsa_pss0_test_list = (
"RSA",
[ "SigGenPSS(0)", "fips_rsastest -saltlen 0",
'file:salt\s+len:\s+0' ],
'file:^\s*#\s*salt\s+len:\s+0\s*$' ],
[ "SigVerPSS(0)", "fips_rsavtest -saltlen 0",
'file:salt\s+len:\s+0' ],
'file:^\s*#\s*salt\s+len:\s+0\s*$' ],
);
# RSA PSS salt length 62 tests
my @fips_rsa_pss62_test_list = (
"RSA",
[ "SigGenPSS(62)", "fips_rsastest -saltlen 62",
'file:salt\s+len:\s+62' ],
'file:^\s*#\s*salt\s+len:\s+62\s*$' ],
[ "SigVerPSS(62)", "fips_rsavtest -saltlen 62",
'file:salt\s+len:\s+62' ],
'file:^\s*#\s*salt\s+len:\s+62\s*$' ],
);
# SHA tests
@@ -437,6 +434,7 @@ my @fips_drbg_test_list = (
# SP800-90 DRBG tests
"SP800-90 DRBG",
[ "CTR_DRBG", "fips_drbgvs" ],
[ "Dual_EC_DRBG", "fips_drbgvs" ],
[ "Hash_DRBG", "fips_drbgvs" ],
[ "HMAC_DRBG", "fips_drbgvs" ]
@@ -514,14 +512,12 @@ my $no_warn_bogus = 0;
my $rmcmd = "rm -rf";
my $mkcmd = "mkdir";
my $cmpall = 0;
my $info = 0;
my %fips_enabled = (
"dsa" => 1,
"dsa2" => 2,
"dsa-pqgver" => 2,
"ecdsa" => 2,
"ecdsa2" => 2,
"rsa" => 1,
"rsa-pss0" => 2,
"rsa-pss62" => 1,
@@ -582,12 +578,6 @@ foreach (@ARGV) {
elsif ( $_ eq "--notest" ) {
$notest = 1;
}
elsif ( $_ eq "--debug-detect" ) {
$notest = 1;
$ignore_missing = 1;
$ignore_bogus = 1;
$info = 1;
}
elsif ( $_ eq "--quiet" ) {
$quiet = 1;
}
@@ -651,15 +641,13 @@ if (!$fips_enabled{"v2"}) {
}
push @fips_test_list, @fips_dsa_test_list if $fips_enabled{"dsa"};
push @fips_test_list, @fips_dsa2_test_list if $fips_enabled{"dsa2"};
push @fips_test_list, @fips_dsa_pqgver_test_list if $fips_enabled{"dsa-pqgver"};
push @fips_test_list, @fips_dsa2_test_list if $fips_enabled{"dsa2"};
push @fips_test_list, @fips_ecdsa_test_list if $fips_enabled{"ecdsa"};
push @fips_test_list, @fips_ecdsa2_test_list if $fips_enabled{"ecdsa2"};
push @fips_test_list, @fips_rsa_test_list if $fips_enabled{"rsa"};
push @fips_test_list, @fips_rsa_pss0_test_list if $fips_enabled{"rsa-pss0"};
push @fips_test_list, @fips_rsa_pss62_test_list if $fips_enabled{"rsa-pss62"};
push @fips_test_list, @fips_sha_test_list if $fips_enabled{"sha"};
push @fips_test_list, @fips_drbg_test_list if $fips_enabled{"drbg"};
push @fips_test_list, @fips_hmac_test_list if $fips_enabled{"hmac"};
push @fips_test_list, @fips_cmac_test_list if $fips_enabled{"cmac"};
push @fips_test_list, @fips_rand_aes_test_list if $fips_enabled{"rand-aes"};
@@ -668,6 +656,7 @@ push @fips_test_list, @fips_aes_test_list if $fips_enabled{"aes"};
push @fips_test_list, @fips_aes_cfb1_test_list if $fips_enabled{"aes-cfb1"};
push @fips_test_list, @fips_des3_test_list if $fips_enabled{"des3"};
push @fips_test_list, @fips_des3_cfb1_test_list if $fips_enabled{"des3-cfb1"};
push @fips_test_list, @fips_drbg_test_list if $fips_enabled{"drbg"};
push @fips_test_list, @fips_aes_ccm_test_list if $fips_enabled{"aes-ccm"};
push @fips_test_list, @fips_aes_gcm_test_list if $fips_enabled{"aes-gcm"};
push @fips_test_list, @fips_aes_xts_test_list if $fips_enabled{"aes-xts"};
@@ -722,9 +711,9 @@ sanity_check_files();
my ( $runerr, $cmperr, $cmpok, $scheckrunerr, $scheckerr, $scheckok, $skipcnt )
= ( 0, 0, 0, 0, 0, 0, 0 );
exit(0) if $notest;
print "Outputting commands to $outfile\n" if $outfile ne "";
run_tests( $verify, $win32, $tprefix, $filter, $tvdir, $outfile );
exit(0) if $notest;
if ($verify) {
print "ALGORITHM TEST VERIFY SUMMARY REPORT:\n";
@@ -790,7 +779,7 @@ EOF
while (my ($key, $value) = each %fips_enabled)
{
printf "\t\t%-20s(%s by default)\n", $key ,
$value != 0 ? "enabled" : "disabled";
$value == 1 ? "enabled" : "disabled";
}
}
@@ -829,14 +818,13 @@ sub sanity_check_exe {
sub find_files {
my ( $filter, $dir ) = @_;
my ( $dirh, $testname, $tref );
my $ttype;
opendir( $dirh, $dir );
while ( $_ = readdir($dirh) ) {
next if ( $_ eq "." || $_ eq ".." );
$_ = "$dir/$_";
if ( -f "$_" ) {
if (/\/([^\/]*)\.rsp$/) {
$tref = find_test($1, $_, \$ttype);
$tref = find_test($1, $_);
if ( defined $tref ) {
$testname = $$tref[0];
if ( $$tref[4] eq "" ) {
@@ -844,7 +832,7 @@ sub find_files {
}
else {
print STDERR
"WARNING: duplicate response file $_ for $ttype test $testname\n";
"WARNING: duplicate response file $_ for test $testname\n";
$nbogus++;
}
}
@@ -855,28 +843,21 @@ sub find_files {
}
next unless /$filter.*\.req$/i;
if (/\/([^\/]*)\.req$/) {
$tref = find_test($1, $_, \$ttype);
$tref = find_test($1, $_);
if ( defined $tref ) {
$testname = $$tref[0];
my $tfname = $$tref[3];
if ( $tfname eq "" ) {
if ( $$tref[3] eq "" ) {
$$tref[3] = $_;
}
else {
print STDERR
"WARNING: duplicate request file $_ for $ttype test $testname\n";
if ($info) {
print_file_start($_, \*STDERR);
print STDERR "Original filename $tfname\n";
print_file_start($tfname, \*STDERR);
}
"WARNING: duplicate request file $_ for test $testname\n";
$nbogus++;
}
}
elsif ( !/SHAmix\.req$/ ) {
print STDERR "WARNING: unrecognized filename $_\n" unless $no_warn_bogus;
print_file_start($_, \*STDERR) if $info;
$nbogus++;
}
}
@@ -893,15 +874,13 @@ sub find_files {
#
sub find_test {
my ( $test, $path, $type ) = @_;
my ( $test, $path ) = @_;
foreach $tref (@fips_test_list) {
if (!ref($tref)) {
$$type = $tref;
next;
}
next unless ref($tref);
my ( $tst, $cmd, $excmd, $req, $resp ) = @$tref;
my $regexp;
$tst =~ s/\(.*$//;
$test =~ s/_186-2//;
if (defined $excmd) {
if ($excmd =~ /^path:(.*)$/) {
my $fmatch = $1;
@@ -912,7 +891,7 @@ sub find_test {
$regexp = $1;
}
}
if ($test =~ /^$tst/) {
if ($test eq $tst) {
return $tref if (!defined $regexp);
my $found = 0;
my $line;
@@ -932,26 +911,22 @@ sub find_test {
sub sanity_check_files {
my $bad = 0;
my $ttype;
foreach (@fips_test_list) {
if (!ref($_)) {
$ttype = $_;
next;
}
next unless ref($_);
my ( $tst, $cmd, $regexp, $req, $resp ) = @$_;
#print STDERR "FILES $tst, $cmd, $req, $resp\n";
if ( $req eq "" ) {
print STDERR "WARNING: missing request file for $ttype test $tst\n" unless $no_warn_missing;
print STDERR "WARNING: missing request file for $tst\n" unless $no_warn_missing;
$bad = 1;
next;
}
if ( $verify && $resp eq "" ) {
print STDERR "WARNING: no response file for $ttype test test $tst\n";
print STDERR "WARNING: no response file for test $tst\n";
$bad = 1;
}
elsif ( !$verify && $resp ne "" ) {
print STDERR "WARNING: response file $resp for $ttype test $tst will be overwritten\n";
print STDERR "WARNING: response file $resp will be overwritten\n";
}
}
if ($bad) {
@@ -1014,37 +989,26 @@ END
if ($outfile ne "") {
print "Generating script for $_ tests\n";
print OUT "\n\n\necho \"Running $_ tests\"\n" unless $minimal_script;
} elsif ($notest) {
print "Info for $_ tests:\n";
} else {
} else {
print "Running $_ tests\n" unless $quiet;
}
$ttype = $_;
next;
}
my ( $tname, $tcmd, $regexp, $req, $rsp ) = @$_;
if ($notest) {
if ($req ne "") {
print "Test $ttype, $tname: $req\n";
print_file_start($req, \*STDOUT) if ($info);
} else {
print "$tname: not found\n";
}
next;
}
my $out = $rsp;
if ($verify) {
$out =~ s/\.rsp$/.tst/;
}
if ( $req eq "" ) {
print STDERR
"WARNING: Request file for $ttype test $tname missing: test skipped\n" unless $no_warn_missing;
"WARNING: Request file for $tname missing: test skipped\n" unless $no_warn_missing;
$skipcnt++;
next;
}
if ( $verify && $rsp eq "" ) {
print STDERR
"WARNING: Response file for $ttype test $tname missing: test skipped\n";
"WARNING: Response file for $tname missing: test skipped\n";
$skipcnt++;
next;
}
@@ -1248,22 +1212,3 @@ sub next_line {
}
return undef;
}
sub print_file_start {
my ($fname, $fh) = @_;
print $fh "======\n";
open IN, $fname;
while (<IN>) {
my $line = $_;
s/#.*$//;
last unless (/^\s*$/);
print $fh $line;
}
my $lines = 0;
while (<IN>) {
print $fh $_;
last if $lines++ > 10;
}
close IN;
print $fh "======\n";
}

View File

@@ -23,10 +23,10 @@ APPS=
LIB=$(TOP)/libcrypto.a
LIBSRC= fips_rand.c fips_rand_selftest.c fips_drbg_lib.c \
fips_drbg_hash.c fips_drbg_hmac.c fips_drbg_ctr.c \
fips_drbg_hash.c fips_drbg_hmac.c fips_drbg_ctr.c fips_drbg_ec.c \
fips_drbg_selftest.c fips_drbg_rand.c fips_rand_lib.c
LIBOBJ= fips_rand.o fips_rand_selftest.o fips_drbg_lib.o \
fips_drbg_hash.o fips_drbg_hmac.o fips_drbg_ctr.o \
fips_drbg_hash.o fips_drbg_hmac.o fips_drbg_ctr.o fips_drbg_ec.o \
fips_drbg_selftest.o fips_drbg_rand.o fips_rand_lib.o
SRC= $(LIBSRC)
@@ -105,6 +105,18 @@ fips_drbg_ctr.o: ../../include/openssl/ossl_typ.h
fips_drbg_ctr.o: ../../include/openssl/safestack.h
fips_drbg_ctr.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
fips_drbg_ctr.o: fips_drbg_ctr.c fips_rand_lcl.h
fips_drbg_ec.o: ../../include/openssl/aes.h ../../include/openssl/asn1.h
fips_drbg_ec.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
fips_drbg_ec.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
fips_drbg_ec.o: ../../include/openssl/ec.h ../../include/openssl/evp.h
fips_drbg_ec.o: ../../include/openssl/fips.h ../../include/openssl/fips_rand.h
fips_drbg_ec.o: ../../include/openssl/hmac.h ../../include/openssl/obj_mac.h
fips_drbg_ec.o: ../../include/openssl/objects.h
fips_drbg_ec.o: ../../include/openssl/opensslconf.h
fips_drbg_ec.o: ../../include/openssl/opensslv.h
fips_drbg_ec.o: ../../include/openssl/ossl_typ.h
fips_drbg_ec.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
fips_drbg_ec.o: ../../include/openssl/symhacks.h fips_drbg_ec.c fips_rand_lcl.h
fips_drbg_hash.o: ../../include/openssl/aes.h ../../include/openssl/asn1.h
fips_drbg_hash.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
fips_drbg_hash.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h

542
fips/rand/fips_drbg_ec.c Normal file
View File

@@ -0,0 +1,542 @@
/* fips/rand/fips_drbg_ec.c */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project.
*/
/* ====================================================================
* Copyright (c) 2011 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*/
#define OPENSSL_FIPSAPI
#include <stdlib.h>
#include <string.h>
#include <openssl/crypto.h>
#include <openssl/fips.h>
#include <openssl/fips_rand.h>
#include <openssl/bn.h>
#include "fips_rand_lcl.h"
/*#define EC_DRBG_TRACE*/
#ifdef EC_DRBG_TRACE
static void hexprint(FILE *out, const unsigned char *buf, int buflen)
{
int i;
fprintf(out, "\t");
for (i = 0; i < buflen; i++)
fprintf(out, "%02X", buf[i]);
fprintf(out, "\n");
}
static void bnprint(FILE *out, const char *name, const BIGNUM *b)
{
unsigned char *tmp;
int len;
len = BN_num_bytes(b);
tmp = OPENSSL_malloc(len);
BN_bn2bin(b, tmp);
fprintf(out, "%s\n", name);
hexprint(out, tmp, len);
OPENSSL_free(tmp);
}
#if 0
static void ecprint(FILE *out, EC_GROUP *grp, EC_POINT *pt)
{
BIGNUM *x, *y;
x = BN_new();
y = BN_new();
EC_POINT_get_affine_coordinates_GFp(grp, pt, x, y, NULL);
bnprint(out, "\tPoint X: ", x);
bnprint(out, "\tPoint Y: ", y);
BN_free(x);
BN_free(y);
}
#endif
#endif
/* This is Hash_df from SP 800-90 10.4.1 */
static int hash_df(DRBG_CTX *dctx, unsigned char *out,
const unsigned char *in1, size_t in1len,
const unsigned char *in2, size_t in2len,
const unsigned char *in3, size_t in3len)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
EVP_MD_CTX *mctx = &ectx->mctx;
unsigned char *vtmp = ectx->vtmp;
unsigned char tmp[6];
size_t mdlen = M_EVP_MD_size(ectx->md);
/* Standard only ever needs seedlen bytes which is always less than
* maximum permitted so no need to check length.
*/
size_t outlen = dctx->seedlen;
size_t nbits = (outlen << 3) - ectx->exbits;
tmp[0] = 1;
tmp[1] = (nbits >> 24) & 0xff;
tmp[2] = (nbits >> 16) & 0xff;
tmp[3] = (nbits >> 8) & 0xff;
tmp[4] = nbits & 0xff;
if (!in1)
{
tmp[5] = (unsigned char)in1len;
in1 = tmp + 5;
in1len = 1;
}
for (;;)
{
if (!FIPS_digestinit(mctx, ectx->md))
return 0;
if (!FIPS_digestupdate(mctx, tmp, 5))
return 0;
if (in1 && !FIPS_digestupdate(mctx, in1, in1len))
return 0;
if (in2 && !FIPS_digestupdate(mctx, in2, in2len))
return 0;
if (in3 && !FIPS_digestupdate(mctx, in3, in3len))
return 0;
if (outlen < mdlen)
{
if (!FIPS_digestfinal(mctx, vtmp, NULL))
return 0;
memcpy(out, vtmp, outlen);
OPENSSL_cleanse(vtmp, mdlen);
return 1;
}
else if(!FIPS_digestfinal(mctx, out, NULL))
return 0;
outlen -= mdlen;
if (outlen == 0)
return 1;
tmp[0]++;
out += mdlen;
}
}
static int bn2binpad(unsigned char *to, size_t tolen, BIGNUM *b)
{
size_t blen;
blen = BN_num_bytes(b);
/* If BIGNUM length greater than buffer, mask to get rightmost
* bytes. NB: modifies b but this doesn't matter for our purposes.
*/
if (blen > tolen)
{
BN_mask_bits(b, tolen << 3);
/* Update length because mask operation might create leading
* zeroes.
*/
blen = BN_num_bytes(b);
}
/* If b length smaller than buffer pad with zeroes */
if (blen < tolen)
{
memset(to, 0, tolen - blen);
to += tolen - blen;
}
/* This call cannot fail */
BN_bn2bin(b, to);
return 1;
}
/* Convert buffer to a BIGNUM discarding extra bits if necessary */
static int bin2bnbits(DRBG_CTX *dctx, BIGNUM *r, const unsigned char *buf)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
if (!BN_bin2bn(buf, dctx->seedlen, r))
return 0;
/* If we have extra bits right shift off the end of r */
if (ectx->exbits)
{
if (!BN_rshift(r, r, ectx->exbits))
return 0;
}
return 1;
}
/* Calculate r = phi(s * P) or r= phi(s * Q) */
static int drbg_ec_mul(DRBG_EC_CTX *ectx, BIGNUM *r, const BIGNUM *s, int use_q)
{
if (use_q)
{
if (!EC_POINT_mul(ectx->curve, ectx->ptmp,
NULL, ectx->Q, s, ectx->bctx))
return 0;
}
else
{
if (!EC_POINT_mul(ectx->curve, ectx->ptmp,
s, NULL, NULL, ectx->bctx))
return 0;
}
/* Get x coordinate of result */
if (!EC_POINT_get_affine_coordinates_GFp(ectx->curve, ectx->ptmp, r,
NULL, ectx->bctx))
return 0;
return 1;
}
static int drbg_ec_instantiate(DRBG_CTX *dctx,
const unsigned char *ent, size_t ent_len,
const unsigned char *nonce, size_t nonce_len,
const unsigned char *pstr, size_t pstr_len)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
if (!hash_df(dctx, ectx->sbuf,
ent, ent_len, nonce, nonce_len, pstr, pstr_len))
return 0;
if (!bin2bnbits(dctx, ectx->s, ectx->sbuf))
return 0;
return 1;
}
static int drbg_ec_reseed(DRBG_CTX *dctx,
const unsigned char *ent, size_t ent_len,
const unsigned char *adin, size_t adin_len)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
/* Convert s value to a binary buffer. Save it to tbuf as we are
* about to overwrite it.
*/
if (ectx->exbits)
BN_lshift(ectx->s, ectx->s, ectx->exbits);
bn2binpad(ectx->tbuf, dctx->seedlen, ectx->s);
if (!hash_df(dctx, ectx->sbuf, ectx->tbuf, dctx->seedlen,
ent, ent_len, adin, adin_len))
return 0;
if (!bin2bnbits(dctx, ectx->s, ectx->sbuf))
return 0;
dctx->reseed_counter = 0;
return 1;
}
static int drbg_ec_generate(DRBG_CTX *dctx,
unsigned char *out, size_t outlen,
const unsigned char *adin, size_t adin_len)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
BIGNUM *t, *r;
BIGNUM *s = ectx->s;
/* special case: check reseed interval */
if (out == NULL)
{
size_t nb = (outlen + dctx->blocklength - 1)/dctx->blocklength;
if (dctx->reseed_counter + nb > dctx->reseed_interval)
dctx->status = DRBG_STATUS_RESEED;
return 1;
}
BN_CTX_start(ectx->bctx);
r = BN_CTX_get(ectx->bctx);
if (!r)
goto err;
if (adin && adin_len)
{
size_t i;
t = BN_CTX_get(ectx->bctx);
if (!t)
goto err;
/* Convert s to buffer */
if (ectx->exbits)
BN_lshift(s, s, ectx->exbits);
bn2binpad(ectx->sbuf, dctx->seedlen, s);
/* Step 2 */
if (!hash_df(dctx, ectx->tbuf, adin, adin_len,
NULL, 0, NULL, 0))
goto err;
/* Step 5 */
for (i = 0; i < dctx->seedlen; i++)
ectx->tbuf[i] ^= ectx->sbuf[i];
if (!bin2bnbits(dctx, t, ectx->tbuf))
return 0;
}
else
/* Note if no additional input the algorithm never
* needs separate values for t and s.
*/
t = s;
#ifdef EC_DRBG_TRACE
bnprint(stderr, "s at start of generate: ", s);
#endif
for (;;)
{
/* Step #6, calculate s = t * P */
if (!drbg_ec_mul(ectx, s, t, 0))
goto err;
#ifdef EC_DRBG_TRACE
bnprint(stderr, "s in generate: ", ectx->s);
#endif
/* Step #7, calculate r = s * Q */
if (!drbg_ec_mul(ectx, r, s, 1))
goto err;
#ifdef EC_DRBG_TRACE
bnprint(stderr, "r in generate is: ", r);
#endif
dctx->reseed_counter++;
/* Get rightmost bits of r to output buffer */
if (!(dctx->xflags & DRBG_FLAG_TEST) && !dctx->lb_valid)
{
if (!bn2binpad(dctx->lb, dctx->blocklength, r))
goto err;
dctx->lb_valid = 1;
continue;
}
if (outlen < dctx->blocklength)
{
if (!bn2binpad(ectx->vtmp, dctx->blocklength, r))
goto err;
if (!fips_drbg_cprng_test(dctx, ectx->vtmp))
goto err;
memcpy(out, ectx->vtmp, outlen);
break;
}
else
{
if (!bn2binpad(out, dctx->blocklength, r))
goto err;
if (!fips_drbg_cprng_test(dctx, out))
goto err;
}
outlen -= dctx->blocklength;
if (!outlen)
break;
out += dctx->blocklength;
/* Step #5 after first pass */
t = s;
#ifdef EC_DRBG_TRACE
fprintf(stderr, "Random bits written:\n");
hexprint(stderr, out, dctx->blocklength);
#endif
}
if (!drbg_ec_mul(ectx, ectx->s, ectx->s, 0))
return 0;
#ifdef EC_DRBG_TRACE
bnprint(stderr, "s after generate is: ", s);
#endif
BN_CTX_end(ectx->bctx);
return 1;
err:
BN_CTX_end(ectx->bctx);
return 0;
}
static int drbg_ec_uninstantiate(DRBG_CTX *dctx)
{
DRBG_EC_CTX *ectx = &dctx->d.ec;
EVP_MD_CTX_cleanup(&ectx->mctx);
EC_GROUP_free(ectx->curve);
EC_POINT_free(ectx->Q);
EC_POINT_free(ectx->ptmp);
BN_clear_free(ectx->s);
BN_CTX_free(ectx->bctx);
OPENSSL_cleanse(&dctx->d.ec, sizeof(DRBG_EC_CTX));
return 1;
}
/* Q points from SP 800-90 A.1, P is generator */
__fips_constseg
static const unsigned char p_256_qx[] = {
0xc9,0x74,0x45,0xf4,0x5c,0xde,0xf9,0xf0,0xd3,0xe0,0x5e,0x1e,
0x58,0x5f,0xc2,0x97,0x23,0x5b,0x82,0xb5,0xbe,0x8f,0xf3,0xef,
0xca,0x67,0xc5,0x98,0x52,0x01,0x81,0x92
};
__fips_constseg
static const unsigned char p_256_qy[] = {
0xb2,0x8e,0xf5,0x57,0xba,0x31,0xdf,0xcb,0xdd,0x21,0xac,0x46,
0xe2,0xa9,0x1e,0x3c,0x30,0x4f,0x44,0xcb,0x87,0x05,0x8a,0xda,
0x2c,0xb8,0x15,0x15,0x1e,0x61,0x00,0x46
};
__fips_constseg
static const unsigned char p_384_qx[] = {
0x8e,0x72,0x2d,0xe3,0x12,0x5b,0xdd,0xb0,0x55,0x80,0x16,0x4b,
0xfe,0x20,0xb8,0xb4,0x32,0x21,0x6a,0x62,0x92,0x6c,0x57,0x50,
0x2c,0xee,0xde,0x31,0xc4,0x78,0x16,0xed,0xd1,0xe8,0x97,0x69,
0x12,0x41,0x79,0xd0,0xb6,0x95,0x10,0x64,0x28,0x81,0x50,0x65
};
__fips_constseg
static const unsigned char p_384_qy[] = {
0x02,0x3b,0x16,0x60,0xdd,0x70,0x1d,0x08,0x39,0xfd,0x45,0xee,
0xc3,0x6f,0x9e,0xe7,0xb3,0x2e,0x13,0xb3,0x15,0xdc,0x02,0x61,
0x0a,0xa1,0xb6,0x36,0xe3,0x46,0xdf,0x67,0x1f,0x79,0x0f,0x84,
0xc5,0xe0,0x9b,0x05,0x67,0x4d,0xbb,0x7e,0x45,0xc8,0x03,0xdd
};
__fips_constseg
static const unsigned char p_521_qx[] = {
0x01,0xb9,0xfa,0x3e,0x51,0x8d,0x68,0x3c,0x6b,0x65,0x76,0x36,
0x94,0xac,0x8e,0xfb,0xae,0xc6,0xfa,0xb4,0x4f,0x22,0x76,0x17,
0x1a,0x42,0x72,0x65,0x07,0xdd,0x08,0xad,0xd4,0xc3,0xb3,0xf4,
0xc1,0xeb,0xc5,0xb1,0x22,0x2d,0xdb,0xa0,0x77,0xf7,0x22,0x94,
0x3b,0x24,0xc3,0xed,0xfa,0x0f,0x85,0xfe,0x24,0xd0,0xc8,0xc0,
0x15,0x91,0xf0,0xbe,0x6f,0x63
};
__fips_constseg
static const unsigned char p_521_qy[] = {
0x01,0xf3,0xbd,0xba,0x58,0x52,0x95,0xd9,0xa1,0x11,0x0d,0x1d,
0xf1,0xf9,0x43,0x0e,0xf8,0x44,0x2c,0x50,0x18,0x97,0x6f,0xf3,
0x43,0x7e,0xf9,0x1b,0x81,0xdc,0x0b,0x81,0x32,0xc8,0xd5,0xc3,
0x9c,0x32,0xd0,0xe0,0x04,0xa3,0x09,0x2b,0x7d,0x32,0x7c,0x0e,
0x7a,0x4d,0x26,0xd2,0xc7,0xb6,0x9b,0x58,0xf9,0x06,0x66,0x52,
0x91,0x1e,0x45,0x77,0x79,0xde
};
int fips_drbg_ec_init(DRBG_CTX *dctx)
{
const EVP_MD *md;
const unsigned char *Q_x, *Q_y;
BIGNUM *x, *y;
size_t ptlen;
int md_nid = dctx->type & 0xffff;
int curve_nid = dctx->type >> 16;
DRBG_EC_CTX *ectx = &dctx->d.ec;
md = FIPS_get_digestbynid(md_nid);
if (!md)
return -2;
/* These are taken from SP 800-90 10.3.1 table 4 */
switch (curve_nid)
{
case NID_X9_62_prime256v1:
dctx->strength = 128;
dctx->seedlen = 32;
dctx->blocklength = 30;
ectx->exbits = 0;
Q_x = p_256_qx;
Q_y = p_256_qy;
ptlen = sizeof(p_256_qx);
break;
case NID_secp384r1:
if (md_nid == NID_sha1)
return -2;
dctx->strength = 192;
dctx->seedlen = 48;
dctx->blocklength = 46;
ectx->exbits = 0;
Q_x = p_384_qx;
Q_y = p_384_qy;
ptlen = sizeof(p_384_qx);
break;
case NID_secp521r1:
if (md_nid == NID_sha1 || md_nid == NID_sha224)
return -2;
dctx->strength = 256;
dctx->seedlen = 66;
dctx->blocklength = 63;
ectx->exbits = 7;
Q_x = p_521_qx;
Q_y = p_521_qy;
ptlen = sizeof(p_521_qx);
break;
default:
return -2;
}
dctx->iflags |= DRBG_CUSTOM_RESEED;
dctx->reseed_counter = 0;
dctx->instantiate = drbg_ec_instantiate;
dctx->reseed = drbg_ec_reseed;
dctx->generate = drbg_ec_generate;
dctx->uninstantiate = drbg_ec_uninstantiate;
ectx->md = md;
EVP_MD_CTX_init(&ectx->mctx);
dctx->min_entropy = dctx->strength / 8;
dctx->max_entropy = 2 << 10;
dctx->min_nonce = dctx->min_entropy / 2;
dctx->max_nonce = 2 << 10;
dctx->max_pers = 2 << 10;
dctx->max_adin = 2 << 10;
dctx->reseed_interval = 1<<24;
dctx->max_request = dctx->reseed_interval * dctx->blocklength;
/* Setup internal structures */
ectx->bctx = BN_CTX_new();
if (!ectx->bctx)
return 0;
BN_CTX_start(ectx->bctx);
ectx->s = BN_new();
ectx->curve = EC_GROUP_new_by_curve_name(curve_nid);
ectx->Q = EC_POINT_new(ectx->curve);
ectx->ptmp = EC_POINT_new(ectx->curve);
x = BN_CTX_get(ectx->bctx);
y = BN_CTX_get(ectx->bctx);
if (!ectx->s || !ectx->curve || !ectx->Q || !y)
goto err;
if (!BN_bin2bn(Q_x, ptlen, x) || !BN_bin2bn(Q_y, ptlen, y))
goto err;
if (!EC_POINT_set_affine_coordinates_GFp(ectx->curve, ectx->Q,
x, y, ectx->bctx))
goto err;
BN_CTX_end(ectx->bctx);
return 1;
err:
BN_CTX_end(ectx->bctx);
drbg_ec_uninstantiate(dctx);
return 0;
}

View File

@@ -79,6 +79,8 @@ int FIPS_drbg_init(DRBG_CTX *dctx, int type, unsigned int flags)
rv = fips_drbg_ctr_init(dctx);
if (rv == -2)
rv = fips_drbg_hmac_init(dctx);
if (rv == -2)
rv = fips_drbg_ec_init(dctx);
if (rv <= 0)
{

View File

@@ -133,6 +133,9 @@ typedef struct {
#define make_drbg_test_data_df(nid, pr, p) \
make_drbg_test_data(nid, DRBG_FLAG_CTR_USE_DF, pr, p)
#define make_drbg_test_data_ec(curve, md, pr, p) \
make_drbg_test_data((curve << 16) | md , 0, pr, p)
static DRBG_SELFTEST_DATA drbg_test[] = {
make_drbg_test_data_df(NID_aes_128_ctr, aes_128_use_df, 0),
make_drbg_test_data_df(NID_aes_192_ctr, aes_192_use_df, 0),
@@ -150,6 +153,18 @@ static DRBG_SELFTEST_DATA drbg_test[] = {
make_drbg_test_data(NID_hmacWithSHA256, 0, hmac_sha256, 1),
make_drbg_test_data(NID_hmacWithSHA384, 0, hmac_sha384, 0),
make_drbg_test_data(NID_hmacWithSHA512, 0, hmac_sha512, 0),
make_drbg_test_data_ec(NID_X9_62_prime256v1, NID_sha1, p_256_sha1, 0),
make_drbg_test_data_ec(NID_X9_62_prime256v1, NID_sha224, p_256_sha224, 0),
make_drbg_test_data_ec(NID_X9_62_prime256v1, NID_sha256, p_256_sha256, 1),
make_drbg_test_data_ec(NID_X9_62_prime256v1, NID_sha384, p_256_sha384, 0),
make_drbg_test_data_ec(NID_X9_62_prime256v1, NID_sha512, p_256_sha512, 0),
make_drbg_test_data_ec(NID_secp384r1, NID_sha224, p_384_sha224, 0),
make_drbg_test_data_ec(NID_secp384r1, NID_sha256, p_384_sha256, 0),
make_drbg_test_data_ec(NID_secp384r1, NID_sha384, p_384_sha384, 0),
make_drbg_test_data_ec(NID_secp384r1, NID_sha512, p_384_sha512, 0),
make_drbg_test_data_ec(NID_secp521r1, NID_sha256, p_521_sha256, 0),
make_drbg_test_data_ec(NID_secp521r1, NID_sha384, p_521_sha384, 0),
make_drbg_test_data_ec(NID_secp521r1, NID_sha512, p_521_sha512, 0),
{0,0,0}
};

File diff suppressed because it is too large Load Diff

View File

@@ -182,7 +182,7 @@ int main(int argc,char **argv)
int r, nid = 0;
int pr = 0;
char buf[2048], lbuf[2048];
unsigned char randout[2048];
unsigned char *randout = NULL;
char *keyword = NULL, *value = NULL;
unsigned char *ent = NULL, *nonce = NULL, *pers = NULL, *adin = NULL;
@@ -298,6 +298,8 @@ int main(int argc,char **argv)
else
exit(1);
}
if (!strcmp(keyword, "[ReturnedBitsLen"))
randoutlen = atoi(value) / 8;
if (!strcmp(keyword, "EntropyInput"))
{
@@ -327,7 +329,11 @@ int main(int argc,char **argv)
FIPS_drbg_set_callbacks(dctx, test_entropy, 0, 0,
test_nonce, 0);
FIPS_drbg_set_app_data(dctx, &t);
randoutlen = (int)FIPS_drbg_get_blocklength(dctx);
if (randoutlen == 0)
randoutlen = (int)FIPS_drbg_get_blocklength(dctx);
if (randout)
OPENSSL_free(randout);
randout = OPENSSL_malloc(randoutlen);
r = FIPS_drbg_instantiate(dctx, pers, perslen);
if (!r)
{
@@ -406,6 +412,8 @@ int main(int argc,char **argv)
}
}
if (randout)
OPENSSL_free(randout);
if (in && in != stdin)
fclose(in);
if (out && out != stdout)

View File

@@ -236,5 +236,6 @@ struct drbg_ctx_st
int fips_drbg_ctr_init(DRBG_CTX *dctx);
int fips_drbg_hash_init(DRBG_CTX *dctx);
int fips_drbg_hmac_init(DRBG_CTX *dctx);
int fips_drbg_ec_init(DRBG_CTX *dctx);
int fips_drbg_kat(DRBG_CTX *dctx, int nid, unsigned int flags);
int fips_drbg_cprng_test(DRBG_CTX *dctx, const unsigned char *out);

View File

@@ -208,6 +208,7 @@ int FIPS_cipherinit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
break;
case EVP_CIPH_CTR_MODE:
ctx->num = 0;
/* Don't reuse IV for CTR mode */
if(iv)
memcpy(ctx->iv, iv, M_EVP_CIPHER_CTX_iv_length(ctx));

View File

@@ -127,14 +127,8 @@ elsif ($FLAVOR =~ /CE/)
$base_cflags.=" $wcecdefs";
$base_cflags.=' -I$(WCECOMPAT)/include' if (defined($ENV{'WCECOMPAT'}));
$base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include' if (defined($ENV{'PORTSDK_LIBPATH'}));
if ($ENV{PLATFORM} =~ /wce7/i) {
$opt_cflags=' /MT /O1i'; # optimize for space, but with intrinsics...
$dbg_cflags=' /MT /Od -DDEBUG -D_DEBUG';
} else {
$opt_cflags=' /MC /O1i'; # optimize for space, but with intrinsics...
$dbg_cflags=' /MC /Od -DDEBUG -D_DEBUG';
}
$opt_cflags=' /MC /O1i'; # optimize for space, but with intrinsics...
$dbg_clfags=' /MC /Od -DDEBUG -D_DEBUG';
$lflags="/nologo /opt:ref $wcelflag";
}
else # Win32