Общая информация
Термины и определения:
rtpkcs11ecp – библиотека, разработанная на базе стандарта PKCS#11, для взаимодействия с устройством Рутокен. Библиотека предоставляет набор функций для выполнения криптографических преобразований независимо от конкретной аппаратной реализации устройства Рутокен и программной среды.
Объекты rtpkcs11ecp – в данной статье этим термином обозначены "открытый", "закрытый" ключи и сертификат.
rtpkcs11ecp
Для обеспечения совместимости с CryptoAPI объекты rtpkcs11ecp должны соответствовать требованиям:
- атрибуты идентификаторов (CKA_ID) "открытого", "закрытого" ключа и их сертификата должны иметь одинаковое значение и быть отличны от CKA_ID других объектов rtpkcs11ecp;
- атрибуты "открытого" (CKA_ENCRYPT) и "закрытого" (CKA_DECRYPT) ключа одновременно должны принимать одно из значений:
- TRUE. Ключ предназначен для шифрования (расшифрования) данных;
- FALSE. Ключ предназначен для электронной подписи (ЭП) документа (проверки ЭП).
- перечень основных атрибутов объектов rtpkcs11ecp должен соответствовать приведенным в разделе "Шаблоны rtpkcs11ecp".
ВНИМАНИЕ!
- Все операции по генерации (импорту) объектов rtpkcs11ecp должны производиться ТОЛЬКО после аутентификации пользователя в устройстве Рутокен.
- Импорт объектов rtpkcs11ecp должен осуществляется в следующем порядке:
a) "закрытый" ключ;
b) "открытый" ключ;
с) сертификат.
CryptoAPI
CryptoAPI для работы с объектами rtpkcs11ecp создает контейнеры.
Один контейнер содержит одну ключевую пару и ее сертификат. Допускается наличие в контейнере только ключевой пары, без сертификата.
Если ключевой паре соответствует несколько сертификатов, в контейнере отображается только последний выданный.
В CryptoAPI реализовано два вида контейнеров:
- AT_KEYEXCHANGE, содержащий объекты rtpkcs11ecp, предназначенные для шифрования (расшифрования) данных;
- AT_SIGNATURE, содержащий объекты rtpkcs11ecp, предназначенные для электронной подписи документа.
ВНИМАНИЕ!
CryptoAPI не отображает:
- "открытый" или "закрытый" ключ без наличия на устройстве Рутокен его ключевой пары;
- сертификат без его ключевой пары.
Шаблоны rtpkcs11ecp
Шаблоны генерации ключей для криптоалгоритма RSA
Шаблон генерации "закрытого" ключа для расшифрования данных
CK_ATTRIBUTE privateKeyTemplate[] = { { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)}, // Класс - закрытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, // Метка ключа { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_DECRYPT, &attributeTrue, sizeof(attributeTrue)}, // Ключ предназначен для расшифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue)} // Ключ доступен только после аутентификации на токене };
Шаблон генерации "открытого" ключа для шифрования данных
CK_ATTRIBUTE publicKeyTemplate[] = { { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject)}, // Класс - открытый ключ { CKA_LABEL, &publicKeyLabelRsa, sizeof(publicKeyLabelRsa) - 1}, // Метка ключа { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_ENCRYPT, &attributeTrue, sizeof(attributeTrue)}, // Ключ предназначен для зашифрования { CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse)}, // Ключ доступен без аутентификации на токене { CKA_MODULUS_BITS, &rsaModulusBits, sizeof(rsaModulusBits)} // Длина модуля ключа };
Шаблон генерации "закрытого" ключа для ЭП
CK_ATTRIBUTE privateKeyTemplate[] = { { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)}, // Класс - закрытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, // Метка ключа { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_DECRYPT, &attributeFalse, sizeof(attributeFalse)}, // Ключ не предназначен для расшифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue)} // Ключ доступен только после аутентификации на токене };
Шаблон генерации "открытого" ключа для ЭП
CK_ATTRIBUTE publicKeyTemplate[] = { { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject)}, // Класс - открытый ключ { CKA_LABEL, &publicKeyLabelRsa, sizeof(publicKeyLabelRsa) - 1}, // Метка ключа { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_ENCRYPT, &attributeFalse, sizeof(attributeFalse)}, // Ключ не предназначен для зашифрования { CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse)}, // Ключ доступен без аутентификации на токене { CKA_MODULUS_BITS, &rsaModulusBits, sizeof(rsaModulusBits)} // Длина модуля ключа };
Шаблоны импорта сертификата и ключей для криптоалгоритма RSA
Шаблон импорта "закрытого" ключа для расшифрования данных
CK_ATTRIBUTE privateKeyTemplate[] = { { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)}, // Класс - закрытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_DECRYPT, &attributeTrue, sizeof(attributeTrue)}, // Ключ предназначен для расшифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue)}, // Ключ доступен только после аутентификации на токене { CKA_MODULUS, &rsaModulus, sizeof(rsaModulus)}, // Модуль n { CKA_PUBLIC_EXPONENT, &pubExp, sizeof(pubExp)}, // Открытая экспонента e { CKA_PRIVATE_EXPONENT, &privExp, sizeof(privExp)}, // Закрытая экспонента d { CKA_PRIME_1, &prime1, sizeof(prime1)}, // Простое число p { CKA_PRIME_2, &prime2, sizeof(prime2)}, // Простое число q { CKA_EXPONENT_1, &exp1, sizeof(exp1)}, // Закрытая экспонента d по модулю p-1 { CKA_EXPONENT_2, &exp2, sizeof(exp2)}, // Закрытая экспонента d по модулю q-1 { CKA_COEFFICIENT, &coeff, sizeof(coeff)}, // q^(-1) mod p }
Шаблон импорта "открытого" ключа для шифрования данных
CK_ATTRIBUTE publicKeyTemplate[] = { { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject)}, // Класс - открытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_ENCRYPT, &attributeTrue, sizeof(attributeTrue)}, // Ключ предназначен для шифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeFalse, sizeof(attributeTrue)}, // Ключ доступен только без аутентификации на токене { CKA_MODULUS, &rsaModulus, sizeof(rsaModulus)}, // Модуль n { CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits) }, // Длина модуля n в битах { CKA_PUBLIC_EXPONENT, pubExp, sizeof(pubExp) } }); // Открытая экспонента е
Шаблон импорта "закрытого" ключа для ЭП
CK_ATTRIBUTE privateKeyTemplate[] = { { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)}, // Класс - закрытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_DECRYPT, &attributeFalse, sizeof(attributeFalse)}, // Ключ не предназначен для расшифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue)}, // Ключ доступен только после аутентификации на токене { CKA_MODULUS, &rsaModulus, sizeof(rsaModulus)}, // Модуль n { CKA_PUBLIC_EXPONENT, &pubExp, sizeof(pubExp)}, // Открытая экспонента e { CKA_PRIVATE_EXPONENT, &privExp, sizeof(privExp)}, // Закрытая экспонента d { CKA_PRIME_1, &prime1, sizeof(prime1)}, // Простое число p { CKA_PRIME_2, &prime2, sizeof(prime2)}, // Простое число q { CKA_EXPONENT_1, &exp1, sizeof(exp1)}, // Закрытая экспонента d по модулю p-1 { CKA_EXPONENT_2, &exp2, sizeof(exp2)}, // Закрытая экспонента d по модулю q-1 { CKA_COEFFICIENT, &coeff, sizeof(coeff)}, // q^(-1) mod p }
Шаблон импорта "открытого" ключа для ЭП
CK_ATTRIBUTE publicKeyTemplate[] = { { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject)}, // Класс - открытый ключ { CKA_LABEL, &privateKeyLabelRsa, sizeof(privateKeyLabelRsa) - 1}, { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор ключевой пары (должен совпадать у "открытого" и "закрытого" ключей) { CKA_KEY_TYPE, &keyTypeRsa, sizeof(keyTypeRsa)}, // Тип ключа - RSA { CKA_ENCRYPT, &attributeFalse, sizeof(attributeFalse)}, // Ключ не предназначен для зашифрования { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &attributeFalse, sizeof(attributeTrue)}, // Ключ доступен только без аутентификации на токене { CKA_MODULUS, &rsaModulus, sizeof(rsaModulus)}, // Модуль n { CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits) }, // Длина модуля n в битах { CKA_PUBLIC_EXPONENT, pubExp, sizeof(pubExp) } }); // Открытая экспонента е
Шаблон импорта сертификата
CK_ATTRIBUTE certificateTemplate[] = { { CKA_VALUE, 0, 0 }, { CKA_CLASS, &certificateObject, sizeof(certificateObject)}, // Класс - сертификат { CKA_ID, &keyPairIdRsa, sizeof(keyPairIdRsa) - 1}, // Идентификатор сертификата { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Сертификат является объектом токена { CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse)}, // Сертификат доступен без аутентификации на токене { CKA_CERTIFICATE_TYPE, &certificateType, sizeof(certificateType)}, // Тип сертификата { CKA_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate)}, // Признак принадлежности сертификата пользователю, закрытый ключ которого находится в токен }