Re: Работа с функциями библиотеки rtPKCS11ECP
Ещё вопрос по c_wrapkey.
Сессионный ключ гост-29147 оборачиваем с помощью ключа согласования. В результате получаем 36 байт.
Это зашифрованные 32 байта ключа и MAC?
В каком порядке что идёт?
Вы не авторизованы. Пожалуйста, войдите или зарегистрируйтесь.
Форум Рутокен → Техническая поддержка разработчиков → Работа с функциями библиотеки rtPKCS11ECP
Страницы Назад 1 … 6 7 8 9 10 Далее
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
Ещё вопрос по c_wrapkey.
Сессионный ключ гост-29147 оборачиваем с помощью ключа согласования. В результате получаем 36 байт.
Это зашифрованные 32 байта ключа и MAC?
В каком порядке что идёт?
ключ и MAC
Сначала 32 ключа, потом 4 мак, так?
именно
Спасибо, всё заработало.
Структуру ck_derive_params для андроида включите в примеры сдк, всё-таки.
Хорошо, так и сделаем.
Здравствуйте.
Пробую проверить подпись полученную функцией C_Ex_pkcs7sign под андроид.
Из обёртки выбираю 64 байта подписи и 64 байта открытого ключа подписавшего.
Считаю хеш данных функцией C_Digest, он совпадает с тем, что в обёртке.
записываю ключ подписавшего в токен:
//помещаем открытый ключ из сертификата в токен
CK_ATTRIBUTE[] signerKeyAttr = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(9);
signerKeyAttr[0].set(Pkcs11Constants.CKA_CLASS,Pkcs11Constants.CKO_PUBLIC_KEY);
signerKeyAttr[1].set(Pkcs11Constants.CKA_LABEL,"signer public key");
signerKeyAttr[2].set(Pkcs11Constants.CKA_KEY_TYPE,RtPkcs11Constants.CKK_GOSTR3410);
signerKeyAttr[3].set(Pkcs11Constants.CKA_TOKEN,true);
signerKeyAttr[4].set(Pkcs11Constants.CKA_MODIFIABLE,true);
signerKeyAttr[5].set(Pkcs11Constants.CKA_PRIVATE, false);
signerKeyAttr[6].set(Pkcs11Constants.CKA_VALUE,params[0].pubkeydata);
signerKeyAttr[7].set(Pkcs11Constants.CKA_VERIFY,true);
signerKeyAttr[8].set(RtPkcs11Constants.CKA_GOSTR3410_PARAMS, RtPkcs11Constants.GOST3410_PARAMS_OID);
//LogF("pubkey len:"+params[0].pubkeydata.length);
int rv = Pkcs11Constants.CKR_OK;
try {
rv = RtPkcs11Library.getInstance().C_CreateObject(
selectedToken.hSession,
signerKeyAttr,
signerKeyAttr.length,
hSignerKey);
} catch (Exception e) {
LogF(e.getMessage());
}
потом:
CK_MECHANISM verifyMech = new CK_MECHANISM(RtPkcs11Constants.CKM_GOSTR3410,null,0);
rv=RtPkcs11Library.getInstance().C_VerifyInit(selectedToken.hSession,verifyMech,hSignerKey.getValue());
потом в С_Verify отправляю хеш данных и саму подпись:
rv=RtPkcs11Library.getInstance().C_Verify(selectedToken.hSession,dataDigest,dataDigest.length,params[0].signaturedata,params[0].signaturedata.length);
В результате всегда приходит CKR_SIGNATURE_INVALID
Что я делаю не так?
(собственно, тестируется всё на одном токене, и в VerifyInit я пробовал передать уже существующий открытый ключ из пары, которой подпись создавалась. не релутат - подпись неверна)
А ключ который вы получаете из конверта, совпадает с тем, который хранится на токене?
в моём случае да.
он же может и не совпадать. я реализую проверку просто проверку подписи, а не проверку подписи сделанную именно текущим токеном(и соответственно сертификатом на нём)
Для проверки подписи необходимо вычислить хеш от блока с атрибутами подписи, туда как раз и входит хеш от сообщения. Также не забудьте заменить первый байт последовательности 0xA0 на 0x31 (https://tools.ietf.org/html/rfc5652#section-5.4)
Спасибо! заработало
День добрый. Столкнулся с проблемой уже поднимавшейся на форуме: мне необходимо добавить в сертификат расширение SubjectSignTool ("1.2.643.100.111"). Оно должно быть задано в UTF8String.
Пробовал рецепт, приведенный выше на форуме - не помогло:
опять же повторюсь, при работе с етокенами, есть возможность делать так
{"1.3.6.1.4.1.311.20.2", "ASN1:UTF8String:SHABLON"} и получается:
SEQUENCE :
OBJECT_IDENTIFIER : 'Имя шаблона сертификата (1.3.6.1.4.1.311.20.2)'
OCTET_STRING :
UTF8String : 'SHABLON'как это сделать в вашей обертке?
Для UTF8.
public class HexadecimalEncoding { public static string ConvertStringToHex(String input, System.Text.Encoding encoding) { Byte[] stringBytes = encoding.GetBytes(input); StringBuilder sbBytes = new StringBuilder(stringBytes.Length * 2); foreach (byte b in stringBytes) { sbBytes.AppendFormat("{0:X2}", b); } return sbBytes.ToString(); } public static string ConvertHexToString(String hexInput, System.Text.Encoding encoding) { int numberChars = hexInput.Length; byte[] bytes = new byte[numberChars / 2]; for (int i = 0; i < numberChars; i += 2) { bytes[i / 2] = Convert.ToByte(hexInput.Substring(i, 2), 16); } return encoding.GetString(bytes); } } string ASN1EncodeToOCTETUTF8(string data) { int utfsize = Encoding.UTF8.GetBytes(data).Length; string one = Convert.ToInt32(utfsize + 2).ToString("x"); if (one.Length == 1) one = "0" + one; string two = Convert.ToInt32(Encoding.UTF8.GetBytes(data).Length).ToString("x"); if (two.Length == 1) two = "0" + two; string str = /*"04" + one +*/ "0c" + two + HexadecimalEncoding.ConvertStringToHex(data, Encoding.UTF8); string Hexadec = HexadecimalEncoding.ConvertHexToString(str, Encoding.UTF8); return HexadecimalEncoding.ConvertHexToString(str, Encoding.UTF8); }
Ну и результат ASN1EncodeToOCTETUTF8 надо передавать в расширение.
Функция CreateCSR стабильно возвращает ошибку 0x7 (Недопустимый аргумент).
Подскажите, пожалуйста, как правильно задавать данное расширение (если оно поддерживается).
PS. приведенный пример пришлось немного переделать, т.к. программа написана на C++, но результат работы класса полностью совпадает.
Правильно ли я понимаю, что фактически к строке значения расширения добавляется 2 символа: 0x0c и длина строки?
Добрый день!
Правильный ответ на этот вопрос вы можете найти в нашем комплекте разработчика:
pkcs11/samples/PKIExtensions/CreateCSR-PKCS10
Спасибо. Разобрался.
Страницы Назад 1 … 6 7 8 9 10 Далее
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
Форум Рутокен → Техническая поддержка разработчиков → Работа с функциями библиотеки rtPKCS11ECP