Подпись с помощью функции C_EX_PKCS7Sign не проходит. OS iOS

Добрый день.

Пытаюсь подписать некоторые данные используя C_EX_PKCS7Sign, но она всегда отдает в результате CKR_ATTRIBUTE_TYPE_INVALID.

Используемые код:

CK_OBJECT_CLASS keyClass = CKO_PUBLIC_KEY;
CK_ATTRIBUTE template[] = {
      {CKA_CLASS, &keyClass, sizeof(keyClass)},
      {CKA_ID, (void*)[[certificate id] bytes], [[certificate id] length]},
};

rv = _functions->C_FindObjectsInit(_session, template, ARRAY_LENGTH(template));
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];
   
rv = _functions->C_FindObjects(_session, &publicKey, 1, &count);
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];
   
rv = _functions->C_FindObjectsFinal(_session);
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];
   
if (count != 1) {
   [Pkcs11Error initWithDescription:@"public key for certificate not found"];
}

CK_BYTE_PTR signature;
CK_ULONG signatureSize;

unsigned char data[7] = "qwerty";
rv = _extendedFunctions->C_EX_PKCS7Sign(_session, data, sizeof(data), publicKey, &signature, &signatureSize, 0, NULL, 0, 0);

Здесь rv получается равен 18.
Подскажите, пожалуйста, что я делаю не так?

> Пользователь авторизован.
> если вместо вызова C_EX_PKCS7Sign использовать кусок кода из https://github.com/AktivCo/rutoken-demo … ken.m#L385 с openssl, то все работает.

Re: Подпись с помощью функции C_EX_PKCS7Sign не проходит. OS iOS

Добрый день.
Подпись производится с помощью закрытого ключа (private key). Именно его необходимо передавать в вызов C_EX_PKCS7Sign.
Описание функции доступно по ссылке https://dev.rutoken.ru/pages/viewpage.a … KCS7Sign()
Вам необходимо поправить шаблон поиска ключа.
Открытый ключ (public key) используется для проверки подписи.

Re: Подпись с помощью функции C_EX_PKCS7Sign не проходит. OS iOS

Спасибо за ответ, но это не помогает. rv также равен 18.

Прикладываю код:

CK_OBJECT_HANDLE privateKey;

CK_OBJECT_CLASS keyClass1 = CKO_PRIVATE_KEY;
CK_ATTRIBUTE template1[] = {
  {CKA_CLASS, &keyClass1, sizeof(keyClass1)},
  {CKA_ID, (void*)[[certificate id] bytes], [[certificate id] length]},
};
   
rv = _functions->C_FindObjectsInit(_session, template1, ARRAY_LENGTH(template1));
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];

rv = _functions->C_FindObjects(_session, &privateKey, 1, &count);
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];

rv = _functions->C_FindObjectsFinal(_session);
if (CKR_OK != rv) [Pkcs11Error initWithCode:rv];

if (count != 1) {
   [Pkcs11Error initWithDescription:@"private key for certificate not found"];
}

rv = _extendedFunctions->C_EX_PKCS7Sign(_session, data, sizeof(data), publicKey, &signature, &signatureSize, privateKey, NULL, 0, 0);

У вас в документации указано, что передача приватного ключа не обязательна:
"hPrivKey - дескриптор закрытого ключа, соответствующего указанному сертификату. Если равен 0, то закрытый ключ будет искаться по ID сертификата"

Re: Подпись с помощью функции C_EX_PKCS7Sign не проходит. OS iOS

SergeyRT пишет:

rv = _extendedFunctions->C_EX_PKCS7Sign(_session, data, sizeof(data), publicKey, &signature, &signatureSize, privateKey, NULL, 0, 0);

Вы передаете дескриптор publicKey, а необходимо передавать дескриптор сертификата.

Re: Подпись с помощью функции C_EX_PKCS7Sign не проходит. OS iOS

действительно, спасибо!