Prohibit use of low level digest APIs in FIPS mode.
authorDr. Stephen Henson <steve@openssl.org>
Wed, 1 Jun 2011 13:39:45 +0000 (13:39 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 1 Jun 2011 13:39:45 +0000 (13:39 +0000)
27 files changed:
CHANGES
crypto/crypto.h
crypto/evp/evp_locl.h
crypto/evp/m_md4.c
crypto/evp/m_md5.c
crypto/evp/m_mdc2.c
crypto/evp/m_ripemd.c
crypto/evp/m_sha.c
crypto/evp/m_wp.c
crypto/md2/md2.h
crypto/md2/md2_dgst.c
crypto/md4/md4.h
crypto/md4/md4_dgst.c
crypto/md5/md5.h
crypto/md5/md5_dgst.c
crypto/mdc2/mdc2.h
crypto/mdc2/mdc2dgst.c
crypto/ripemd/ripemd.h
crypto/ripemd/rmd_dgst.c
crypto/sha/sha.h
crypto/sha/sha1dgst.c
crypto/sha/sha256.c
crypto/sha/sha512.c
crypto/sha/sha_dgst.c
crypto/sha/sha_locl.h
crypto/whrlpool/whrlpool.h
crypto/whrlpool/wp_dgst.c

diff --git a/CHANGES b/CHANGES
index e45caddc031b968e121d2c4d649c68ae7b949a65..4702d74f102cd1a200754efe6ea8176d45274141 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,11 @@
 
  Changes between 1.0.0d and 1.0.1  [xx XXX xxxx]
 
+  *) Low level digest APIs are not approved in FIPS mode: any attempt
+     to use these will cause a fatal error. Applications that *really* want
+     to use them can use the private_* version instead.
+     [Steve Henson]
+
   *) Redirect cipher operations to FIPS module for FIPS builds. 
      [Steve Henson]
 
index 0a34ef2ac210a42d49f06266120b48ae8d89cab7..da3e27bc2f815089146aa9bb6bf05d871def8a8e 100644 (file)
@@ -552,6 +552,22 @@ int FIPS_mode_set(int r);
 
 void OPENSSL_init(void);
 
+#define fips_md_init(alg) fips_md_init_ctx(alg, alg)
+
+#ifdef OPENSSL_FIPS
+#define fips_md_init_ctx(alg, cx) \
+       int alg##_Init(cx##_CTX *c) \
+       { \
+       if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \
+               "Low level API call to digest " #alg " forbidden in FIPS mode!"); \
+       return private_##alg##_Init(c); \
+       } \
+       int private_##alg##_Init(cx##_CTX *c)
+#else
+#define fips_md_init_ctx(alg, cx) \
+       int alg##_Init(cx##_CTX *c)
+#endif
+
 /* BEGIN ERROR CODES */
 /* The following lines are auto generated by the script mkerr.pl. Any changes
  * made after this point may be overwritten when the script is next run.
index 292d74c188081f83ac63d3cd4fc15be42f83e512..1620eb714ac1abdf61edf867e10deb1271e719fd 100644 (file)
@@ -343,3 +343,18 @@ struct evp_pkey_method_st
        } /* EVP_PKEY_METHOD */;
 
 void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx);
+
+#ifdef OPENSSL_FIPS
+#define RIPEMD160_Init private_RIPEMD160_Init
+#define WHIRLPOOL_Init private_WHIRLPOOL_Init
+#define MD5_Init       private_MD5_Init
+#define MD4_Init       private_MD4_Init
+#define MD2_Init       private_MD2_Init
+#define MDC2_Init      private_MDC2_Init
+#define SHA_Init       private_SHA_Init
+#define SHA1_Init      private_SHA1_Init
+#define SHA224_Init    private_SHA224_Init
+#define SHA256_Init    private_SHA256_Init
+#define SHA384_Init    private_SHA384_Init
+#define SHA512_Init    private_SHA512_Init
+#endif
index 1e0b7c5b424ef615516110bae37ee89d4c654cab..6d47f61b274595fbe1c167abda1dfa81bdc31a45 100644 (file)
@@ -69,6 +69,8 @@
 #include <openssl/rsa.h>
 #endif
 
