Взаимодействие с RSA сертификатами в Android приложении.

Добрый день, подскажите, пожалуйста,

1. Как корректно получить ссылки на публичный и закрытый ключи от RSA сертификата? Пример из гитхаба (https://github.com/AktivCo/rutoken-demo … r.java#L36) ориентирован на ГОСТ алгоритмы.

2. Подпись сертификатом RSA с алгоритмов хеширования sha256 (sha512) не проходит проверку подписи. У Вас в документации (https://dev.rutoken.ru/pages/viewpage.a … 0%BC%D1%8B) указано, что алгоритмы хеширования sha256/sha512 не поддерживаются, но в коде присутствуют переменнные Pkcs11Constants.CKM_SHA256 (Pkcs11Constants.CKM_SHA512).
При подписи сертификатом RSA с алгоритмом хеширования sha1 или md5 проверка подписи проходит успешно.

Re: Взаимодействие с RSA сертификатами в Android приложении.

Добрый день!

Отвечу по пунктам.

1. Пример шаблона открытого/закрытого ключа для поиска объектов через С_FindObjects есть в примере из Комплекта разработчика Руутокен по пути внутри архива <sdk>\java\samples\pkcs11\src\ru\rutoken\samples\pkcs11\PKIExtensionsRSA.java
Также в этом примере есть пример хеширования, используя SHA-256.

2. В документации была неточность, спасибо, что сообщили. SHA-256 и SHA-512 поддерживаются. Расскажите, пожалуйста, как вы подписываете и чем проверяете подпись?

(2021-11-12 10:18:37 отредактировано SergeyRT)

Re: Взаимодействие с RSA сертификатами в Android приложении.

Спасибо за ответ,

1) данный пример видел, но он не очень понятен. Вызывает трудности сопоставление значения из X509CertificateHolder и keyValue для RSA сертификатов.

CK_ATTRIBUTE[] pubKeyTemplate = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(3);

final NativeLongByReference keyClass =
        new NativeLongByReference(new NativeLong(Pkcs11Constants.CKO_PUBLIC_KEY));
pubKeyTemplate[0].type = new NativeLong(Pkcs11Constants.CKA_CLASS);
pubKeyTemplate[0].pValue = keyClass.getPointer();
pubKeyTemplate[0].ulValueLen = new NativeLong(NativeLong.SIZE);

ByteBuffer valueBuffer = ByteBuffer.allocateDirect(keyValue.length);
valueBuffer.put(keyValue);
pubKeyTemplate[1].type = new NativeLong(Pkcs11Constants.CKA_VALUE);
pubKeyTemplate[1].pValue = Native.getDirectBufferPointer(valueBuffer);
pubKeyTemplate[1].ulValueLen = new NativeLong(keyValue.length);

final NativeLongByReference keyClass1 =
        new NativeLongByReference(new NativeLong(Pkcs11Constants.CKK_RSA));
pubKeyTemplate[2].type = new NativeLong(Pkcs11Constants.CKA_KEY_TYPE);
pubKeyTemplate[2].pValue = keyClass1.getPointer();
pubKeyTemplate[2].ulValueLen = new NativeLong(NativeLong.SIZE);

2) Увидел обновление в документации

CKM_SHA_256 для хеширования алгоритмом SHA-256 (только программно),
CKM_SHA_512 для хеширования алгоритмом SHA-512 (только программно),

Переменные CKM_SHA_256 и CKM_SHA_512 не находит, верно ли название?
Есть только Pkcs11Constants.CKM_SHA256.

Для sha256:
- в функцию (https://github.com/AktivCo/rutoken-demo … e.java#L32) передаю makeMechanism(CKM_RSA_PKCS)
- в функции (https://github.com/AktivCo/rutoken-demo … r.java#L32) добавляю новый AlgorithmIdentifier return new AlgorithmIdentifier(new ASN1ObjectIdentifier("1.2.840.113549.1.1.11")); // sha256WithRSAEncryption
- в функцию (https://github.com/AktivCo/rutoken-demo … r.java#L25) также добавляю новый AlgorithmIdentifier return new AlgorithmIdentifier(new ASN1ObjectIdentifier("2.16.840.1.101.3.4.2.1")); // sha-256
- создал класс наследуемый от Pkcs11Digest, которая вызывает Pkcs11Digest с параметром Pkcs11Constants.CKM_SHA256. Длина хеша равна 32.
- Для RSA CK_MECHANISM формируется как return new CK_MECHANISM(new NativeLong(type), null, new NativeLong(0))

Подпись проверял через онлайн сервисы проверки подписи (криптопро, контур)

Re: Взаимодействие с RSA сертификатами в Android приложении.

Проблема в том что у ГОСТ-ключей есть CKA_VALUE, у RSA нет. Таков стандарт PKCS11.
RSA ключи надо искать по-другому, например, по СKA_ID объекта.

Напишите нам hotline@rutoken.ru - будет легче обмениваться программным кодом.