Как правильно проверить подпись в openSSL 1.1.0 (только открытый модуль и экспонента) в массивах uint8_t - PullRequest
0 голосов
/ 06 ноября 2018

Я прочитал многие из связанных статей и попробовал примеры кодирования, но мой вызов RSA_verify все еще терпит неудачу. Вот мои данные:

Я должен проверить хеш (SHA256) на соответствие подписи, подписанной закрытым ключом (отдельным приложением), но все, что мне нужно, - это массивы uint8_t для mod, exp и message. Я попытался создать структуру RSA и затем передать ее в функцию RSA_verfiy (вместе с подписью), но все время получаю следующую ошибку:

5040: ошибка: 0306E06C: подпрограммы bignum: BN_mod_inverse: нет инверсии:. \ Crypto \ bn \ bn_gcd.c: 492:

Вот код моего кода:

bool RSAVerifySig(uint8_t *hash, uint32_t hashSize, 
    uint8_t *sig, uint32_t sigSize, 
    uint8_t *mod, uint32_t modSize, 
    uint8_t *exp, uint32_t expSize)
{
    RSA *rsa = RSA_new();
    BIGNUM *bnN = BN_new();
    BIGNUM *bnE = BN_new();

    if (!BN_bin2bn(exp, expSize, bnE))
    {
        cout << "BN_bin2bn bnE failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
        return false;
    }

    if (!BN_bin2bn(mod, modSize, bnN))
    {
        cout << "BN_bin2bn bnN failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
        return false;
    }

    if (!RSA_set0_key(rsa, bnN, bnE, NULL))
    {
        cout << "RSA_set0_key public failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
        return false;
    }


    bool result;
    if (RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, sig, sigSize, rsa) == 0)
    {
        cout << "RSA_verify failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
        result = false;
    }
    else
    {

        result = true;
    }

    RSA_free(rsa);
    BN_free(bnN);
    BN_free(bnE);


    return result;
}

int main()
{
    uint8_t msg[128] = { 0x05, 0x94, ... };
    uint8_t exp[4] = { 0x82, ... };
    uint8_t sig[256] = { 0x95, ... };
    uint8_t mod[256] = { ... };
    uint8_t hash[32];   // some result : { 0x54, 0x78, .. }

    //SHA256() => function that generate hash from msg

    bool res = RSAVerifySig(hash, sizeof(hash), sig, sizeof(sig), mod, sizeof(mod), exp, sizeof(exp));

    return 0;
}

Я бьюсь головой об этом уже несколько дней. Если кто-то может помочь, это будет оценено.

...