Добавление аутентифицированных атрибутов с помощью MS CryptoApi

Я изо всех сил пытаюсь добавить аутентифицированные атрибуты (данные OCSP) в свое сообщение с помощью CryptoApi. Сначала я использовал упрощенные функции сообщений CryptoApi, но теперь переключился на низкоуровневые функции сообщений, думая, что смогу лучше контролировать структуру сообщений. Но я снова застрял. Мой процесс выглядит следующим образом:

  • Инициализировать структуру CMSG_SIGNER_ENCODE_INFO и CMSG_SIGNED_ENCODE_INFO.
  • Я создаю CRYPT_ATTRIBUTE для даты ocsp и указываю ее в структуре CMSG_SIGNER_ENCODE_INFO.
  • Затем я вызываю CryptMsgCalculateEncodedLength, чтобы получить размер
  • CryptMsgOpenToEncode с CMSG_SIGNED в качестве типа сообщения
  • CryptMsgUpdate, чтобы вставить мой контент в сообщение
  • CryptMsgGetParam с CMSG_CONTENT_PARAM для получения закодированного большого двоичного объекта.
  • CryptMsgClose, на данный момент я закончил с сообщением.

Я снова открываю сообщение, чтобы получить CMSG_ENCRYPTED_DIGEST, который отправляется в TSA, а результат добавляется как атрибут без проверки подлинности с помощью CryptMsgControl.

Я использую это для подписи тегов подписи в Adobe. Поэтому, когда нет аутентифицированных атрибутов, я получаю три зеленых галочки от Adobe:

  1. Документ не изменен...
  2. Документ подписан текущим пользователем
  3. Подпись включает встроенную отметку времени (и отметка времени проверена)

Но как только аутентифицированный атрибут добавлен, личность подписывающей стороны становится недействительной, а данные метки времени неверными. CMSG_COMPUTED_HASH_PARAM, когда атрибуты аутентификации добавляются, а когда нет, отличается. Разве это не должно быть то же самое? Поскольку дайджест документа относится к содержимому документа, а не к аутентифицированному атрибуту.

Есть ли другой способ добавить аутентифицированные атрибуты? Я пытался добавить его в качестве подписанта с помощью CryptMsgControl, но это тоже не помогло...


person Magda    schedule 27.02.2014    source источник


Ответы (1)


как насчет этого шага по добавлению аутентифицированных атрибутов для подписи, например, отметки времени,

CryptEncodeObject(PKCS_7_ASN_ENCODING, szOID_RSA_signingTime, &curtime, pTime, &szTime);
pTime = (BYTE *)LocalAlloc(GPTR, szTime);
CryptEncodeObject(PKCS_7_ASN_ENCODING, szOID_RSA_signingTime, &curtime, pTime, &szTime);
time_blob.cbData = szTime;
time_blob.pbData = pTime;
attrib[0].pszObjId = szOID_RSA_signingTime;
attrib[0].cValue = 1;
attrib[0].rgValue = &time_blob;
CosignerInfo.cAuthAttr = 1;
CosignerInfo.rgAuthAttr = attrib;

и что параметры Cosigner взяты из CMSG_SIGNER_ENCODE_INFO CosignerInfo;

person Nona Haron    schedule 11.12.2014