From 2ff2dee66d1c869282cd153a8407b37ece2b79fc Mon Sep 17 00:00:00 2001 From: jhurst Date: Sun, 19 Jul 2020 11:43:14 -0700 Subject: The PRNG implementation has been modified to use the newly-added internal AES and SHA-1 instead of relying on OpenSSL (or LibreSSL.) This paves the way for building the library without OpenSSL when cinema encryption is not required. --- src/KM_prng.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/KM_prng.cpp') diff --git a/src/KM_prng.cpp b/src/KM_prng.cpp index d11a330..43f632b 100755 --- a/src/KM_prng.cpp +++ b/src/KM_prng.cpp @@ -31,12 +31,17 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include +#include #include #include #include -#include + +#define ENABLE_FIPS_186 +#ifdef ENABLE_FIPS_186 #include #include +#endif // ENABLE_FIPS_186 using namespace Kumu; @@ -51,7 +56,7 @@ const char* DEV_URANDOM = "/dev/urandom"; const ui32_t RNG_KEY_SIZE = 512UL; const ui32_t RNG_KEY_SIZE_BITS = 256UL; -const ui32_t RNG_BLOCK_SIZE = 16UL; +const ui32_t RNG_BLOCK_SIZE = AES_BLOCKLEN; const ui32_t MAX_SEQUENCE_LEN = 0x00040000UL; @@ -61,7 +66,7 @@ class h__RNG KM_NO_COPY_CONSTRUCT(h__RNG); public: - AES_KEY m_Context; + AES_ctx m_Context; byte_t m_ctr_buf[RNG_BLOCK_SIZE]; Mutex m_Lock; @@ -105,7 +110,7 @@ public: { assert(key_fodder); byte_t sha_buf[20]; - SHA_CTX SHA; + SHA1_CTX SHA; SHA1_Init(&SHA); SHA1_Update(&SHA, (byte_t*)&m_Context, sizeof(m_Context)); @@ -113,7 +118,7 @@ public: SHA1_Final(sha_buf, &SHA); AutoMutex Lock(m_Lock); - AES_set_encrypt_key(sha_buf, RNG_KEY_SIZE_BITS, &m_Context); + AES_init_ctx(&m_Context, sha_buf); *(ui32_t*)(m_ctr_buf + 12) = 1; } @@ -127,7 +132,8 @@ public: while ( gen_count + RNG_BLOCK_SIZE <= len ) { - AES_encrypt(m_ctr_buf, buf + gen_count, &m_Context); + memcpy(buf + gen_count, m_ctr_buf, RNG_BLOCK_SIZE); + AES_encrypt(&m_Context, buf + gen_count); *(ui32_t*)(m_ctr_buf + 12) += 1; gen_count += RNG_BLOCK_SIZE; } @@ -135,7 +141,8 @@ public: if ( len != gen_count ) // partial count needed? { byte_t tmp[RNG_BLOCK_SIZE]; - AES_encrypt(m_ctr_buf, tmp, &m_Context); + memcpy(tmp, m_ctr_buf, RNG_BLOCK_SIZE); + AES_encrypt(&m_Context, tmp); memcpy(buf + gen_count, tmp, len - gen_count); } } @@ -192,8 +199,11 @@ Kumu::FortunaRNG::FillRandom(Kumu::ByteString& Buffer) return Buffer.Data(); } + //------------------------------------------------------------------------------------------ +#ifdef ENABLE_FIPS_186 + // // FIPS 186-2 Sec. 3.1 as modified by Change 1, section entitled "General Purpose Random Number Generation" void @@ -278,6 +288,8 @@ Kumu::Gen_FIPS_186_Value(const byte_t* key, ui32_t key_size, byte_t* out_buf, ui BN_CTX_free(ctx1); } +#endif // ENABLE_FIPS_186 + // // end KM_prng.cpp // -- cgit v1.2.3 From b5e47e45509ce3a1a696ef06583ef86a5e1e8223 Mon Sep 17 00:00:00 2001 From: John Hurst Date: Fri, 15 Jan 2021 08:33:06 -0800 Subject: Fixed lingering openssl build issue for autotools build --- m4/ax_lib_openssl.m4 | 2 +- src/KM_prng.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/KM_prng.cpp') diff --git a/m4/ax_lib_openssl.m4 b/m4/ax_lib_openssl.m4 index 9e94b94..074bdfb 100644 --- a/m4/ax_lib_openssl.m4 +++ b/m4/ax_lib_openssl.m4 @@ -284,7 +284,7 @@ SSLeay(); fi fi if test "$HAVE_OPENSSL" = "yes"; then - CPPFLAGS="$CPPFLAGS $OPENSSL_CPPFLAGS -DHAVE_SSL=1" + CPPFLAGS="$CPPFLAGS $OPENSSL_CPPFLAGS -DHAVE_OPENSSL=1" LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LIBS" else HAVE_OPENSSL="no" diff --git a/src/KM_prng.cpp b/src/KM_prng.cpp index 43f632b..f40d846 100755 --- a/src/KM_prng.cpp +++ b/src/KM_prng.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2006-2009, John Hurst +Copyright (c) 2006-2021, John Hurst All rights reserved. Redistribution and use in source and binary forms, with or without @@ -37,11 +37,11 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#define ENABLE_FIPS_186 -#ifdef ENABLE_FIPS_186 -#include -#include -#endif // ENABLE_FIPS_186 +#ifdef HAVE_OPENSSL +# define ENABLE_FIPS_186 +# include +# include +#endif // HAVE_OPENSSL using namespace Kumu; -- cgit v1.2.3