1*e7b1675dSTing-Kang Chang // Copyright 2021 Google LLC 2*e7b1675dSTing-Kang Chang // 3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License"); 4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License. 5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at 6*e7b1675dSTing-Kang Chang // 7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0 8*e7b1675dSTing-Kang Chang // 9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software 10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS, 11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and 13*e7b1675dSTing-Kang Chang // limitations under the License. 14*e7b1675dSTing-Kang Chang // 15*e7b1675dSTing-Kang Chang /////////////////////////////////////////////////////////////////////////////// 16*e7b1675dSTing-Kang Chang 17*e7b1675dSTing-Kang Chang #ifndef TINK_INTERNAL_FIPS_UTILS_H_ 18*e7b1675dSTing-Kang Chang #define TINK_INTERNAL_FIPS_UTILS_H_ 19*e7b1675dSTing-Kang Chang 20*e7b1675dSTing-Kang Chang #include "absl/base/attributes.h" 21*e7b1675dSTing-Kang Chang #include "tink/util/status.h" 22*e7b1675dSTing-Kang Chang 23*e7b1675dSTing-Kang Chang namespace crypto { 24*e7b1675dSTing-Kang Chang namespace tink { 25*e7b1675dSTing-Kang Chang namespace internal { 26*e7b1675dSTing-Kang Chang 27*e7b1675dSTing-Kang Chang // This flag indicates whether Tink was build in FIPS only mode. If the flag 28*e7b1675dSTing-Kang Chang // is set, then usage of algorithms will be restricted to algorithms which 29*e7b1675dSTing-Kang Chang // utilize the FIPS validated BoringCrypto module. TODO(kste): Check if this can 30*e7b1675dSTing-Kang Chang // be removed. 31*e7b1675dSTing-Kang Chang ABSL_CONST_INIT extern const bool kUseOnlyFips; 32*e7b1675dSTing-Kang Chang 33*e7b1675dSTing-Kang Chang // This function will return true if Tink has been built in FIPS mode or if 34*e7b1675dSTing-Kang Chang // the FIPS restrictions have been enabled at runtime. 35*e7b1675dSTing-Kang Chang bool IsFipsModeEnabled(); 36*e7b1675dSTing-Kang Chang 37*e7b1675dSTing-Kang Chang // Returns true if the Ssl layer (BoringSSL or OpenSSL) has FIPS mode enabled. 38*e7b1675dSTing-Kang Chang bool IsFipsEnabledInSsl(); 39*e7b1675dSTing-Kang Chang 40*e7b1675dSTing-Kang Chang // Enable FIPS restrictions. If Tink has been built in FIPS mode this is 41*e7b1675dSTing-Kang Chang // redundant. 42*e7b1675dSTing-Kang Chang void SetFipsRestricted(); 43*e7b1675dSTing-Kang Chang 44*e7b1675dSTing-Kang Chang // Disable FIPS restrictions. Note that if Tink has been built in FIPS mode this 45*e7b1675dSTing-Kang Chang // will have no effect. 46*e7b1675dSTing-Kang Chang void UnSetFipsRestricted(); 47*e7b1675dSTing-Kang Chang 48*e7b1675dSTing-Kang Chang // Should be used to indicate whether an algorithm can be used in FIPS only 49*e7b1675dSTing-Kang Chang // mode or not. 50*e7b1675dSTing-Kang Chang enum class FipsCompatibility { 51*e7b1675dSTing-Kang Chang kNotFips = 0, // The algorithm can not use a FIPS validated implementation. 52*e7b1675dSTing-Kang Chang kRequiresBoringCrypto, // The algorithm requires BoringCrypto to use a FIPS 53*e7b1675dSTing-Kang Chang // validated implementation. 54*e7b1675dSTing-Kang Chang }; 55*e7b1675dSTing-Kang Chang 56*e7b1675dSTing-Kang Chang // Allows to check for a cryptographic algorithm whether it is available in 57*e7b1675dSTing-Kang Chang // the FIPS only mode, based on it's FipsCompatibility flag. If FIPS only 58*e7b1675dSTing-Kang Chang // mode is enabled this will return an INTERNAL error if: 59*e7b1675dSTing-Kang Chang // 1) The algorithm has no FIPS support. 60*e7b1675dSTing-Kang Chang // 2) The algorithm has FIPS support, but BoringSSL has not been compiled with 61*e7b1675dSTing-Kang Chang // the BoringCrypto module. 62*e7b1675dSTing-Kang Chang crypto::tink::util::Status ChecksFipsCompatibility( 63*e7b1675dSTing-Kang Chang FipsCompatibility fips_status); 64*e7b1675dSTing-Kang Chang 65*e7b1675dSTing-Kang Chang // Utility function wich calls CheckFipsCompatibility(T::kFipsStatus). 66*e7b1675dSTing-Kang Chang template <class T> CheckFipsCompatibility()67*e7b1675dSTing-Kang Changcrypto::tink::util::Status CheckFipsCompatibility() { 68*e7b1675dSTing-Kang Chang return ChecksFipsCompatibility(T::kFipsStatus); 69*e7b1675dSTing-Kang Chang } 70*e7b1675dSTing-Kang Chang 71*e7b1675dSTing-Kang Chang 72*e7b1675dSTing-Kang Chang } // namespace internal 73*e7b1675dSTing-Kang Chang } // namespace tink 74*e7b1675dSTing-Kang Chang } // namespace crypto 75*e7b1675dSTing-Kang Chang 76*e7b1675dSTing-Kang Chang #endif // TINK_INTERNAL_FIPS_UTILS_H_ 77