+#include "evp_locl.h"
+
 static int init(EVP_MD_CTX *ctx)
        { return MD4_Init(ctx->md_data); }
 
index 63c142119ebd76f6b06f0416f62e4b3efabc902e..9a8bae025803bcc220f6156ab24b131625000592 100644 (file)
@@ -68,6 +68,7 @@
 #ifndef OPENSSL_NO_RSA
 #include <openssl/rsa.h>
 #endif
+#include "evp_locl.h"
 
 static int init(EVP_MD_CTX *ctx)
        { return MD5_Init(ctx->md_data); }
index b08d5598039316478efb565a8854ca5655f74bee..3602bed316a45e98fe429d4a4119b730607ac7dd 100644 (file)
@@ -69,6 +69,8 @@
 #include <openssl/rsa.h>
 #endif
 
+#include "evp_locl.h"
+
 static int init(EVP_MD_CTX *ctx)
        { return MDC2_Init(ctx->md_data); }
 
index a1d60ee78d281fb643901747302b4988a3dfcea7..7bf4804cf88840bb35c48a99933726803e0dace9 100644 (file)
@@ -68,6 +68,7 @@
 #ifndef OPENSSL_NO_RSA
 #include <openssl/rsa.h>
 #endif
+#include "evp_locl.h"
 
 static int init(EVP_MD_CTX *ctx)
        { return RIPEMD160_Init(ctx->md_data); }
index acccc8f92d8e13b9cd5d50f45780f64ccc145470..8769cdd42fdae949e3e5d51f4fa78f0a08534ebe 100644 (file)
@@ -67,6 +67,7 @@
 #ifndef OPENSSL_NO_RSA
 #include <openssl/rsa.h>
 #endif
+#include "evp_locl.h"
 
 static int init(EVP_MD_CTX *ctx)
        { return SHA_Init(ctx->md_data); }
index 1ce47c040bcc01fba93c972bfbbfcd467f7324eb..c51bc2d5d1eed3f355dca8e7f7a31b3fce4a4f8c 100644 (file)
@@ -9,6 +9,7 @@
 #include <openssl/objects.h>
 #include <openssl/x509.h>
 #include <openssl/whrlpool.h>
+#include "evp_locl.h"
 
 static int init(EVP_MD_CTX *ctx)
        { return WHIRLPOOL_Init(ctx->md_data); }
index a46120e7d418b2184a7e29827862e78a59600829..d59c9f25931f37193ce961ca943acb193f12ceca 100644 (file)
@@ -81,6 +81,9 @@ typedef struct MD2state_st
        } MD2_CTX;
 
 const char *MD2_options(void);
+#ifdef OPENSSL_FIPS
+int private_MD2_Init(MD2_CTX *c);
+#endif
 int MD2_Init(MD2_CTX *c);
 int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len);
 int MD2_Final(unsigned char *md, MD2_CTX *c);
index c57b3da2880b34f4c5132b940af42e3357dcf5e8..bf89def73eb9dd5da9acb034a56b76671c39f7bd 100644 (file)
@@ -116,7 +116,7 @@ const char *MD2_options(void)
                return("md2(int)");
        }
 
-int MD2_Init(MD2_CTX *c)
+fips_md_init(MD2)
        {
        c->num=0;
        memset(c->state,0,sizeof c->state);
index c3ed9b3f75f8933fa97589d58eef52b29377a4e0..a55368a790953d98ac8d40e43cc199f0de70cd1c 100644 (file)
@@ -105,6 +105,9 @@ typedef struct MD4state_st
        unsigned int num;
        } MD4_CTX;
 
