Как найти закрытый ключ в токене с помощью модуля сертификата X509 в C ++ - PullRequest
0 голосов
/ 31 октября 2018

В коде 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);

1 Ответ

0 голосов
/ 31 октября 2018

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

{ 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 байтов может быть недостаточно.

...