最近、OpenSC 0.15.0 に更新しましたが、何らかの理由で、これを使用してスマート カードの秘密鍵でメッセージを復号化することができなくなりました。
pkcs11-tool (OpenSC に付属) と OpenSSL エンジンを使用しても、明らかに同じことが起こります。
以下は、私たちが行ったことの例です。
pkcs11-ツール:
% pkcs11-tool --module /usr/local/lib/opensc-pkcs11.so --decrypt -v -l --input-file encrypted.bin --id 9352
Using slot 1 with a present token (0x1)
Logging in to "OpenSC Card".
Please enter User PIN:
Using decrypt algorithm RSA-PKCS
error: PKCS11 function C_Decrypt failed: rv = CKR_DATA_LEN_RANGE (0x21)
Aborting.
または、OpenSSL エンジンを使用して、小さなサンプル プログラムを次に示します。
#include <iostream>
#include <openssl/engine.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/crypto.h>
using namespace std;
int main()
{
OpenSSL_add_all_algorithms();
ENGINE_load_dynamic();
// Setup OpenSSL engine
ENGINE* engine = ENGINE_by_id("dynamic");
string enginePath = "/usr/local/lib/engines/pkcs11.so";
string modulePath = "/usr/local/lib/opensc-pkcs11.so";
ENGINE_ctrl_cmd_string(engine, "SO_PATH", enginePath.c_str(), 0);
ENGINE_ctrl_cmd_string(engine, "LIST_ADD", "1", 0);
ENGINE_ctrl_cmd_string(engine, "LOAD", NULL, 0);
ENGINE_ctrl_cmd_string(engine, "MODULE_PATH", modulePath.c_str(), 0);
string pin = "123456";
ENGINE_ctrl_cmd_string(engine, "PIN", pin.c_str(), 0);
ENGINE_ctrl_cmd_string(engine, "VERBOSE", NULL, 0);
ENGINE_init(engine);
ENGINE_set_default(engine, ENGINE_METHOD_ALL);
string keyName = "id_9352";
EVP_PKEY *evp = ENGINE_load_private_key(engine, keyName.c_str(), NULL, NULL);
// Read encrypted file
long unsigned int length = 128;
unsigned char buf[length];
FILE* f = fopen("encrypted.bin", "r");
fread(buf, 1, length, f);
fclose(f);
// Try to decrypt
unsigned char output[length];
unsigned char* p = output;
RSA *rsa = EVP_PKEY_get1_RSA(evp);
int outputLen = RSA_private_decrypt(length, buf, p, rsa, RSA_PKCS1_PADDING);
if (outputLen == -1) {
long err = ERR_get_error();
cout << "Error decrypting: " << ERR_error_string(err, NULL) << endl;
return 1;
}
cout << output << endl;
return 0;
}
しかし、私がそれを実行すると:
% ./sc-decrypt
PKCS#11: Initializing the engine
Found 2 slots
Loading private key "slot_1-id_9352"
Looking in slot 1 for key: 9352
[18446744073709551615] Virtual hotplug slot no tok
[1] Gemalto PC Twin Reader 00 login (OpenSC Card)
Found slot: Gemalto PC Twin Reader 00 00
Found token: OpenSC Card
Found 0 certificate:
Found 1 private key:
1 P Private Key
Error decrypting: error:80008021:Vendor defined:PKCS11_rsa_decrypt:Data len range
どうやら、どちらの場合も同じエラーで、「Data len range」に関するものです
さらに奇妙なのは、pkcs11-tool を使用して署名操作 (秘密鍵も使用) を実行すると、正常に動作することです。
% echo "test signing" > input.txt
% pkcs11-tool --module /usr/local/lib/opensc-pkcs11.so --sign -v --input-file input.txt --output-file out.sign --id 9352 -l
Using slot 1 with a present token (0x1)
Logging in to "OpenSC Card".
Please enter User PIN:
Using signature algorithm RSA-PKCS
% ls -l out.sign
-rw------- 1 user user 128 May 18 10:08 out.sign
だから、誰かが私が間違っていることを指摘できれば、とても感謝しています