+#ifdef OPENSSL_FIPS
+int private_MD4_Init(MD4_CTX *c);
+#endif
 int MD4_Init(MD4_CTX *c);
 int MD4_Update(MD4_CTX *c, const void *data, size_t len);
 int MD4_Final(unsigned char *md, MD4_CTX *c);
index e0c42e8596387d49212d7256c6180c77f46ccaa7..82c2cb2d98a9963edf4a1f9211793b68912ebcf6 100644 (file)
@@ -57,8 +57,9 @@
  */
 
 #include <stdio.h>
-#include "md4_locl.h"
 #include <openssl/opensslv.h>
+#include <openssl/crypto.h>
+#include "md4_locl.h"
 
 const char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT;
 
@@ -70,7 +71,7 @@ const char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT;
 #define INIT_DATA_C (unsigned long)0x98badcfeL
 #define INIT_DATA_D (unsigned long)0x10325476L
 
-int MD4_Init(MD4_CTX *c)
+fips_md_init(MD4)
        {
        memset (c,0,sizeof(*c));
        c->A=INIT_DATA_A;
index 4cbf84386b32f3c5cc48fbd450ea75d3c927091d..541cc925feb0b3a7abbed5df055915380d6cadaf 100644 (file)
@@ -105,6 +105,9 @@ typedef struct MD5state_st
        unsigned int num;
        } MD5_CTX;
 
+#ifdef OPENSSL_FIPS
+int private_MD5_Init(MD5_CTX *c);
+#endif
 int MD5_Init(MD5_CTX *c);
 int MD5_Update(MD5_CTX *c, const void *data, size_t len);
 int MD5_Final(unsigned char *md, MD5_CTX *c);
index beace632e3a12593345260daa6500eceee20a325..265890de52bac366de086870ff2121b942128d75 100644 (file)
@@ -59,6 +59,7 @@
 #include <stdio.h>
 #include "md5_locl.h"
 #include <openssl/opensslv.h>
+#include <openssl/crypto.h>
 
 const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT;
 
@@ -70,7 +71,7 @@ const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT;
 #define INIT_DATA_C (unsigned long)0x98badcfeL
 #define INIT_DATA_D (unsigned long)0x10325476L
 
-int MD5_Init(MD5_CTX *c)
+fips_md_init(MD5)
        {
        memset (c,0,sizeof(*c));
        c->A=INIT_DATA_A;
index 72778a521236aed7dcb4b0f7bbe7dcd68ff3e1a2..f3e8e579d2374f01743b9363444f790a6e8c2f00 100644 (file)
@@ -81,6 +81,9 @@ typedef struct mdc2_ctx_st
        } MDC2_CTX;
 
 
+#ifdef OPENSSL_FIPS
+int private_MDC2_Init(MDC2_CTX *c);
+#endif
 int MDC2_Init(MDC2_CTX *c);
 int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len);
 int MDC2_Final(unsigned char *md, MDC2_CTX *c);
index 4aa406edc3bab41e2dc9d46db2879b392a6c0b20..b74bb1a759444268e88a22d0b76f0cd39cc61a68 100644 (file)
@@ -61,6 +61,7 @@
 #include <string.h>
 #include <openssl/des.h>
 #include <openssl/mdc2.h>
+#include <openssl/crypto.h>
 
 #undef c2l
 #define c2l(c,l)       (l =((DES_LONG)(*((c)++)))    , \
@@ -75,7 +76,7 @@
                        *((c)++)=(unsigned char)(((l)>>24L)&0xff))
 
 static void mdc2_body(MDC2_CTX *c, const unsigned char *in, size_t len);
-int MDC2_Init(MDC2_CTX *c)
+fips_md_init(MDC2)
        {
        c->num=0;
        c->pad_type=1;
index 5942eb61808fe2ccdf9fbe4f3238271e55451567..189bd8c90e92bcfcbb7c4c9730707acf49da7c3b 100644 (file)
@@ -91,6 +91,9 @@ typedef struct RIPEMD160state_st
        unsigned int   num;
        } RIPEMD160_CTX;
 
