Рутокен PINPad представляет собой решение класса TrustScreen, которое позволяет визуализировать подписываемый документ на экране доверенного устройства перед наложением электронной подписи. Устройство позволяет реализовать следующие незаменимые в PKI-инфраструктуре возможности:
Кроме того, Рутокен PINPad поддерживает национальные стандарты в полном объеме:
Рутокен PINPad имеет два специфических атрибута закрытого ключа, которые влияют на поведение устройства при осуществлении криптографических операций с использованием такого ключа: CKA_VENDOR_KEY_CONFIRM_OP
и CKA_VENDOR_KEY_PIN_ENTER
. Оба атрибута присваиваются закрытому ключу при генерации ключевой пары соответственно указанным в шаблоне значениям и поэтому не могут быть изменены после генерации. Помимо закрытого ключа, эти атрибуты могут быть присвоены также секретному ключу.
Если ключ был создан с флагом визуализации CKA_VENDOR_KEY_CONFIRM_OP
, то данные, которые подписываются с помощью такого ключа, перед подписью будут показаны на экране устройства и для их подписи потребуется подтверждение пользователя в виде нажатия специальной кнопки на тачскрине устройства.
Если ключ был создан с флагом повышенной защиты CKA_VENDOR_KEY_PIN_ENTER
, то для подписи таким ключом перед операцией потребуется ввести PIN-код на тачскрине устройства.
Ниже представлены примеры шаблонов закрытого и открытого ключа с пояснениями.
CK_OBJECT_CLASS ocPrivKey = CKO_PRIVATE_KEY; CK_UTF8CHAR PrivKeyLabel[] = {"GOST Private Key"}; CK_BYTE KeyPairID[] = {"GOST keypair"}; CK_KEY_TYPE KeyType = CKK_GOSTR3410; // или CKK_GOSTR3410_512 для ключа длиной 512 бит CK_BBOOL bTrue = CK_TRUE; CK_BYTE GOST3410_params_oid[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001 CK_ATTRIBUTE GOST34_10_2001PrivateKey[] = { { CKA_CLASS, &ocPrivKey, sizeof(ocPrivKey)}, // Объект закрытого ключа { CKA_LABEL, &PrivKeyLabel, sizeof(PrivKeyLabel) - 1}, // Метка ключа { CKA_ID, &KeyPairID, sizeof(KeyPairID) - 1}, // Идентификатор ключевой пары #1 (должен совпадать у открытого и закрытого ключей) { CKA_KEY_TYPE, &KeyType, sizeof(ktGOST)}, // Тип ключа { CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для расшифрования { CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &bTrue, sizeof(bTrue)}, // Ключ доступен только после авторизации на токене { CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи) { CKA_VENDOR_KEY_CONFIRM_OP, &bTrue, sizeof(bTrue) }, // Операция подписи требует подтверждения на PINPad { CKA_VENDOR_KEY_PIN_ENTER, &bTrue, sizeof(bTrue) }, // Операция подписи требует ввода PIN-кода на PINPad { CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)} // Параметры алгоритма }; |
CK_OBJECT_CLASS ocPubKey = CKO_PUBLIC_KEY; CK_UTF8CHAR PubKeyLabel[] = {"GOST Public Key"}; CK_BYTE KeyPairID[] = {"GOST keypair"}; CK_KEY_TYPE KeyType = CKK_GOSTR3410; CK_BBOOL bTrue = CK_TRUE; CK_BBOOL bFalse = CK_FALSE; CK_BYTE GOST3410params[]= { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001 CK_BYTE GOST3411params[]= { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01 }; // Параметры алгоритма ГОСТ Р 34.11-1994 CK_ATTRIBUTE GOST34_10_2001PublicKey[] = { { CKA_CLASS, &ocPubKey, sizeof(ocPubKey)}, // Объект открытого ключа { CKA_LABEL, &PubKeyLabel, sizeof(PubKeyLabel)-1}, // Метка ключа { CKA_ID, &KeyPairID, sizeof(KeyPairID)-1}, // Идентификатор ключевой пары { CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа { CKA_ENCRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для зашифрования { CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &bFalse, sizeof(bFalse)}, // Ключ доступен без авторизации на токене { CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи). { CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)},// Параметры алгоритма { CKA_GOSTR3411_PARAMS, GOST3411params, sizeof(GOST3411params)} // Параметры алгоритма }; |
Любой сценарий начинается с определения всех подключенных к компьютеру устройств Рутокен PINPad.
При этом возвращается список идентификаторов подключенных устройств. Идентификатор представляет собой число, связанное с номером слота, в который подключено устройство. При повторном перечислении это число может отличаться для одного и того устройства.
Рутокен Плагин определяет все подключенные к компьютеру UBS-устройства Рутокен ЭЦП, Рутокен WEB и Рутокен PINPad. Поэтому следующим шагом следует определить тип устройства.
Для определения типа устройства следует использовать функцию getDeviceInfo с параметром TOKEN_INFO_DEVICE_TYPE. Значение этой константы содержится в объекте плагина. Для Рутокен PINPad результатом вызова данной функции будет TOKEN_TYPE_RUTOKEN_PINPAD_2, числовая константа, которая так же находится в объекте плагин.
Чтобы Рутокен PINPad распознал данные, они должны быть отправлены на подпись в специальном формате.