4

TSA サーバーからの応答を CryptSignMessage に追加するにはどうすればよいですか?

PKCS#7 を使用。現在、メッセージダイジェストがあり、crypto api からの CryptSignMessage で正常に署名しています。そのようです:

// Initialize the signature structure.
CRYPT_SIGN_MESSAGE_PARA  SigParams;
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;
SigParams.pSigningCert = hContext;
SigParams.HashAlgorithm.pszObjId = szOID_RSA_SHA1RSA;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &hContext;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.cAuthAttr = 0;
SigParams.rgAuthAttr = NULL;

// First, get the size of the signed BLOB.
if(CryptSignMessage(
    &SigParams,
    FALSE,
    1,
    MessageArray,
    MessageSizeArray,
    NULL,
    &cbSignedMessageBlob))
{
    printf("%d bytes needed for the encoded BLOB.", cbSignedMessageBlob);
}
else
{
    MyHandleError();
    fReturn = false;
    exit_SignMessage();
}

// Allocate memory for the signed BLOB.
if(!(pbSignedMessageBlob = 
   (BYTE*)malloc(cbSignedMessageBlob)))
{
    MyHandleError();
    exit_SignMessage();
}

// Get the signed message BLOB.
if(CryptSignMessage(
      &SigParams,
      TRUE,
      1,
      MessageArray,
      MessageSizeArray,
      pbSignedMessageBlob,
      &cbSignedMessageBlob))
{
    printf("The message was signed successfully. \n");


    // pbSignedMessageBlob now contains the signed BLOB.
    fReturn = true;
}
else
{
    MyHandleError();
    fReturn = false;
    exit_SignMessage();
}

現在、TSA サーバーを使用してダイジェストにタイムスタンプを付けたいと思っていますが、これを含める方法がよくわかりません。rfc3161 TimeStamp リクエストがあるとします。これを TSA に送信すると、rfc3161 TimeStamp 応答を受け取ります (おそらく libcurl を使用)。応答を SigParams にどのように組み込む必要がありますか? TimeStampToken を抽出して、認証されていない副署名として保存する必要がありますか? 何かのようなもの:

CRYPT_ATTR_BLOB cablob[1];
CRYPT_ATTRIBUTE ca[1];    
cablob[0].cbData = tstResponseSize; 
cablob[0].pbData = tstResponse; // the response from TSA

ca[0].pszObjId = "1.2.840.113549.9.6"; // object identifier for counter signature
ca[0].cValue = 1;
ca[0].rgValue = cablob;

次に、SigParams を設定します。

SigParams.cUnauthAtt = 1;
SigParams.rgUnauthAttr = ca;

アドバイスをいただければ幸いです。ありがとう、マグダ

4

1 に答える 1