+#ifdef OPENSSL_FIPS
+int private_RIPEMD160_Init(RIPEMD160_CTX *c);
+#endif
 int RIPEMD160_Init(RIPEMD160_CTX *c);
 int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len);
 int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c);
index 59b017f8c0a7f8fa3fb944db91cb6998c3712274..63f0d983f7b4f0535904bbde0209e0c3ded39703 100644 (file)
@@ -59,6 +59,7 @@
 #include <stdio.h>
 #include "rmd_locl.h"
 #include <openssl/opensslv.h>
+#include <openssl/crypto.h>
 
 const char RMD160_version[]="RIPE-MD160" OPENSSL_VERSION_PTEXT;
 
@@ -69,7 +70,7 @@ const char RMD160_version[]="RIPE-MD160" OPENSSL_VERSION_PTEXT;
      void ripemd160_block(RIPEMD160_CTX *c, unsigned long *p,size_t num);
 #  endif
 
-int RIPEMD160_Init(RIPEMD160_CTX *c)
+fips_md_init(RIPEMD160)
        {
        memset (c,0,sizeof(*c));
        c->A=RIPEMD160_A;
index 16cacf9fc01b2733e337493864769ec11e16478f..8a6bf4bbbb1dbef37869fc162ce1c2cacfebeb1d 100644 (file)
@@ -106,6 +106,9 @@ typedef struct SHAstate_st
        } SHA_CTX;
 
 #ifndef OPENSSL_NO_SHA0
+#ifdef OPENSSL_FIPS
+int private_SHA_Init(SHA_CTX *c);
+#endif
 int SHA_Init(SHA_CTX *c);
 int SHA_Update(SHA_CTX *c, const void *data, size_t len);
 int SHA_Final(unsigned char *md, SHA_CTX *c);
@@ -113,6 +116,9 @@ unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);
 void SHA_Transform(SHA_CTX *c, const unsigned char *data);
 #endif
 #ifndef OPENSSL_NO_SHA1
+#ifdef OPENSSL_FIPS
+int private_SHA1_Init(SHA_CTX *c);
+#endif
 int SHA1_Init(SHA_CTX *c);
 int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
 int SHA1_Final(unsigned char *md, SHA_CTX *c);
@@ -135,6 +141,10 @@ typedef struct SHA256state_st
        } SHA256_CTX;
 
 #ifndef OPENSSL_NO_SHA256
+#ifdef OPENSSL_FIPS
+int private_SHA224_Init(SHA256_CTX *c);
+int private_SHA256_Init(SHA256_CTX *c);
+#endif
 int SHA224_Init(SHA256_CTX *c);
 int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
 int SHA224_Final(unsigned char *md, SHA256_CTX *c);
@@ -182,6 +192,10 @@ typedef struct SHA512state_st
 #endif
 
 #ifndef OPENSSL_NO_SHA512
+#ifdef OPENSSL_FIPS
+int private_SHA384_Init(SHA512_CTX *c);
+int private_SHA512_Init(SHA512_CTX *c);
+#endif
 int SHA384_Init(SHA512_CTX *c);
 int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
 int SHA384_Final(unsigned char *md, SHA512_CTX *c);
index 50d1925cdeb261887d2926140e53fe9cbf4387bd..81219af08834830ccb02b313336e7e61be253cdd 100644 (file)
@@ -57,6 +57,7 @@
  */
 
 #include <openssl/opensslconf.h>
+#include <openssl/crypto.h>
 #if !defined(OPENSSL_NO_SHA1) && !defined(OPENSSL_NO_SHA)
 
 #undef  SHA_0
