-#define AES_cfb128_encrypt FIPS_aes_cfb128_encrypt
-#define AES_cfb1_encrypt FIPS_aes_cfb1_encrypt
-#define AES_cfb8_encrypt FIPS_aes_cfb8_encrypt
-#define AES_ecb_encrypt FIPS_aes_ecb_encrypt
-#define AES_ofb128_encrypt FIPS_aes_ofb128_encrypt
-#define BN_BLINDING_convert FIPS_bn_blinding_convert
-#define BN_BLINDING_convert_ex FIPS_bn_blinding_convert_ex
-#define BN_BLINDING_create_param FIPS_bn_blinding_create_param
-#define BN_BLINDING_free FIPS_bn_blinding_free
-#define BN_BLINDING_get_flags FIPS_bn_blinding_get_flags
-#define BN_BLINDING_invert FIPS_bn_blinding_invert
-#define BN_BLINDING_invert_ex FIPS_bn_blinding_invert_ex
-#define BN_BLINDING_new FIPS_bn_blinding_new
-#define BN_BLINDING_set_flags FIPS_bn_blinding_set_flags
-#define BN_BLINDING_thread_id FIPS_bn_blinding_thread_id
-#define BN_BLINDING_update FIPS_bn_blinding_update
-#define BN_BLINDING_get_thread_id FIPS_bn_blinding_get_thread_id
-#define BN_BLINDING_set_thread_id FIPS_bn_blinding_set_thread_id
-#define BN_CTX_end FIPS_bn_ctx_end
-#define BN_CTX_init FIPS_bn_ctx_init
-#define BN_CTX_free FIPS_bn_ctx_free
-#define BN_CTX_get FIPS_bn_ctx_get
-#define BN_CTX_new FIPS_bn_ctx_new
-#define BN_CTX_start FIPS_bn_ctx_start
-#define BN_GENCB_call FIPS_bn_gencb_call
-#define BN_GF2m_add FIPS_bn_gf2m_add
-#define BN_GF2m_arr2poly FIPS_bn_gf2m_arr2poly
-#define BN_GF2m_mod FIPS_bn_gf2m_mod
-#define BN_GF2m_mod_arr FIPS_bn_gf2m_mod_arr
-#define BN_GF2m_mod_div FIPS_bn_gf2m_mod_div
-#define BN_GF2m_mod_div_arr FIPS_bn_gf2m_mod_div_arr
-#define BN_GF2m_mod_exp FIPS_bn_gf2m_mod_exp
-#define BN_GF2m_mod_exp_arr FIPS_bn_gf2m_mod_exp_arr
-#define BN_GF2m_mod_inv FIPS_bn_gf2m_mod_inv
-#define BN_GF2m_mod_inv_arr FIPS_bn_gf2m_mod_inv_arr
-#define BN_GF2m_mod_mul FIPS_bn_gf2m_mod_mul
-#define BN_GF2m_mod_mul_arr FIPS_bn_gf2m_mod_mul_arr
-#define BN_GF2m_mod_solve_quad FIPS_bn_gf2m_mod_solve_quad
-#define BN_GF2m_mod_solve_quad_arr FIPS_bn_gf2m_mod_solve_quad_arr
-#define BN_GF2m_mod_sqr FIPS_bn_gf2m_mod_sqr
-#define BN_GF2m_mod_sqr_arr FIPS_bn_gf2m_mod_sqr_arr
-#define BN_GF2m_mod_sqrt FIPS_bn_gf2m_mod_sqrt
-#define BN_GF2m_mod_sqrt_arr FIPS_bn_gf2m_mod_sqrt_arr
-#define BN_GF2m_poly2arr FIPS_bn_gf2m_poly2arr
-#define BN_MONT_CTX_copy FIPS_bn_mont_ctx_copy
-#define BN_MONT_CTX_free FIPS_bn_mont_ctx_free
-#define BN_MONT_CTX_init FIPS_bn_mont_ctx_init
-#define BN_MONT_CTX_new FIPS_bn_mont_ctx_new
-#define BN_MONT_CTX_set FIPS_bn_mont_ctx_set
-#define BN_MONT_CTX_set_locked FIPS_bn_mont_ctx_set_locked
-#define BN_RECP_CTX_free FIPS_bn_recp_ctx_free
-#define BN_RECP_CTX_init FIPS_bn_recp_ctx_init
-#define BN_RECP_CTX_new FIPS_bn_recp_ctx_new
-#define BN_RECP_CTX_set FIPS_bn_recp_ctx_set
+
+/* Where necessary redirect standard OpenSSL APIs to FIPS versions */
+
+#define CRYPTO_lock FIPS_lock
+#define CRYPTO_add_lock FIPS_add_lock
+#define CRYPTO_malloc FIPS_malloc
+#define CRYPTO_free FIPS_free
+
+#define ERR_put_error FIPS_put_error
+#define ERR_add_error_data FIPS_add_error_data
+
+#define EVP_MD_CTX_init FIPS_md_ctx_init
+#define EVP_MD_CTX_cleanup FIPS_md_ctx_cleanup
+#define EVP_MD_CTX_create FIPS_md_ctx_create
+#define EVP_MD_CTX_destroy FIPS_md_ctx_destroy
+#define EVP_DigestInit_ex(ctx, type, impl) FIPS_digestinit(ctx, type)
+#define EVP_DigestInit FIPS_digestinit
+#define EVP_DigestUpdate FIPS_digestupdate
+#define EVP_Digest(data, count, md, size, type, impl) \
+ FIPS_digest(data, count, md, size, type)
+#define EVP_DigestFinal_ex FIPS_digestfinal
+#define EVP_MD_CTX_copy_ex FIPS_md_ctx_copy
+
+#define EVP_CipherInit_ex(ctx, cipher, impl, key, iv, enc) \
+ FIPS_cipherinit(ctx, cipher, key, iv, enc)
+
+#define EVP_CipherInit FIPS_cipherinit
+
+#define EVP_CIPHER_CTX_init FIPS_cipher_ctx_init
+#define EVP_CIPHER_CTX_cleanup FIPS_cipher_ctx_cleanup
+#define EVP_Cipher FIPS_cipher
+#define EVP_CIPHER_CTX_ctrl FIPS_cipher_ctx_ctrl
+#define EVP_CIPHER_CTX_new FIPS_cipher_ctx_new
+#define EVP_CIPHER_CTX_free FIPS_cipher_ctx_free
+#define EVP_CIPHER_CTX_copy FIPS_cipher_ctx_copy
+#define EVP_CIPHER_CTX_set_key_length FIPS_cipher_ctx_set_key_length
+
+#define DSA_SIG_new FIPS_dsa_sig_new
+#define DSA_SIG_free FIPS_dsa_sig_free
+
+#define ECDSA_SIG_new FIPS_ecdsa_sig_new
+#define ECDSA_SIG_free FIPS_ecdsa_sig_free
+
+#define ecdsa_check fips_ecdsa_check
+#define ecdh_check fips_ecdh_check
+
+#define RAND_bytes FIPS_rand_bytes
+#define RAND_pseudo_bytes FIPS_rand_pseudo_bytes
+#define RAND_add FIPS_rand_add
+#define RAND_seed FIPS_rand_seed
+#define RAND_status FIPS_rand_status
+
+/* Rename symbols so they don't clash with standard OpenSSL */
+
+#define AES_cfb128_encrypt fips_aes_cfb128_encrypt
+#define AES_cfb1_encrypt fips_aes_cfb1_encrypt
+#define AES_cfb8_encrypt fips_aes_cfb8_encrypt
+#define AES_ecb_encrypt fips_aes_ecb_encrypt
+#define AES_ofb128_encrypt fips_aes_ofb128_encrypt
+#define BN_BLINDING_convert fips_bn_blinding_convert
+#define BN_BLINDING_convert_ex fips_bn_blinding_convert_ex
+#define BN_BLINDING_create_param fips_bn_blinding_create_param
+#define BN_BLINDING_free fips_bn_blinding_free
+#define BN_BLINDING_get_flags fips_bn_blinding_get_flags
+#define BN_BLINDING_invert fips_bn_blinding_invert
+#define BN_BLINDING_invert_ex fips_bn_blinding_invert_ex
+#define BN_BLINDING_new fips_bn_blinding_new
+#define BN_BLINDING_set_flags fips_bn_blinding_set_flags
+#define BN_BLINDING_thread_id fips_bn_blinding_thread_id
+#define BN_BLINDING_update fips_bn_blinding_update
+#define BN_BLINDING_get_thread_id fips_bn_blinding_get_thread_id
+#define BN_BLINDING_set_thread_id fips_bn_blinding_set_thread_id
+#define BN_CTX_end fips_bn_ctx_end
+#define BN_CTX_init fips_bn_ctx_init
+#define BN_CTX_free fips_bn_ctx_free
+#define BN_CTX_get fips_bn_ctx_get
+#define BN_CTX_new fips_bn_ctx_new
+#define BN_CTX_start fips_bn_ctx_start
+#define BN_GENCB_call fips_bn_gencb_call
+#define BN_GF2m_add fips_bn_gf2m_add
+#define BN_GF2m_arr2poly fips_bn_gf2m_arr2poly
+#define BN_GF2m_mod fips_bn_gf2m_mod
+#define BN_GF2m_mod_arr fips_bn_gf2m_mod_arr
+#define BN_GF2m_mod_div fips_bn_gf2m_mod_div
+#define BN_GF2m_mod_div_arr fips_bn_gf2m_mod_div_arr
+#define BN_GF2m_mod_exp fips_bn_gf2m_mod_exp
+#define BN_GF2m_mod_exp_arr fips_bn_gf2m_mod_exp_arr
+#define BN_GF2m_mod_inv fips_bn_gf2m_mod_inv
+#define BN_GF2m_mod_inv_arr fips_bn_gf2m_mod_inv_arr
+#define BN_GF2m_mod_mul fips_bn_gf2m_mod_mul
+#define BN_GF2m_mod_mul_arr fips_bn_gf2m_mod_mul_arr
+#define BN_GF2m_mod_solve_quad fips_bn_gf2m_mod_solve_quad
+#define BN_GF2m_mod_solve_quad_arr fips_bn_gf2m_mod_solve_quad_arr
+#define BN_GF2m_mod_sqr fips_bn_gf2m_mod_sqr
+#define BN_GF2m_mod_sqr_arr fips_bn_gf2m_mod_sqr_arr
+#define BN_GF2m_mod_sqrt fips_bn_gf2m_mod_sqrt
+#define BN_GF2m_mod_sqrt_arr fips_bn_gf2m_mod_sqrt_arr
+#define BN_GF2m_poly2arr fips_bn_gf2m_poly2arr
+#define BN_MONT_CTX_copy fips_bn_mont_ctx_copy
+#define BN_MONT_CTX_free fips_bn_mont_ctx_free
+#define BN_MONT_CTX_init fips_bn_mont_ctx_init
+#define BN_MONT_CTX_new fips_bn_mont_ctx_new
+#define BN_MONT_CTX_set fips_bn_mont_ctx_set
+#define BN_MONT_CTX_set_locked fips_bn_mont_ctx_set_locked
+#define BN_RECP_CTX_free fips_bn_recp_ctx_free
+#define BN_RECP_CTX_init fips_bn_recp_ctx_init
+#define BN_RECP_CTX_new fips_bn_recp_ctx_new
+#define BN_RECP_CTX_set fips_bn_recp_ctx_set