08.02.2007 16:49:02Добавление атрибута в подписанное сообщение. Ответов: 11
Андрей
Есть некоторое подписанное сообщение, каким образом добавить в него неаутентифицированный атрибут?
Предлагается использовать CryptMsgControl с ключем CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR.
Соответственно, в структуре CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR заполняются все поля. И тут возникает непонятность с тем, как сказать какой OID будет у добавляемого атрибута.
Если при первоначальном создании подобная проблема решается использованием CRYPT_ATTRIBUTE, то в случае добавления в уже подписанное, там такой возможности не могу найти. Какие варианты решения даной проблемы?
 
Ответы:
08.02.2007 18:26:44Kirill Sobolev
Точно также. Заполняете CRYPT_ATTRIBUTE, потом кодируете его CryptEncodeObjectEx(..,PKCS_ATTRIBUTE,..) и получившийся ASN передаете через поле CRYPT_DATA_BLOB BLOB.
08.02.2007 19:15:34Андрей
Спасибо! Почему-то упустил из виду возможность кодирования самой структуры атрибута.
16.03.2007 14:52:00Андрей
Здравствуйте, при добавлении подписи к уже подписанному сообщению, возникает необходимость добавить unsigned атрибут к подписи. Добавление проходить успешно, но почему-то не для того подписавшего лица - все они складываются в самую первую подпись, т.е. подписав и добавив атрибут 5 раз, получим 5 подписей, и только первую с 5 атрибутами.
При добавлении такого атрибута используется структура CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA
в ней задается параметр dwSignerIndex, соответствующий текущему индексу добавляемой подписи. Как можно побороть данную проблему?
19.03.2007 10:48:07Андрей
Почему-то начинает меняться порядок подписей при добавлении unauth атрибута.

Т.е. при добавлении подписи с таким атрибутом и последующим добавлением подписей CryptMsgControl с CMSG_CTRL_ADD_SIGNER, подписи начинают идти с порядком 2, 1, потом 2, 3, 1 и т.д.
19.03.2007 12:11:37Kirill Sobolev
Собственно dwSignerIndex и определяет, к какой подписи будет добавлен атрибут.
А вообще порядок подписей в PKCS7 нефиксирован
SignerInfos ::= SET OF SignerInfo
19.03.2007 12:59:06Андрей
Тогда как определять, какой подписи добавить атрибут, если их порядок не фиксирован?
По идее, надо при создании подписи, получить какой-то идентификатор подписи? Но опять же, непонятно, под каким номером добавилась подпись. Замкнутый круг?
19.03.2007 13:31:46Kirill Sobolev
Идентификатор подписи - это реквизиты подписчика.
19.03.2007 14:44:57Андрей
Под реквизитами понимается серийный номер сертификата и выдавшее лицо? Но тогда, если подписчик подпишет файл несколько раз, то будет несколько подписей с одними идентификаторами, что не даст определить порядковый номер подписи же?
19.03.2007 15:34:49Kirill Sobolev
не даст
а какой смысл подписывать один и тот же файл несколько раз?
19.03.2007 15:40:02Андрей
Ну пользователю всякое может захотеться:(.
Т.е., получается, что стандартными средствами CryptoApi не получится понять, какой индекс у подписи и, соответственно, добавление по нужным индексам атрибутов?
19.03.2007 16:14:40Kirill Sobolev
Если один и тот же пользователь подписывает один и тот же файл несколько раз - то эти подписи равнозначны и все равно в какую добавлять атрибут.
Если знать чем одна подпись от другой отличается, то индекс определить можно, именно средствами CryptoAPI.