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

Кирилл Мещеряков пишет:

Добрый день, если криптоарм говорит что подпись невалидна, то чего вы хотите тогда добиться?
она же валидной не станет :)

В криптопро проверку не проходит из-за просроченного сертификата. А через средства рутокена не получается получить результат, выскакивает эксепшн.

Кирилл Мещеряков пишет:

У вас есть пример когда проверка подписи должна проходить?

К сожалению, нет... Приходится с этим работать=(

BigZ пишет:

попробуйте перекодировать в PEM саму подпись и не вызывать для нее
string cms = Convert.ToBase64String(File.ReadAllBytes(@"res_31617d0b-ba19-f044-0e05-30a800690e40.zip.sig"));

Спасибо, будет время, попробую.

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

Виктор Ткаченко пишет:

Если у вас все хорошо работает с 1.3.7.0, то ее и используйте.

Выложили бы где-то переходник то на шарп ... и людям бы проще было обновляться и забирать ...
Зачем персонально просить кому надо и отправлять на почту ...:)

Можно мне тоже поюзать сие чудо (библиотечку)? .....

Да и кстати ... не плохо было бы материалы по поводу работы с токеном как с ccid картой автоматически устанавливаемой ... (интересуюсь с целью попробовать попользовать на виндофоне токен)

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

Переходник на шарп скоро будет.
То что сейчас выдаем - пока не подходит для публичного релиза и для использования под серьезные задачи.
Вы же наверное не хотели бы работать с неподдерживаемой версией в которой даже ошибки не исправляются, не говоря уже даже о добавлении новых фич.

А с винфоном даже не пытайтесь - кроме ccid там ничего нет, никакого смарт-карточного сервиса и winscard.
Вот когда microsoft зарелизит какой-нибудь Surface Phone на x86_64 десятке, вот тогда и приходите :)

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

Кирилл Мещеряков пишет:

Переходник на шарп скоро будет.
То что сейчас выдаем - пока не подходит для публичного релиза и для использования под серьезные задачи.
Вы же наверное не хотели бы работать с неподдерживаемой версией в которой даже ошибки не исправляются, не говоря уже даже о добавлении новых фич.

А с винфоном даже не пытайтесь - кроме ccid там ничего нет, никакого смарт-карточного сервиса и winscard.
Вот когда microsoft зарелизит какой-нибудь Surface Phone на x86_64 десятке, вот тогда и приходите :)

Ну виндофон меня интересует исключительно с точки зрения RSA криптографии, что ccid совсем не пригоден в чистом виде для использования? ...
Вроде как же оно как смарт карта распознается....

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

Здравствуйте! Работаю с вашей библиотекой под android.
Ответьте пожалуйста:
- при генерации подписи функцией C_sign после С_digest результатом является "голая подпись" хеша данных. в каком она формате? Как сформировать (где посмотреть как правильно?) DER из массива байт подписи? или она уже в ASN1 или DER?
- при подписи данных C_Ex_pkcs7sign результат в каком формате, CMS?

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

Добрый день,

при генерации подписи функцией C_sign после С_digest результатом является "голая подпись" хеша данных. в каком она формате?

бинарные данные

Как сформировать (где посмотреть как правильно?) DER из массива байт подписи?

конвертором. в интернете полно примеров на любых языках.

или она уже в ASN1 или DER?

нет

при подписи данных C_Ex_pkcs7sign результат в каком формате, CMS?

да

(2016-10-20 16:16:53 отредактировано kichnamid)

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

можно где-то почитать про функцию c_ex_pkcs7sign?
там параметр flags - это что? откреплённую подпись можно ей сделать. без энкапсулированных данных

Спасибо. уже нашёл у Вас

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

Ещё вопрос по c_ex_pkcs7sign. Какой механизм используется при подписи? тот, что указан в сертификате, который как параметр функции передаётся?

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

http://dev.rutoken.ru/pages/viewpage.ac … KCS7Sign()

CK_ULONG possible_flags[] = {0, PKCS7_DETACHED_SIGNATURE, USE_HARDWARE_HASH, USE_HARDWARE_HASH | PKCS7_DETACHED_SIGNATURE};

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

Доброго дня.
Проблема C_DeriveKey.

Ключевая пара создаётся по примеру из SDK
GOST3410_PARAMS_OID  = { 0x06, 0x07, 0x2a, (byte)0x85, 0x03, 0x02, 0x02, 0x24, 0x00 };
Или
GOST3410_PARAMS_OID = { 0x06, 0x07, 0x2a, (byte)0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }
Результат не меняется

Random r = new Random();
//заполняем DeriveParams как в примере
byte[] ckDeriveParamUkm = new byte[8];
r.nextBytes(ckDeriveParamUkm);
//keyValue это 64 байта открытого ключа получателя
ckDeriveParams = new CK_GOSTR3410_DERIVE_PARAMS(9,keyValue,keyValue.length,ckDeriveParamUkm,ckDeriveParamUkm.length);
//посещаем параметры в механизм derive
ckmDeriveMech = new CK_MECHANISM(RtPkcs11Constants.CKM_GOSTR3410_DERIVE,ckDeriveParams.getPointer(),ckDeriveParams.size());
//атрибуты ключа согласования
CK_ATTRIBUTE[] derivedKeyAttr = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(8);
derivedKeyAttr[0].set(Pkcs11Constants.CKA_CLASS,Pkcs11Constants.CKO_SECRET_KEY);
derivedKeyAttr[1].set(Pkcs11Constants.CKA_LABEL,"derived_key");
derivedKeyAttr[2].set(Pkcs11Constants.CKA_KEY_TYPE,RtPkcs11Constants.CKK_GOST28147);
derivedKeyAttr[3].set(Pkcs11Constants.CKA_TOKEN,false);
derivedKeyAttr[4].set(Pkcs11Constants.CKA_MODIFIABLE,true);
derivedKeyAttr[5].set(Pkcs11Constants.CKA_PRIVATE, true);
derivedKeyAttr[6].set(Pkcs11Constants.CKA_EXTRACTABLE, true);
derivedKeyAttr[7].set(Pkcs11Constants.CKA_SENSITIVE, false);

