криптография — Как найти закрытый ключ в токене с помощью модуля сертификата X509 в переполнении стека

В коде c ++ с использованием pkcs # 11 мы пытаемся найти закрытый ключ и установить соответствующий сертификат x509 в токене. Но не удалось найти пару ключей в токене с помощью модуля. Ниже приведен мой пример кода.

    //Install certificate

const char bytes[] = "-----BEGIN CERTIFICATE-----" "\n"....
"-----END CERTIFICATE-----" "\n";
BIO *bio_mem = BIO_new(BIO_s_mem());
BIO_puts(bio_mem, bytes);
X509 * x509 = PEM_read_bio_X509(bio_mem, NULL, NULL, NULL);
//
BIO *bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);

EVP_PKEY *pkey = X509_get_pubkey(x509);

RSA *rsa_key;
DSA *dsa_key;
char *rsa_e_dec, *rsa_n_hex, *dsa_p_hex,
*dsa_q_hex, *dsa_g_hex, *dsa_y_hex;

rsa_key = pkey->pkey.rsa;
//IFNULL_FAIL(rsa_e_dec, "unable to extract rsa exponent");
CK_BYTE_PTR modulus, exponent;

modulus = (unsigned char *)malloc(256);
int mo = BN_bn2bin(rsa_key->n, modulus);
//EVP_PKEY_free(pkey);
//  CK_RV result;
CK_OBJECT_HANDLE hObject;
CK_OBJECT_HANDLE hObjects[100];
CK_OBJECT_HANDLE_PTR hObject_PTR = NULL;
CK_ULONG count;
vector<CK_OBJECT_HANDLE> *handles = new vector<CK_OBJECT_HANDLE>();
//Object class attribute
CK_OBJECT_CLASS classValue = CKO_PRIVATE_KEY;
CK_OBJECT_CLASS keytype = CKK_RSA;

CK_ATTRIBUTE privKeySearchTemplate[] = {
{ CKA_CLASS, &classValue,sizeof(classValue) },
{ CKA_KEY_TYPE, &keytype,sizeof(keytype) },
{ CKA_MODULUS, &modulus, sizeof(modulus) },
};
//
//{ CKA_PUBLIC_EXPONENT, exponent},

// Read label and ID from private key handle
CK_ATTRIBUTE privKeyAttrsToRead[] =
{ { CKA_LABEL, NULL_PTR, 0 },
{ CKA_ID, NULL_PTR, 0 },
};
//WriteToLog(modulus, modulus_len11);
// Find all objects with the template specified
result = m_pPKCS11->C_FindObjectsInit(m_SessionHandle, privKeySearchTemplate, 2);do {

// Find the next object
result = m_pPKCS11->C_FindObjects(m_SessionHandle, &hObject, 1, &count);if (count != 0)
handles->push_back(hObject);

} while (count != 0);

result = m_pPKCS11->C_FindObjectsFinal(m_SessionHandle);

0

Решение

Здесь есть несколько ошибок:

{ CKA_MODULUS, &modulus, sizeof(modulus) }

как всегда, sizeof(modulus) это размер вашего указателя, который составляет 4 или 8 в зависимости от вашей системы. Это должен быть размер вашего модуля, который в вашем случае mo, Кроме того, используйте правильный тип здесь:

CK_KEY_TYPE keytype = CKK_RSA;

Еще одна ошибка здесь:

m_pPKCS11->C_FindObjectsInit(m_SessionHandle, privKeySearchTemplate, 2);

Вы ищете шаблон с 3 атрибутами, но вы установили количество атрибутов как 2. Обычно вам нужно написать код, подобный этому, чтобы предотвратить такие ошибки:

m_pPKCS11->C_FindObjectsInit(m_SessionHandle, privKeySearchTemplate, sizeof(privKeySearchTemplate) / sizeof(CK_ATTRIBUTE));

Наконец, вам нужно выделить достаточно памяти для вашего модуля перед использованием BN_bn2bin, если вы не хотите получать исключения памяти. Выделяя 256 байтов может быть недостаточно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]