У меня есть небольшой класс C ++ для обработки зашифрованных сообщений для приложения. Один из методов класса завершает расшифровку, проверяя тег AEAD. Эта функция не работает. Я пытаюсь понять почему. Вот функция:
bool aescipher::finalizeDecrypt(uint8_t* src, uint8_t tag[AES_GCM_TAG_LENGTH])
{
if (mMode != DECRYPT) { return false; }
if (!src) { return false; }
if (mFinalized) { return false; }
//Set expected tag value.
if(!EVP_CIPHER_CTX_ctrl(mContext, EVP_CTRL_GCM_SET_TAG, AES_GCM_TAG_LENGTH, tag)) {
return false;
}
// finalize, note: no output for GCM.
int outlen = false;
if (EVP_DecryptFinal_ex(mContext, src, &outlen) <= 0){
return false;
}
mFinalized = true;
return true;
}
Функция не работает на EV_DecryptFinal_ex()
Теперь я не спрашиваю, почему она не работает. По крайней мере, пока. Я предполагаю, что когда EVP_DecryptFinal_ex()
выходит из строя, где-то сообщается об ошибке. Как я могу понять, почему это не удалось? Я пробовал использовать:
if (EVP_DecryptFinal_ex(mContext, src, &outlen) <= 0){
ERR_print_errors_fp(stderr);
return false;
}
, но это ничего не дает stderr. Я пробовал делать:
if (EVP_DecryptFinal_ex(mContext, src, &outlen) <= 0){
fprintf(stderr, "%lu", ERR_get_error());
return false;
}
, но это также просто печатает 0.
Я делаю это неправильно или есть другой способ определить по EVP_DecryptFinal_ex()
не работает?