2014-11-07 2 views
1

У меня есть следующий код в приложении веб-сервера C, которое у меня есть. Код выполняет проверку подписи ssl в сообщении с данным открытым ключом. Код работает отлично в приложении C, но в последнее время я начал писать его на C++. Проблема, с которой я столкнулся, состоит в том, что тот же самый код, который находится ниже, находится в обоих приложениях без изменений, оба раза получают одни и те же входные данные, но один скомпилированный с C++ дает ошибку SSL плохой подписи.Ошибка SSL-аутентификации в перекрестном языке

Вот код:

int verifyMessageSignature(const char* decoded_message, int pos, 
unsigned char* signature, char* publicKey) 
{ 
SSL_library_init(); 
SSL_load_error_strings(); 
ERR_load_BIO_strings(); 
// OpenSSL_add_all_algorithms() 

if (!publicKey) 
{ 
    printf("publicKey is null\n"); 
} 
BIO* keyBio = BIO_new_mem_buf(publicKey, -1); 
if(!keyBio) 
{ 
    printf("failed to created BIO\n"); 
    printError(ERR_get_error()); 
} 

BIO_set_mem_eof_return(keyBio, 0); 

RSA* rsa = PEM_read_bio_RSA_PUBKEY(keyBio, NULL, NULL, NULL); 

if (!rsa) 
{ 
    printf("Error in PEM_read_bio_RSA_PUBKEY\n"); 
    printError(ERR_get_error()); 
} 

EVP_MD_CTX *mdctx = NULL; 
if (!(mdctx = EVP_MD_CTX_create())) 
{ 
    printf("Error in ctx\n"); 
    printError(ERR_get_error()); 
} 

EVP_PKEY* pk = EVP_PKEY_new(); 

if (EVP_PKEY_set1_RSA(pk, rsa) != 1) 
{ 
    printf("err in EVP_PKEY_set1_RSA\n"); 
    printError(ERR_get_error()); 
} 

if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha1(), NULL, pk) != 1) 
{ 
    printf("error in EVP_DigestVerifyInit\n"); 
    printError(ERR_get_error()); 
} 

if (EVP_DigestVerifyUpdate(mdctx, decoded_message, pos) != 1) 
{ 
    printf("error in EVP_DigestVerifyUpdate\n"); 
    printError(ERR_get_error()); 
} 

if (EVP_DigestVerifyFinal(mdctx, signature, 512) == 1) 
{ 
    /* Success */ 
    printf("Successful verification!\n"); 
} 
else 
{ 
    /* Failure */ 
    printf("Unsuccessful verification!\n"); 
    printError(ERR_get_error()); 
    BIO_free_all(keyBio); 
    RSA_free(rsa); 
    EVP_PKEY_free(pk); 
    EVP_MD_CTX_destroy(mdctx); 
    ERR_free_strings(); 
    return 1; 
} 

BIO_free_all(keyBio); 
RSA_free(rsa); 
EVP_PKEY_free(pk); 
EVP_MD_CTX_destroy(mdctx); 
ERR_free_strings(); 

return 0; 

}

Этот код прекрасно работает в C. успешно проверяет подпись в моих тестах, в то время как тот же код, с теми же самыми входными данными (клавиши, сообщения и т. д.) в C++ дает плохую подпись.

Я компиляция под Ubuntu, используя GCC и г ++ (последняя)

Что может быть причиной этой проблемы?

+0

Вы скомпилировали с помощью -Wall и удостоверились, что у вас нет предупреждений? –

+0

Да. Никаких предупреждений, связанных с этим. –

+0

Не могли бы вы сделать небольшую пробную программу вокруг него, чтобы можно было воспроизвести ошибку в простой форме? –

ответ

0

Решено. Проблема заключалась в том, что я использовал std :: string, чтобы передать декодированное сообщение, которое каким-то образом трахало его. Я переключил код C++, чтобы использовать также строки char * для этого раздела, и теперь это нормально.

Спасибо за ответы, я надеюсь, что кто-то найдет это полезным.

Редактировать: PS: Я использую другую функцию для генерации самого декодированного сообщения. Эта проблема вызвала использование std :: string.

Смежные вопросы