String eferKPId = "efemernaya_para";
int phPriKeyEfemer = getPrivateKeyHandle(selectedToken.hSession,eferKPId.getBytes());
if(phPriKeyEfemer!=0){
     LogF("����� ��������� ���� ��������� ����");
}

int rv = Pkcs11Constants.CKR_OK;
try {
   rv = RtPkcs11Library.getInstance().C_DeriveKey(
           selectedToken.hSession,
           ckmDeriveMech,
               phPriKeyEfemer,
               derivedKeyAttr,
               derivedKeyAttr.length,
               hDerivedKey);
} catch (Exception e) {
    LogF(e.getMessage());
}
C_DeriveKey выдаёт ошибку 7 - BAD ARGUMENT

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

Нашёл ошибку, но теперь вышеизложенный код выдаёт ошибку 113, 0x00000071 - CKR_MECHANISM_PARAM_INVALID

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

Забыл добавить, что приложение под android

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

Добрый день!
Для использования в Java приложениях больше подходит структура схожая со структурой, описанной в документе ТК-26 для 2012 ГОСТ-ов (http://tc26.ru/methods/project/PKCS11_v18.pdf) (к сожалению, документа для ГОСТ Р 34.10-2001 сходу не нашел). Она выглядит следующим образом:

typedef struct CK_GOSTR3410_DERIVE_PARAMS_JRT
{
    CK_EC_KDF_TYPE kdf;
    CK_ULONG publicKeyLen;
    unsigned char publicKey[64];
    CK_ULONG ukmLen;
    unsigned char ukm[8];
} CK_GOSTR3410_DERIVE_PARAMS_JRT;

Для того, чтобы наша библиотека правильно распарсила данную структуру в качестве значения поля kdf необходимо передать значение 0x90000009 (аналог CKD_CPDIVERSIFY_KDF) или 0x90000001 (аналог CKD_NULL_KDF).
Пример записи данной структуры на языке Java:

            static final NativeLong CKD_CPDIVERSIFY_KDF_JRT = new NativeLong(0x90000009);
            Random r = new Random();
            byte[] ckDeriveParamUkm = new byte[8];
            r.nextBytes(ckDeriveParamUkm);

            int size = NativeLong.SIZE * 3 + cbPubKeyValue.length + ckDeriveParamUkm.length;
            Pointer deriveParam = new Memory(size);
            deriveParam.setNativeLong(0, CKD_CPDIVERSIFY_KDF_JRT); // kdf
            deriveParam.setNativeLong(NativeLong.SIZE, new NativeLong(cbPubKeyValue.length)); // length
            deriveParam.write(NativeLong.SIZE * 2, cbPubKeyValue, 0, cbPubKeyValue.length); // pubkey
            deriveParam.setNativeLong(NativeLong.SIZE * 2 + cbPubKeyValue.length, new NativeLong(ckDeriveParamUkm.length)); // ukm length
            deriveParam.write(NativeLong.SIZE * 3 + cbPubKeyValue.length, ckDeriveParamUkm, 0, ckDeriveParamUkm.length); // ukm

            CK_MECHANISM ckmDeriveMech = new CK_MECHANISM(RtPkcs11Constants.CKM_GOSTR3410_DERIVE, deriveParam, new NativeLong(size));

            CK_ATTRIBUTE[] derivedKeyAttr = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(8);
            derivedKeyAttr[0].setAttr(Pkcs11Constants.CKA_CLASS,Pkcs11Constants.CKO_SECRET_KEY);
            derivedKeyAttr[1].setAttr(Pkcs11Constants.CKA_LABEL,"derived_key");
            derivedKeyAttr[2].setAttr(Pkcs11Constants.CKA_KEY_TYPE,RtPkcs11Constants.CKK_GOST28147);
            derivedKeyAttr[3].setAttr(Pkcs11Constants.CKA_TOKEN,false);
            derivedKeyAttr[4].setAttr(Pkcs11Constants.CKA_MODIFIABLE,true);
            derivedKeyAttr[5].setAttr(Pkcs11Constants.CKA_PRIVATE, true);
            derivedKeyAttr[6].setAttr(Pkcs11Constants.CKA_EXTRACTABLE, true);
            derivedKeyAttr[7].setAttr(Pkcs11Constants.CKA_SENSITIVE, false);

(2016-11-21 17:15:37 отредактировано kichnamid)

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

Спасибо! Попробуем
Порядок полей не такой как в документации: kdf, размер publicly key, сам ключ, размер ukm, сами ukm. Так и оставить, да?

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

Да, все верно. У этой структуры порядок полей отличается.