Несовместимость OpenSSL с Windows API

Я пытаюсь использовать службу меток времени в PHP и Windows.
Моя проблема в том, что выходные данные openssl не совместимы с CryptVerifyTimeStampSignature ().

Чтобы сгенерировать и загрузить запрос в Windows, я использую CryptRetrieveTimeStamp ():

            CRYPT_TIMESTAMP_CONTEXT*re;
CRYPT_TIMESTAMP_PARA r = { 0 };
r.fRequestCerts = true;

auto C = ... // my data
auto flg = TIMESTAMP_VERIFY_CONTEXT_SIGNATURE;
CryptRetrieveTimeStamp(url, flg, 0,
szOID_NIST_sha256, &r, (BYTE*)C.data(), C.size(), &re, 0, 0);

Чтобы сделать это в php, я использую openssl и curl

openssl ts -query -data inputfile -sha256 -cert -out file.tsq

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $tsa_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($requestfile_path));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/timestamp-query'));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
$binary_response_string = curl_exec($ch);

Пока все хорошо. Я получаю действительный ответ TSA.
Проблема заключается в том, что пока openssl может проверять оба ответа (из Windows API и из php):

openssl ts -verify -sha256 -digest "..." -in r:\1.dat -CAfile file.pem

Вызов Windows API завершается неудачно, когда ответом является openssl:

            PCRYPT_TIMESTAMP_CONTEXT re = 0;
BYTE* b = (BYTE*)...
auto sz = ...
auto Sig = ...
auto res = CryptVerifyTimeStampSignature(b,sz, (BYTE*)Sig.data(), Sig.size(), 0, &re, p, 0);

Результат:
@ ERR, hr 0x8009310b: встречено недопустимое значение тега ASN1. без знака int

Что может быть не так?

Большое спасибо.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]