#include <gnutls/fips140.h>
#include <dlfcn.h>
+unsigned int _gnutls_lib_mode = LIB_STATE_POWERON;
#ifdef ENABLE_FIPS140
#define FIPS_KERNEL_FILE "/proc/sys/crypto/fips_enabled"
#define FIPS_SYSTEM_FILE "/etc/system-fips"
-unsigned int _gnutls_fips_mode = FIPS_STATE_POWERON;
-
unsigned _gnutls_fips_mode_enabled(void)
{
unsigned f1p, f2p;
if (f2p != 0) {
/* a funny state where self tests are performed
* and ignored */
- _gnutls_switch_fips_state(FIPS_STATE_ZOMBIE);
+ _gnutls_switch_lib_state(LIB_STATE_ZOMBIE);
_gnutls_debug_log("FIPS140-2 ZOMBIE mode enabled\n");
return 2;
}
return gnutls_assert_val(0);
}
- prev = _gnutls_get_fips_state();
- _gnutls_switch_fips_state(FIPS_STATE_OPERATIONAL);
+ prev = _gnutls_get_lib_state();
+ _gnutls_switch_lib_state(LIB_STATE_OPERATIONAL);
ret = gnutls_hmac_fast(HMAC_ALGO, fips_key, sizeof(fips_key)-1,
data.data, data.size, new_hmac);
- _gnutls_switch_fips_state(prev);
+ _gnutls_switch_lib_state(prev);
gnutls_free(data.data);
{
int ret;
- _gnutls_switch_fips_state(FIPS_STATE_SELFTEST);
+ _gnutls_switch_lib_state(LIB_STATE_SELFTEST);
/* Tests the FIPS algorithms */
return 0;
error:
- _gnutls_switch_fips_state(FIPS_STATE_ERROR);
+ _gnutls_switch_lib_state(LIB_STATE_ERROR);
_gnutls_audit_log(NULL, "FIPS140-2 self testing failed\n");
return GNUTLS_E_SELF_TEST_ERROR;
void _gnutls_fips140_simulate_error(void)
{
-#ifdef ENABLE_FIPS140
- _gnutls_switch_fips_state(FIPS_STATE_ERROR);
-#endif
+ _gnutls_switch_lib_state(LIB_STATE_ERROR);
}
#define FIPS140_RND_KEY_SIZE 32
typedef enum {
- FIPS_STATE_POWERON,
- FIPS_STATE_ZOMBIE,
- FIPS_STATE_INIT,
- FIPS_STATE_SELFTEST,
- FIPS_STATE_OPERATIONAL,
- FIPS_STATE_ERROR,
- FIPS_STATE_SHUTDOWN
-} gnutls_fips_state_t;
-
-#ifdef ENABLE_FIPS140
+ LIB_STATE_POWERON,
+ LIB_STATE_ZOMBIE,
+ LIB_STATE_INIT,
+ LIB_STATE_SELFTEST,
+ LIB_STATE_OPERATIONAL,
+ LIB_STATE_ERROR,
+ LIB_STATE_SHUTDOWN
+} gnutls_lib_state_t;
/* do not access directly */
-extern unsigned int _gnutls_fips_mode;
+extern unsigned int _gnutls_lib_mode;
inline static
-void _gnutls_switch_fips_state(gnutls_fips_state_t state)
+void _gnutls_switch_lib_state(gnutls_lib_state_t state)
{
/* Once into zombie state no errors can change us */
- if (_gnutls_fips_mode != FIPS_STATE_ZOMBIE)
- _gnutls_fips_mode = state;
+ if (_gnutls_lib_mode != LIB_STATE_ZOMBIE)
+ _gnutls_lib_mode = state;
}
-inline static gnutls_fips_state_t _gnutls_get_fips_state(void)
+inline static gnutls_lib_state_t _gnutls_get_lib_state(void)
{
- return _gnutls_fips_mode;
+ return _gnutls_lib_mode;
}
int _gnutls_fips_perform_self_checks(void);
unsigned _gnutls_fips_mode_enabled(void);
-# define FAIL_IF_FIPS_ERROR \
- if (_gnutls_get_fips_state() != FIPS_STATE_OPERATIONAL && \
- _gnutls_get_fips_state() != FIPS_STATE_SELFTEST && \
- _gnutls_get_fips_state() != FIPS_STATE_ZOMBIE) return GNUTLS_E_LIB_IN_ERROR_STATE
+# define FAIL_IF_LIB_ERROR \
+ if (_gnutls_get_lib_state() != LIB_STATE_OPERATIONAL && \
+ _gnutls_get_lib_state() != LIB_STATE_SELFTEST && \
+ _gnutls_get_lib_state() != LIB_STATE_ZOMBIE) return GNUTLS_E_LIB_IN_ERROR_STATE
-void _gnutls_switch_fips_state(gnutls_fips_state_t state);
+void _gnutls_switch_lib_state(gnutls_lib_state_t state);
void _gnutls_fips140_simulate_error(void);
-#else
-
-# define _gnutls_switch_fips_state(x) 0
-# define _gnutls_get_fips_state() STATE_OPERATIONAL
-# define FAIL_IF_FIPS_ERROR 0
-# define _gnutls_fips_perform_self_checks() 0
-# define _gnutls_fips_mode_enabled() 0
-#endif
-
#endif /* FIPS_H */
if (unlikely(e == NULL || e->id == GNUTLS_CIPHER_NULL))
return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
handle->e = e;
if (unlikely(e == NULL))
return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
memset(handle, 0, sizeof(*handle));
loaded_modules |= flags;
if (flags & GNUTLS_GLOBAL_INIT_MINIMAL) {
- _gnutls_switch_fips_state(FIPS_STATE_INIT);
+ _gnutls_switch_lib_state(LIB_STATE_INIT);
e = getenv("GNUTLS_DEBUG_LEVEL");
if (e != NULL) {
res = _gnutls_fips_mode_enabled();
if (res != 0) {
ret = _gnutls_fips_perform_self_checks();
- if (_gnutls_get_fips_state() != FIPS_STATE_ZOMBIE) {
+ if (_gnutls_get_lib_state() != LIB_STATE_ZOMBIE) {
if (ret < 0) {
gnutls_assert();
goto out;
}
- } else {
- ret = 0;
}
- _gnutls_switch_fips_state(FIPS_STATE_OPERATIONAL);
}
}
#endif
+ _gnutls_switch_lib_state(LIB_STATE_OPERATIONAL);
ret = 0;
out:
int result;
const gnutls_crypto_digest_st *cc = NULL;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
dig->e = e;
int ret;
const gnutls_crypto_digest_st *cc = NULL;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
/* check if a digest has been registered
*/
int ret;
const gnutls_crypto_mac_st *cc = NULL;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
/* check if a digest has been registered
*/
int result;
const gnutls_crypto_mac_st *cc = NULL;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
mac->e = e;
mac->mac_len = _gnutls_mac_get_algo_len(e);
uint8_t ipad[48];
int padsize, result;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
padsize = get_padsize((gnutls_digest_algorithm_t) e->id);
if (padsize == 0) {
**/
int gnutls_privkey_init(gnutls_privkey_t * key)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*key = gnutls_calloc(1, sizeof(struct gnutls_privkey_st));
if (*key == NULL) {
**/
int gnutls_pubkey_init(gnutls_pubkey_t * key)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*key = gnutls_calloc(1, sizeof(struct gnutls_pubkey_st));
if (*key == NULL) {
int ret;
record_parameters_st *epoch;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*session = gnutls_calloc(1, sizeof(struct gnutls_session_int));
if (*session == NULL)
cleanup:
mpz_clear(p);
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return ret;
}
if (ret < 0)
gnutls_free(plaintext->data);
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return ret;
}
cleanup:
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return ret;
}
return GNUTLS_E_INVALID_REQUEST;
}
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return 0;
fail:
}
params->params_nr = 0;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return ret;
}
return GNUTLS_E_INVALID_REQUEST;
}
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return 0;
fail:
}
params->params_nr = 0;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return ret;
}
**/
int gnutls_pkcs11_privkey_init(gnutls_pkcs11_privkey_t * key)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*key = gnutls_calloc(1, sizeof(struct gnutls_pkcs11_privkey_st));
if (*key == NULL) {
**/
int gnutls_rnd(gnutls_rnd_level_t level, void *data, size_t len)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
return _gnutls_rnd(level, data, len);
}
**/
int gnutls_x509_crl_init(gnutls_x509_crl_t * crl)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*crl = gnutls_calloc(1, sizeof(gnutls_x509_crl_int));
{
int result;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*crq = gnutls_calloc(1, sizeof(gnutls_x509_crq_int));
if (!*crq)
**/
int gnutls_x509_privkey_init(gnutls_x509_privkey_t * key)
{
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
*key = gnutls_calloc(1, sizeof(gnutls_x509_privkey_int));
{
gnutls_x509_trust_list_t tmp;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
tmp =
gnutls_calloc(1, sizeof(struct gnutls_x509_trust_list_st));
{
gnutls_x509_crt_t tmp;
- FAIL_IF_FIPS_ERROR;
+ FAIL_IF_LIB_ERROR;
tmp =
gnutls_calloc(1, sizeof(gnutls_x509_crt_int));