Поведение обратных вызовов OpenSSL ENGINE RSA в режиме FIPS
Я использую следующий пользовательский движок для взаимодействия со смарт-картами для подписи дайджестов во время аутентификации клиента в режиме FIPS.
Когда режим FIPS НЕ установлен, OpenSSL вызывает метод rsa_sign (), который в конечном итоге перенаправляется зарегистрированному методу RSA_Sign(), который затем подписывает дайджест. Однако, когда установлен режим FIPS (set_mode (1)), вызов RSA_Sign() отсутствует. После некоторого чтения я обнаружил, что вместо этого вызов помещается в метод RSA_Sign_Enc(), который перенаправляется из rsa_priv_enc () OpenSSL.
Это ожидаемое поведение различных вызовов метода обратного вызова в режиме FIPS и не FIPS? Кроме того, если метод RSA_Sign_Enc() выполняет ту же работу, что и RSA_Sign(), это правильный путь?
static const char* engine_id = "enginefoo";
static const char* engine_name = "signing engine foo";
static const ENGINE_CMD_DEFN engine_commands[] = { { 0, NULL, NULL, 0 } };
static RSA_METHOD* rsa_method_var = nullptr;
static int InitializeEngine()
{
ENGINE * engine = ENGINE_new();
if(engine == NULL)
return 0;
if(!Bind_Helper(engine))
return 0;
ENGINE_add(engine);
ENGINE_set_default_RSA(engine);
ENGINE_free(engine);
ENGINE_cleanup();
return 1;
}
static int BindHelper(ENGINE* engine)
{
if (!ENGINE_set_id(engine, engine_id)
|| !ENGINE_set_name(engine, engine_name)
|| !ENGINE_set_flags(engine, ENGINE_FLAGS_NO_REGISTER_ALL)
|| !ENGINE_set_init_function(engine, Init)
|| !ENGINE_set_finish_function(engine, Finish)
|| !ENGINE_set_destroy_function(engine, Destroy)
|| !ENGINE_set_RSA(engine, rsa_method_var)
|| !ENGINE_set_cmd_defns(engine, engine_commands)
|| !ENGINE_set_ctrl_function(engine, Control))
{
return 0;
}
return 1;
}
static int Init(ENGINE* engine)
{
const RSA_METHOD* pMethod = RSA_PKCS1_SSLeay();
rsa_method_var->name = "Foo RSA Method";
rsa_method_var->app_data = nullptr;
rsa_method_var->rsa_mod_exp = pMethod->rsa_mod_exp;
rsa_method_var->bn_mod_exp = pMethod->bn_mod_exp;
rsa_method_var->rsa_priv_dec = pMethod->rsa_priv_dec;
rsa_method_var->rsa_pub_dec = pMethod->rsa_pub_dec;
rsa_method_var->rsa_pub_enc = pMethod->rsa_pub_enc;
rsa_method_var->rsa_verify = pMethod->rsa_verify;
rsa_method_var->flags = (RSA_FLAG_CACHE_PUBLIC |
RSA_FLAG_CACHE_PRIVATE |
RSA_FLAG_FIPS_METHOD |
RSA_FLAG_SIGN_VER);
rsa_method_var->rsa_priv_enc = RSA_Priv_Enc();
rsa_method_var->rsa_sign = RSA_Sign();
return 1;
}
static int RSA_Priv_Enc()
{
// called when FIPS mode is set
return nMessageLength;
}
static int RSA_Sign()
{
// called in non-FIPS mode
return 1;
}