index 8952d87673b6f9c37ab5404f7b5f98fc05aaaefc..f88d3d6dadbab77b76ba8e047ea4eb7903a7e80d 100644 (file)
@@ -16,7 +16,7 @@
 
 const char SHA256_version[]="SHA-256" OPENSSL_VERSION_PTEXT;
 
-int SHA224_Init (SHA256_CTX *c)
+fips_md_init_ctx(SHA224, SHA256)
        {
        memset (c,0,sizeof(*c));
        c->h[0]=0xc1059ed8UL;   c->h[1]=0x367cd507UL;
@@ -27,7 +27,7 @@ int SHA224_Init (SHA256_CTX *c)
        return 1;
        }
 
-int SHA256_Init (SHA256_CTX *c)
+fips_md_init(SHA256)
        {
        memset (c,0,sizeof(*c));
        c->h[0]=0x6a09e667UL;   c->h[1]=0xbb67ae85UL;
index cbc0e58c48865a4318daeae1c35a2121d501e418..8b13e6ca1871ef09989b71e00be5cc0258e15a6e 100644 (file)
@@ -59,7 +59,7 @@ const char SHA512_version[]="SHA-512" OPENSSL_VERSION_PTEXT;
 #define SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
 #endif
 
-int SHA384_Init (SHA512_CTX *c)
+fips_md_init_ctx(SHA384, SHA512)
        {
 #if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm))
        /* maintain dword order required by assembler module */
@@ -88,7 +88,7 @@ int SHA384_Init (SHA512_CTX *c)
         return 1;
        }
 
-int SHA512_Init (SHA512_CTX *c)
+fips_md_init(SHA512)
        {
 #if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm))
        /* maintain dword order required by assembler module */
index 70eb56032c38a4b4c3b792ab504413d14d546a55..c946ad827d586e121e2dd01de38b1fb48addbd17 100644 (file)
@@ -57,6 +57,7 @@
  */
 
 #include <openssl/opensslconf.h>
+#include <openssl/crypto.h>
 #if !defined(OPENSSL_NO_SHA0) && !defined(OPENSSL_NO_SHA)
 
 #undef  SHA_1
index 672c26eee1c685033827467c1c939ec750fe951d..7a0c3ca8d8ced28d743f0fd4ab4af6878128c99f 100644 (file)
@@ -122,7 +122,11 @@ void sha1_block_data_order (SHA_CTX *c, const void *p,size_t num);
 #define INIT_DATA_h3 0x10325476UL
 #define INIT_DATA_h4 0xc3d2e1f0UL
 
-int HASH_INIT (SHA_CTX *c)
+#ifdef SHA_0
+fips_md_init(SHA)
+#else
+fips_md_init_ctx(SHA1, SHA)
+#endif
        {
        memset (c,0,sizeof(*c));
        c->h0=INIT_DATA_h0;
index 03c91da1155b3ccebd7b92505af928527c3cbe3c..9e01f5b076631ce13366c9727f08ef1b7b9a1664 100644 (file)
@@ -24,6 +24,9 @@ typedef struct        {
        } WHIRLPOOL_CTX;
 
 #ifndef OPENSSL_NO_WHIRLPOOL
+#ifdef OPENSSL_FIPS
+int private_WHIRLPOOL_Init(WHIRLPOOL_CTX *c);
+#endif
 int WHIRLPOOL_Init     (WHIRLPOOL_CTX *c);
 int WHIRLPOOL_Update   (WHIRLPOOL_CTX *c,const void *inp,size_t bytes);
 void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c,const void *inp,size_t bits);
index ee5c5c1bf3a80549ff1ce02f02aa58b98d3aa20e..7e28bef51d0a749755c4bb3433073214acd35526 100644 (file)
  */
 
 #include "wp_locl.h"
+#include <openssl/crypto.h>
 #include <string.h>
 
-int WHIRLPOOL_Init     (WHIRLPOOL_CTX *c)
+fips_md_init(WHIRLPOOL)
        {
        memset (c,0,sizeof(*c));
        return(1);