Поведение обратных вызовов 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;
}

0 ответов

Другие вопросы по тегам