Поиск объектов

Rutoken под Android. На токене один сертификат. Пытаюсь найти все объекты типа PublicKey (он один). Поиск возвращает, что ни одного объекта не найдено. Может, где ошибка - или PublicKey в начале надо генерить.

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

NativeLong pubKeyHandle = findObject(mPkcs11, session, template);
f (pubKeyHandle == null) {
    Log.e(LOG_TAG, "PublicKey objects not found");
        return;
}

private NativeLong findObject(RtPkcs11 pkcs11, NativeLong session, CK_ATTRIBUTE[] template)
    throws Pkcs11Exception {
    NativeLong rv = pkcs11.C_FindObjectsInit(session,
                template, new NativeLong(template.length));
        if (!rv.equals(Pkcs11Constants.CKR_OK)) {
            throw Pkcs11Exception.exceptionWithCode(rv);
        }

        final NativeLong objects[] = new NativeLong[1];
        NativeLongByReference count =
                new NativeLongByReference(new NativeLong(objects.length));
        rv = pkcs11.C_FindObjects(session, objects, new NativeLong(objects.length),
                count);
        if (!rv.equals(Pkcs11Constants.CKR_OK)) {
            throw Pkcs11Exception.exceptionWithCode(rv);
        }

        rv = pkcs11.C_FindObjectsFinal(session);
        if (!rv.equals(Pkcs11Constants.CKR_OK)) {
            throw Pkcs11Exception.exceptionWithCode(rv);
        }

        if (count.getValue().intValue() <= 0) return null;

        return objects[0];
}

Re: Поиск объектов

Здравствуйте.
К сожалению, не все виды сертификатов могут быть использованы через PKCS#11 интерфейс.
Чтобы проверить подключите пожалуйста токен к компьютеру с windows и установленными "драйверами Рутокен для windows" и посмотрите, пожалуйста, что за сертификат показывается в панели управления Рутокен

(2015-10-06 12:23:09 отредактировано Oleg Shishkin)

Re: Поиск объектов

https://forum.rutoken.ru/uploads/transfer/0/8500/8860/thumb/p1a0u7c2pm19h94m11gs3kg51ned2.jpg
Сертификат получен у вас. Сертификат читается, читаются его атрибуты.

Re: Поиск объектов

спасибо, а можно не свойства сертификата прислать, а именно как он выглядит в панели в списке сертификатов.
персданные закрасьте :)

Re: Поиск объектов

https://forum.rutoken.ru/uploads/transfer/0/8500/8863/thumb/p1a0u4hlqe2jk1oc7f7118e1i6e1.pnghttps://forum.rutoken.ru/uploads/transfer/0/8500/8863/thumb/p1a0u4hlqe10nm1ud4qjv1hdo13g92.pnghttps://forum.rutoken.ru/uploads/transfer/0/8500/8863/thumb/p1a0u4hlqe14a6281q5mj56uml3.pnghttps://forum.rutoken.ru/uploads/transfer/0/8500/8863/thumb/p1a0u4hlqee504qr182u1s0a1lf44.png
Сертификат читается, читаются его атрибуты

Re: Поиск объектов

Очевидно, у вас на устройстве есть только сертификат, а ключевой пары нет и соответственно открытого ключа тоже нет.

Нужно чтобы была ключевая пара.

Однако, сначала создается ключевая пара, а только потом - сертификат.

Откуда вы взяли этот сертификат?

Re: Поиск объектов

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

Очевидно, у вас на устройстве есть только сертификат, а ключевой пары нет и соответственно открытого ключа тоже нет.

Нужно чтобы была ключевая пара.

Однако, сначала создается ключевая пара, а только потом - сертификат.

Откуда вы взяли этот сертификат?

Просто загрузил в токен. У меня есть пример - на токене есть сертификат. В сертификате есть PublicKey - на его базе создается PrivateKey.
Но чтобы создать PrivateKey - нужен handle на PublicKey. Вы можете сказать почему не ищется объект класса PublicKey? Если ответить не можете - можете дать пример кода (или ссылку) под Android, как генерить пару ключей с использованием API 2.* (т.е. где используются для типов атрибутов pType NativeLong). В SDK все примеры под API 1.1 c типами int. К сожалению под Android приложение c API  1.1 падает при использовании функций с CK_ATTRIBUTE.

Re: Поиск объектов

И еще - можно ли грузить пары ключей в токен и если можно - то каким образом это делается?

Re: Поиск объектов

Олег, к сожалению вы ошибаетесь.

вы пишете "В сертификате есть PublicKey - на его базе создается PrivateKey" и еще "чтобы создать PrivateKey - нужен handle на PublicKey"

публичный и приватный ключи создаются одновременно и оба хендла одновременно возвращаются функцией C_GenerateKeyPair (название намекает)

потом создается заявка на сертификат, которая будет содержать в себе значение PublicKey
заявка на сертификат подписывается в УЦ и пользователю возвращается сертификат (тоже содержащий значение PublicKey)

Если вы этот сертификат на токен запишете - то у вас будут на токене объекты PrivateKey, PublicKey и объект Certificate.
Сертификат внутри себя содержит "значение" PublicKey, но не хендл, никак.

Re: Поиск объектов

т.е. Вы констатируюте, что имеется у меня в наличие кривой сертификат?

Re: Поиск объектов

сертификат не может быть кривым.
Но он может быть оторванным от ключевой пары. Где ваша ключевая пара, на которой этот сертификат был выписан - мне неизвестно.
Именно поэтому я и задал вопрос, на который вы не ответили: "откуда вы взяли этот сертификат"?

Re: Поиск объектов

Можно ли где получить примеры функций (например генерации пары ключей) под API 2.* на Java (Android)?

Re: Поиск объектов

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

сертификат не может быть кривым.
Но он может быть оторванным от ключевой пары. Где ваша ключевая пара, на которой этот сертификат был выписан - мне неизвестно.
Именно поэтому я и задал вопрос, на который вы не ответили: "откуда вы взяли этот сертификат"?

мне его предоставили - как пример сертификата, с которым я должен работать

Re: Поиск объектов

Oleg Shishkin пишет:

Можно ли где получить примеры функций (например генерации пары ключей) под API 2.* на Java (Android)?

Олег, от того что вы несколько раз повторяете вопрос - понятнее не становится.
Объясните, что вы понимаете под понятием API 2.* на Java (Android) ? Киньте ссылку, чтоли?

Re: Поиск объектов

Пример описания взятого из SDK 1 для для класса CK_ATTRIBUTE
public class CK_ATTRIBUTE extends Structure {
    public CK_ATTRIBUTE() {super();}

    public CK_ATTRIBUTE(int type, Pointer pVal, int ulValLen) {
        this.type = type;
        this.pValue = pVal;
        this.ulValueLen = ulValLen;

    }
    public int type;
    public Pointer pValue;
    /* ulValueLen went from CK_USHORT to CK_ULONG for v2.0 */
    int          ulValueLen;  /* in bytes */
}