int fips_check_dsa_prng(DSA *dsa, size_t L, size_t N) { int strength; if (!FIPS_mode()) return 1; if (dsa->flags & (DSA_FLAG_NON_FIPS_ALLOW|DSA_FLAG_FIPS_CHECKED)) return 1; if (!L || !N) { L = BN_num_bits(dsa->p); N = BN_num_bits(dsa->q); } if (!dsa2_valid_parameters(L, N)) { FIPSerr(FIPS_F_FIPS_CHECK_DSA_PRNG, FIPS_R_INVALID_PARAMETERS); return 0; } strength = fips_ffc_strength(L, N); if (!strength) { FIPSerr(FIPS_F_FIPS_CHECK_DSA_PRNG,FIPS_R_KEY_TOO_SHORT); return 0; } if (FIPS_rand_strength() >= strength) return 1; FIPSerr(FIPS_F_FIPS_CHECK_DSA_PRNG,FIPS_R_PRNG_STRENGTH_TOO_LOW); return 0; }
int fips_check_ec_prng(EC_KEY *ec) { int bits, strength; if (!FIPS_module_mode()) return 1; if (ec->flags & (EC_FLAG_NON_FIPS_ALLOW|EC_FLAG_FIPS_CHECKED)) return 1; if (!ec->group) return 1; bits = BN_num_bits(&ec->group->order); if (bits < 160) { FIPSerr(FIPS_F_FIPS_CHECK_EC_PRNG,FIPS_R_KEY_TOO_SHORT); return 0; } /* Comparable algorithm strengths: from SP800-57 table 2 */ if (bits >= 512) strength = 256; else if (bits >= 384) strength = 192; else if (bits >= 256) strength = 128; else if (bits >= 224) strength = 112; else strength = 80; if (FIPS_rand_strength() >= strength) return 1; FIPSerr(FIPS_F_FIPS_CHECK_EC_PRNG,FIPS_R_PRNG_STRENGTH_TOO_LOW); return 0; }
int fips_check_rsa_prng(RSA *rsa, int bits) { int strength; if (!FIPS_module_mode()) return 1; if (rsa->flags & (RSA_FLAG_NON_FIPS_ALLOW|RSA_FLAG_CHECKED)) return 1; if (bits == 0) bits = BN_num_bits(rsa->n); /* Should never happen */ if (bits < 1024) { FIPSerr(FIPS_F_FIPS_CHECK_RSA_PRNG,FIPS_R_KEY_TOO_SHORT); return 0; } /* From SP800-57 */ if (bits < 2048) strength = 80; else if (bits < 3072) strength = 112; else if (bits < 7680) strength = 128; else if (bits < 15360) strength = 192; else strength = 256; if (FIPS_rand_strength() >= strength) return 1; FIPSerr(FIPS_F_FIPS_CHECK_RSA_PRNG,FIPS_R_PRNG_STRENGTH_TOO_LOW); return 0; }