| 1 | // fips140.h - written and placed in the public domain by Wei Dai |
|---|
| 2 | |
|---|
| 3 | //! \file fips140.h |
|---|
| 4 | //! \brief Classes and functions for the FIPS 140-2 validated library |
|---|
| 5 | //! \details The FIPS validated library is only available on Windows as a DLL. Once compiled, |
|---|
| 6 | //! the library is always in FIPS mode contingent upon successful execution of |
|---|
| 7 | //! DoPowerUpSelfTest() or DoDllPowerUpSelfTest(). |
|---|
| 8 | //! \sa <A HREF="http://cryptopp.com/wiki/Visual_Studio">Visual Studio</A> and |
|---|
| 9 | //! <A HREF="http://cryptopp.com/wiki/config.h">config.h</A> on the Crypto++ wiki. |
|---|
| 10 | |
|---|
| 11 | #ifndef CRYPTOPP_FIPS140_H |
|---|
| 12 | #define CRYPTOPP_FIPS140_H |
|---|
| 13 | |
|---|
| 14 | #include "cryptlib.h" |
|---|
| 15 | #include "secblock.h" |
|---|
| 16 | |
|---|
| 17 | NAMESPACE_BEGIN(CryptoPP) |
|---|
| 18 | |
|---|
| 19 | //! \class SelfTestFailure |
|---|
| 20 | //! Exception thrown when a crypto algorithm is used after a self test fails |
|---|
| 21 | //! \details The self tests for an algorithm are performed by Algortihm class |
|---|
| 22 | //! when CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2 is defined. |
|---|
| 23 | class CRYPTOPP_DLL SelfTestFailure : public Exception |
|---|
| 24 | { |
|---|
| 25 | public: |
|---|
| 26 | explicit SelfTestFailure(const std::string &s) : Exception(OTHER_ERROR, s) {} |
|---|
| 27 | }; |
|---|
| 28 | |
|---|
| 29 | //! \brief Determines whether the library provides FIPS validated cryptography |
|---|
| 30 | //! \returns true if FIPS 140-2 validated features were enabled at compile time. |
|---|
| 31 | //! \details true if FIPS 140-2 validated features were enabled at compile time, |
|---|
| 32 | //! false otherwise. |
|---|
| 33 | //! \note FIPS mode is enabled at compile time. A program or other module cannot |
|---|
| 34 | //! arbitrarily enter or exit the mode. |
|---|
| 35 | CRYPTOPP_DLL bool CRYPTOPP_API FIPS_140_2_ComplianceEnabled(); |
|---|
| 36 | |
|---|
| 37 | //! \brief Status of the power-up self test |
|---|
| 38 | enum PowerUpSelfTestStatus { |
|---|
| 39 | |
|---|
| 40 | //! \brief The self tests have not been performed. |
|---|
| 41 | POWER_UP_SELF_TEST_NOT_DONE, |
|---|
| 42 | //! \brief The self tests were executed via DoPowerUpSelfTest() or |
|---|
| 43 | //! DoDllPowerUpSelfTest(), but the result was failure. |
|---|
| 44 | POWER_UP_SELF_TEST_FAILED, |
|---|
| 45 | //! \brief The self tests were executed via DoPowerUpSelfTest() or |
|---|
| 46 | //! DoDllPowerUpSelfTest(), and the result was success. |
|---|
| 47 | POWER_UP_SELF_TEST_PASSED |
|---|
| 48 | }; |
|---|
| 49 | |
|---|
| 50 | //! \brief Performs the power-up self test |
|---|
| 51 | //! \param moduleFilename the fully qualified name of the module |
|---|
| 52 | //! \param expectedModuleMac the expected MAC of the components protected by the integrity check |
|---|
| 53 | //! \details Performs the power-up self test, and sets the self test status to |
|---|
| 54 | //! POWER_UP_SELF_TEST_PASSED or POWER_UP_SELF_TEST_FAILED. |
|---|
| 55 | //! \details The self tests for an algorithm are performed by the Algortihm class |
|---|
| 56 | //! when CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2 is defined. |
|---|
| 57 | CRYPTOPP_DLL void CRYPTOPP_API DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac); |
|---|
| 58 | |
|---|
| 59 | //! \brief Performs the power-up self test on the DLL |
|---|
| 60 | //! \details Performs the power-up self test using the filename of this DLL and the |
|---|
| 61 | //! embedded module MAC, and sets the self test status to POWER_UP_SELF_TEST_PASSED or |
|---|
| 62 | //! POWER_UP_SELF_TEST_FAILED. |
|---|
| 63 | //! \details The self tests for an algorithm are performed by the Algortihm class |
|---|
| 64 | //! when CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2 is defined. |
|---|
| 65 | CRYPTOPP_DLL void CRYPTOPP_API DoDllPowerUpSelfTest(); |
|---|
| 66 | |
|---|
| 67 | //! \brief Sets the power-up self test status to POWER_UP_SELF_TEST_FAILED |
|---|
| 68 | //! \details Sets the power-up self test status to POWER_UP_SELF_TEST_FAILED to simulate failure. |
|---|
| 69 | CRYPTOPP_DLL void CRYPTOPP_API SimulatePowerUpSelfTestFailure(); |
|---|
| 70 | |
|---|
| 71 | //! \brief Provides the current power-up self test status |
|---|
| 72 | //! \returns the current power-up self test status |
|---|
| 73 | CRYPTOPP_DLL PowerUpSelfTestStatus CRYPTOPP_API GetPowerUpSelfTestStatus(); |
|---|
| 74 | |
|---|
| 75 | #ifndef CRYPTOPP_DOXYGEN_PROCESSING |
|---|
| 76 | typedef PowerUpSelfTestStatus (CRYPTOPP_API * PGetPowerUpSelfTestStatus)(); |
|---|
| 77 | #endif |
|---|
| 78 | |
|---|
| 79 | //! \brief Class object that calculates the MAC on the module |
|---|
| 80 | //! \returns the MAC for the module |
|---|
| 81 | CRYPTOPP_DLL MessageAuthenticationCode * CRYPTOPP_API NewIntegrityCheckingMAC(); |
|---|
| 82 | |
|---|
| 83 | //! \brief Verifies the MAC on the module |
|---|
| 84 | //! \param moduleFilename the fully qualified name of the module |
|---|
| 85 | //! \param expectedModuleMac the expected MAC of the components protected by the integrity check |
|---|
| 86 | //! \param pActualMac the actual MAC of the components calculated by the integrity check |
|---|
| 87 | //! \param pMacFileLocation the offest of the MAC in the PE/PE+ module |
|---|
| 88 | //! \returns true if the MAC is valid, false otherwise |
|---|
| 89 | CRYPTOPP_DLL bool CRYPTOPP_API IntegrityCheckModule(const char *moduleFilename, const byte *expectedModuleMac, SecByteBlock *pActualMac = NULL, unsigned long *pMacFileLocation = NULL); |
|---|
| 90 | |
|---|
| 91 | #ifndef CRYPTOPP_DOXYGEN_PROCESSING |
|---|
| 92 | // this is used by Algorithm constructor to allow Algorithm objects to be constructed for the self test |
|---|
| 93 | bool PowerUpSelfTestInProgressOnThisThread(); |
|---|
| 94 | |
|---|
| 95 | void SetPowerUpSelfTestInProgressOnThisThread(bool inProgress); |
|---|
| 96 | |
|---|
| 97 | void SignaturePairwiseConsistencyTest(const PK_Signer &signer, const PK_Verifier &verifier); |
|---|
| 98 | void EncryptionPairwiseConsistencyTest(const PK_Encryptor &encryptor, const PK_Decryptor &decryptor); |
|---|
| 99 | |
|---|
| 100 | void SignaturePairwiseConsistencyTest_FIPS_140_Only(const PK_Signer &signer, const PK_Verifier &verifier); |
|---|
| 101 | void EncryptionPairwiseConsistencyTest_FIPS_140_Only(const PK_Encryptor &encryptor, const PK_Decryptor &decryptor); |
|---|
| 102 | #endif |
|---|
| 103 | |
|---|
| 104 | //! \brief The placeholder used prior to embedding the actual MAC in the module. |
|---|
| 105 | //! \details After the DLL is built but before it is MAC'd, the string CRYPTOPP_DUMMY_DLL_MAC |
|---|
| 106 | //! is used as a placeholder for the actual MAC. A post-build step is performed which calculates |
|---|
| 107 | //! the MAC of the DLL and embeds it in the module. The actual MAC is written by the |
|---|
| 108 | //! <tt>cryptest.exe</tt> program using the <tt>mac_dll</tt> subcommand. |
|---|
| 109 | #define CRYPTOPP_DUMMY_DLL_MAC "MAC_51f34b8db820ae8" |
|---|
| 110 | |
|---|
| 111 | NAMESPACE_END |
|---|
| 112 | |
|---|
| 113 | #endif |
|---|