我使用“C_CreateObject”生成128位AES对象。 然后我执行以下操作来加密一段数据,并在调用“C_Encrypt”时获得“Bad Argumnents”错误以获取加密数据长度。
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;
答案 0 :(得分:0)
您的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"
。