PKCS # 11 C_Encrypt завершается с ошибочными аргументами для 128-битного ключа AES - PullRequest
0 голосов
/ 15 мая 2018

Я генерирую 128-битный объект AES, используя «C_CreateObject».Затем я делаю следующее, чтобы зашифровать часть данных и получить ошибку «Bad Argumnents» при вызове «C_Encrypt» для получения длины зашифрованных данных.

char clear[] = "My name is Eric!";
buf_len = sizeof(clear) -1;

rv = pfunc11->C_EncryptInit(session, pMechanism, hObject);

if (rv != CKR_OK)    
{
    printf("ERROR: rv=0x%08X: initializing encryption:\n", (unsigned int)rv);
    return false;
}


rv = pfunc11->C_Encrypt(session, (CK_BYTE_PTR)clear, (CK_ULONG)buf_len, NULL, pulEncryptedDataLen);
if (rv != CKR_OK) 
{                                   
    printf("ERROR: rv=0x%08X: derror getting encryption data buffer length:\n", (unsigned int)rv);
    return false;
}

Что я здесь не так делаю?

Вот определение моего механизма -

CK_MECHANISM myMechanism = {CKM_AES_CBC_PAD, (CK_VOID_PTR)"01020304050607081122334455667788", (CK_ULONG)16};
CK_MECHANISM_PTR pMechanism = &myMechanism;

1 Ответ

0 голосов
/ 16 мая 2018

Ваш pulEncryptedDataLen, вероятно, имеет значение NULL, что вызывает CKR_ARGUMENTS_BAD.

Лучше использовать, например:

CK_ULONG ulEncryptedDataLen;
...
rv = pfunc11->C_Encrypt(session, (CK_BYTE_PTR)clear, (CK_ULONG)buf_len, NULL, &ulEncryptedDataLen);

Количество байтов, достаточное для хранения результата шифрования одногочастичное шифрование сохраняется в ulEncryptedDataLen.

Также обратите внимание, что ваш способ передачи значения IV неверен, так как "01020304050607081122334455667788" приводит к строке ASCII (давая IV как 30313032303330343035303630373038 - что, вероятно,не то, что вы хотите).

Для получения правильного IV используйте вместо этого "\x01\x02\x03\x04\x05\x06\x07\x08\x11\x22\x33\x44\x55\x66\x77\x88".

Удачи!

...