Re: Работа с функциями библиотеки rtPKCS11ECP

Ещё вопрос по c_wrapkey.
Сессионный ключ гост-29147 оборачиваем с помощью ключа согласования. В результате получаем 36 байт.
Это зашифрованные 32 байта ключа и MAC?
В каком порядке что идёт?

Re: Работа с функциями библиотеки rtPKCS11ECP

ключ и MAC

Re: Работа с функциями библиотеки rtPKCS11ECP

Сначала 32 ключа, потом 4 мак, так?

Re: Работа с функциями библиотеки rtPKCS11ECP

именно

Re: Работа с функциями библиотеки rtPKCS11ECP

Спасибо, всё заработало.
Структуру ck_derive_params для андроида включите в примеры сдк, всё-таки.

Re: Работа с функциями библиотеки rtPKCS11ECP

Хорошо, так и сделаем.

Re: Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте.
Пробую проверить подпись полученную функцией 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  я пробовал передать уже существующий открытый ключ из пары, которой подпись создавалась. не релутат - подпись неверна)

Re: Работа с функциями библиотеки rtPKCS11ECP

А ключ который вы получаете из конверта, совпадает с тем, который хранится на токене?

Re: Работа с функциями библиотеки rtPKCS11ECP

в моём случае да.

Re: Работа с функциями библиотеки rtPKCS11ECP

он же может и не совпадать. я реализую проверку просто проверку подписи, а не проверку подписи сделанную именно текущим токеном(и соответственно сертификатом на нём)

(2016-12-26 14:17:14 отредактировано Аникушин Евгений)

Re: Работа с функциями библиотеки rtPKCS11ECP

Для проверки подписи необходимо вычислить хеш от блока с атрибутами подписи, туда как раз и входит хеш от сообщения. Также не забудьте заменить первый байт последовательности 0xA0 на 0x31 (https://tools.ietf.org/html/rfc5652#section-5.4)

Re: Работа с функциями библиотеки rtPKCS11ECP

Спасибо! заработало

Re: Работа с функциями библиотеки rtPKCS11ECP

День добрый. Столкнулся с проблемой уже поднимавшейся на форуме: мне необходимо добавить в сертификат расширение SubjectSignTool ("1.2.643.100.111"). Оно должно быть задано в UTF8String.
Пробовал рецепт, приведенный выше на форуме - не помогло:

dedov пишет:

опять же повторюсь, при работе с етокенами, есть возможность делать так
{"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 и длина строки?

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый день!

Правильный ответ на этот вопрос вы можете найти в нашем комплекте разработчика:
pkcs11/samples/PKIExtensions/CreateCSR-PKCS10

Re: Работа с функциями библиотеки rtPKCS11ECP

Спасибо. Разобрался.