...
CKK_GENERIC_SECRET
для абстрактных ключей произвольной длины,CKK_GOST28147
для ключей ГОСТ 28147-89,CKK_MAGMA
для использования в алгоритмах шифрования ГОСТ 34.12-2018 (ГОСТ Р 34.12-2015) с длиной блока 128 бит,CKK_KUZNYECHIK KUZNECHIK
для использования в алгоритмах шифрования ГОСТ 34.12-2018 (ГОСТ Р 34.12-2015) с длиной блока 64 бит,CKK_MAGMA_TWIN_KEY
для использования в алгоритме экспорта и импорта ключей ГОСТ Р 1323565.1.017-2018, построенном на основании блочного шифра «Магма»,CKK_KUZNYECHIKKUZNECHIK_TWIN_KEY
для использования в алгоритме экспорта и импорта ключей ГОСТ Р 1323565.1.017-2018, построенном на основании блочного шифра «Кузнечик»,
...
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS secretKeyObject = CKO_SECRET_KEY; CK_UTF8CHAR secretKeyKuznechikLabel[] = { "Sample Kuznechik Secret Key (Aktiv Co.)" }; CK_UTF8CHAR secretKeyMagmaLabel[] = { "Sample Magma Secret Key (Aktiv Co.)" }; CK_BYTE secretKeyKuznechikId[] = { "Kuznechik Secret Key ID (Aktiv Co.)" }; CK_BYTE secretKeyMagmaId[] = { "Magma Secret Key ID (Aktiv Co.)" }; CK_KEY_TYPE keyTypeKuznechik = CKK_KUZNECHIK; CK_KEY_TYPE keyTypeMagma = CKK_MAGMA; CK_BBOOL attributeTrue = CK_TRUE; CK_BBOOL attributeFalse = CK_FALSE; /************************************************************************* * Шаблон для генерации симметричного ключа Кузнечик для шифрования * *************************************************************************/ CK_ATTRIBUTE kuznechikKeyTemplate[] = { { CKA_CLASS, &secretKeyObject, sizeof(secretKeyObject) }, // Класс - секретный ключ { CKA_LABEL, &secretKeyKuznechikLabel, sizeof(secretKeyKuznechikLabel) - 1 }, // Метка ключа { CKA_ID, &secretKeyKuznechikId, sizeof(secretKeyKuznechikId) - 1 }, // Идентификатор ключа { CKA_KEY_TYPE, &keyTypeKuznechik, sizeof(keyTypeKuznechik) }, // Тип ключа - Кузнечик { CKA_ENCRYPT, &attributeTrue, sizeof(attributeTrue) }, // Ключ предназначен для зашифрования { CKA_DECRYPT, &attributeTrue, sizeof(attributeTrue) }, // Ключ предназначен для расшифрования { CKA_SIGN, &attributeTrueattributeFalse, sizeof(attributeTrueattributeFalse) }, // Ключ предназначен для вычисления MAC { CKA_VERIFY, &attributeTrueattributeFalse, sizeof(attributeTrueattributeFalse) }, // Ключ предназначен для проверки MAC { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue) }, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue) }, // Ключ недоступен без аутентификации на токене }; /************************************************************************* * Шаблон для генерации симметричного ключа Магма для шифрования * *************************************************************************/ CK_ATTRIBUTE magmaKeyTemplate[] = { { CKA_CLASS, &secretKeyObject, sizeof(secretKeyObject) }, // Класс - секретный ключ { CKA_LABEL, &secretKeyMagmaLabel, sizeof(secretKeyMagmaLabel) - 1 }, // Метка ключа { CKA_ID, &secretKeyMagmaId, sizeof(secretKeyMagmaId) - 1 }, // Идентификатор ключа { CKA_KEY_TYPE, &keyTypeMagma, sizeof(keyTypeMagma) }, // Тип ключа - Магма { CKA_ENCRYPT, &attributeTrue, sizeof(attributeTrue) }, // Ключ предназначен для зашифрования { CKA_DECRYPT, &attributeTrue, sizeof(attributeTrue) }, // Ключ предназначен для расшифрования { CKA_SIGN, &attributeTrueattributeFalse, sizeof(attributeTrueattributeFalse) }, // Ключ предназначен для вычисления MAC { CKA_VERIFY, &attributeTrueattributeFalse, sizeof(attributeTrueattributeFalse) }, // Ключ предназначен для проверки MAC { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue) }, // Ключ является объектом токена { CKA_PRIVATE, &attributeTrue, sizeof(attributeTrue) }, // Ключ недоступен без аутентификации на токене }; |
...
CKM_GOST28147_KEY_GEN
для генерации секретного ключа ГОСТ 28147-89 (библиотекой rtPKCS11ECP),CKM_GOST_KEY_GEN
для генерации секретного ключа ГОСТ 28147-89 (библиотекой rtPKCS11).CKM_KUZNECHIK_KEY_GEN
для генерации секретного ключа ГОСТ 34.12-2018 (ГОСТ Р 34.12-2015), используемого в алгоритмах шифрования с длиной блока 64 бит.CKM_MAGMA_KEY_GEN
для генерации секретного ключа ГОСТ 34.12-2018 (ГОСТ Р 34.12-2015), используемого в алгоритмах шифрования с длиной блока 128 бит.
Пример генерации секретного ключа
...
- kdf – идентификатор механизма диверсификации. Может быть использован один из двух механизмов:
- CKD_NULL - нет диверсификации
- CKD_CPDIVERSIFY_KDF
- pPublicData – открытый ключ получателя
- pUKM – имитовставка
VKO GOST R 34.10-2012 (256 бит и 512 бит)
Выработанный общий ключ согласно VKO GOST R 34.10-2012 может быть возвращен только в формате не диверсифицированного Key Encryption Key (KEK).
Параметры механизма CKM_GOSTR3410_201212_DERIVE задаются байтовым массивом, который имеет следующую структуру:
- 4 байта (little-endian, т.е. младшие байты сначала) представляют собой значение KDF. Значение определяет механизм диверсификации:
- CKD_NULL - нет диверсификации
- CKM_KDF_4357
- CKD_CPDIVERSIFY_KDF
- CKM_KDF_GOSTR3411_2012_256
- 4 байта (little-endian) задают длину открытого ключа в байтах. (64 либо для 256 бит – это 64. Для 512 бит – 128)
- открытый ключ (n-байтовый вектор в little-endian), длина которого определена предыдущим полем
- 4 байта (little-endian) задают длину UKM (от 8 байт )
- UKM (n-байтовый вектор в little-endian) , длина определена выше.
...
CKM_GOSTR3410
подписи алгоритмом ГОСТ Р 34.10.2001 и ГОСТ Р 34.10.2012 с длиной закрытого ключа 256 бит,CKM_GOSTR3410_WITH_GOSTR3411
для совместного хеширования алгоритмомCKM_GOSTR3411
и подписи алгоритмомCKM_GOSTR3410
,CKM_GOSTR3410_512
для подписи алгоритмом ГОСТ Р 34.10.2012 с длиной закрытого ключа 512 бит,CKM_GOSTR3410_WITH_GOSTR3411_12_256
для совместного хеширования алгоритмомCKM_GOSTR3411_12_256
и подписи на ключе длиной 256 бит,CKM_GOSTR3410_WITH_GOSTR3411_12_512
для совместного хеширования алгоритмомCKM_GOSTR3411_12_512
и подписи на ключе длиной 512 бит,CKM_RSA_PKCS
для подписи алгоритмом RSA.CKM_MD5_RSA_PKCS, CKM_SHA1_RSA_PKCS, CKM_SHA224_RSA_PKCS, CKM_SHA256_RSA_PKCS, CKM_SHA384_RSA_PKCS, CKM_SHA512_RSA_PKCS
для алгоритма взятия хеша с последующим взятием подписи по алгоритму RSACKM_ECDSA
для подписи алгоритмом ECDSA.
Подпись данных
Для вычисления подписи сообщения служат функции C_SignInit()
и C_Sign()
. Сначала операцию подписи нужно инициализировать через C_SignInit()
, передав в нее идентификатор сессии, механизма и закрытого ключа. Затем размер буфера для подписанных данных можно определить, вызвав C_Sign()
с указателем на длину буфера, равной нулю, и подписать данные, вызвав C_Sign()
второй раз.
...
Подпись данных отдельными механизмами хеширования и подписи
...
Пример подписи данных по алгоритму ГОСТ Р 34.10-2012 отдельными механизмами хеширования и подписи для всех устройств Рутокен
...
При использовании совместного механизма и хеширование, и подпись выполняются функцией C_Sign()
. Сначала в функцию C_SignInit()
передается совместный механизм (например, CKM_GOSTR3410_WITH_GOSTR3411
), а затем в функцию C_Sign()
– сообщение.
Пример подписи данных по алгоритму ГОСТ Р 34.10-2012 совместным механизмом хеширования и подписи
...
Пример подписи данных по алгоритму ECDSA отдельными механизмами хеширования и подписи
...