Добавление аутентифицированных атрибутов с использованием 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, чтобы получить закодированный BLOB-объект
- CryptMsgClose, я закончил с сообщением на данный момент.
Я снова открываю сообщение, чтобы получить CMSG_ENCRYPTED_DIGEST, который отправляется TSA, и результат добавляется в качестве атрибута без проверки подлинности с использованием CryptMsgControl.
Я использую это для подписи тегов подписи в Adobe. Поэтому, когда нет аутентифицированных атрибутов, я получаю три зеленых чека от Adobe:
- Документ не был изменен...
- Документ подписан текущим пользователем
- Подпись включает в себя встроенную временную метку (и временная метка проверяется)
Но как только аутентифицированный атрибут добавлен, личность подписавшего становится недействительной, а данные метки времени неверными. CMSG_COMPUTED_HASH_PARAM, когда аутентифицированные атрибуты добавляются, а когда нет, отличается. Разве это не должно быть одинаковым? Поскольку дайджест документа состоит из содержимого документа, а не из аутентифицированного атрибута.
Есть ли другой способ добавить аутентифицированные атрибуты? Я пытался добавить его в качестве подписавшего с помощью CryptMsgControl, но это тоже не помогло...
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;