Почему при включенном режиме FIPS RSA_generate_key_ex генерирует меньшие ключи (половина, если быть точным)

Я использую openssl-1.0.1i с FIPS openssl-fips-2.0.7 (который я загружаю и компилирую динамические библиотеки DLL).

Моя программа очень проста, и я пытаюсь понять, почему результат функции RSA_generate_key_ex изменяется, когда я включаю или выключаю режим FIPS.

Я запускаю приведенный ниже код:

64
128
Размеры разные
Нажмите любую клавишу для продолжения . , ,

#include "stdafx.h"
#include <stdio.h>
#include <openssl/rsa.h>
#include <iostream>

typedef int (__cdecl *f_FIPS_mode_set)(int);
typedef int (__cdecl *f_RSA_generate_key_ex)(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
typedef RSA* (__cdecl *f_RSA_new)(void);
typedef BIGNUM* (__cdecl *f_BN_new)(void);
typedef int (__cdecl *f_BN_set_word)(BIGNUM *a, unsigned long w);
typedef int (__cdecl *f_RSA_size)(const RSA *rsa);

#define INT_POINTER_FUNCTION( function ) \
f_##function p_##function = (f_##function)GetProcAddress(hGetProcIDDLL, #function); \
if (!p_##function) { \
std::cout << "could not locate the ##function" << std::endl; \
return EXIT_FAILURE; \
}

int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hGetProcIDDLL = LoadLibrary(L"C:\\Users\\amos_zamir\\Desktop\\openssl_project\\openssl-1.0.1i\\out32dll\\libeay32.dll");

if (hGetProcIDDLL == NULL) {
std::cout << "cannot locate the .dll file" << std::endl;
return -1;
}

INT_POINTER_FUNCTION( FIPS_mode_set );
INT_POINTER_FUNCTION( RSA_generate_key_ex );
INT_POINTER_FUNCTION( RSA_new );
INT_POINTER_FUNCTION( BN_new );
INT_POINTER_FUNCTION( BN_set_word );
INT_POINTER_FUNCTION( RSA_size );int status=p_FIPS_mode_set(1);
if (status == 0)
{
std::cout << "cannot FIPS_mode_set" << std::endl;
goto free_all;
}int             ret = 0;
RSA             *r = NULL;
RSA             *r1 = NULL;
BIGNUM          *bne = NULL;
BIO             *bp_public = NULL, *bp_private = NULL;

int             bits = 1024;
unsigned long   e = RSA_F4;

// 1. generate rsa key
bne = p_BN_new();
ret = p_BN_set_word(bne,e);
if(ret != 1){
std::cout << "cannot BN_set_word" << std::endl;
goto free_all;
}

r = p_RSA_new();
ret = p_RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1){
std::cout << "cannot RSA_generate_key_ex" << std::endl;
goto free_all;
}

int num_bytes_with_fips=p_RSA_size(r);
std::cout << num_bytes_with_fips << std::endl;

status=p_FIPS_mode_set(0);
if (status == 0)
{
std::cout << "cannot FIPS_mode_set" << std::endl;
goto free_all;
}

r1 = p_RSA_new();
ret = p_RSA_generate_key_ex(r1, bits, bne, NULL);
if(ret != 1){
std::cout << "cannot RSA_generate_key_ex" << std::endl;
goto free_all;
}

int num_bytes_without_fips=p_RSA_size(r1);
std::cout << num_bytes_without_fips << std::endl;

if(num_bytes_without_fips!= num_bytes_with_fips)
{
std::cout << "Size are diffrent" << std::endl;
}free_all:
system("pause");
return 0;
}

Более того, когда FIPS включен и я шифрую (RSA_public_encrypt) с помощью объекта RSA, функция RSA_size которого возвращает 64, длина выходного буфера составляет 128, что, я думаю, является ошибкой, поскольку в руководстве написано

RSA_public_encrypt () возвращает размер зашифрованных данных (то есть RSA_size (rsa)).

https://www.openssl.org/docs/crypto/RSA_public_encrypt.html/

Есть что-то, что я делаю не так или это ошибка (к которой я очень скептически отношусь).

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]