Atom Лента - Форум КриптоПро - Тема:CryptSignMessage detached сохранение подписи - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:CryptSignMessagedetachedsokhraneniepodpisi-10:1Copyright 2024 Форум КриптоПро2024-03-29T11:08:53Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruTreno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Андрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Андрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1Андрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *Treno1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=25157&name=Treno1YetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid29538:1CryptSignMessage detached сохранение подписи<table class="content postContainer_Alt" width="100%"><tr><td>Решено без "мусора":<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">int VerifySignedMessage(
char* infile,char* outfile)
{
int fReturn = 0;
CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
FILE *infile_f;
char infile_str[512] = {'\0'};
char tmpi[512] = {NULL};
char outfile_str[512] = {'\0'};
char* tmpo;
FILE *outfile_f;
BYTE* pbContent;
DWORD cbContent;
DWORD cbpb;
DWORD cbEncodedBlob;
BYTE* pbEncodedBlob;
HCRYPTPROV hCryptProv; // CSP handle
HCERTSTORE hStoreHandle; // Store handle
PCCERT_CONTEXT pSignerCert; // Signer certificate
CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo;
CMSG_SIGNER_ENCODE_INFO SignerEncodeInfoArray[1];
CERT_BLOB SignerCertBlob;
CERT_BLOB SignerCertBlobArray[1];
CMSG_SIGNED_ENCODE_INFO SignedMsgEncodeInfo;
HCRYPTMSG hMsg;
DWORD dwKeySpec;
CRYPT_VERIFY_MESSAGE_PARA msgPara;
long lSize;
outfile_f = fopen(outfile, "rb");
if(!outfile_f) {
return(0);
}
fseek (outfile_f , 0 , SEEK_END);
lSize = ftell (outfile_f);
rewind (outfile_f);
tmpo = (char*) malloc (sizeof(char)*lSize);
// copy the file into the buffer:
cbEncodedBlob = fread (tmpo,1,lSize,outfile_f);
if (cbEncodedBlob != lSize) {
return(0);
}
infile_f = fopen(infile, "rb");
if(!infile_f) {
return(0);
}
while(!feof(infile_f))
{
fgets(infile_str, 512, infile_f);
strcat(tmpi,infile_str);
}
pbContent = (BYTE*)tmpi;
cbContent = strlen((char *) pbContent);
cbpb = strlen((char *)tmpo);
//---------------------------------------------------------------
// Allocate memory for the encoded BLOB.
if(!(pbEncodedBlob = (BYTE *) malloc(cbpb)))
{
MyHandleError("Malloc operation failed.");
}
pbEncodedBlob = (BYTE*)tmpo;
msgPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
msgPara.dwMsgAndCertEncodingType =
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
msgPara.hCryptProv = NULL;
msgPara.pfnGetSignerCertificate = NULL;
msgPara.pvGetArg = NULL;
if ( CryptVerifyDetachedMessageSignature(
&msgPara,
0,
pbEncodedBlob,
cbEncodedBlob,
1,
&pbContent,
&cbContent,
NULL
) )
{
printf("The Signature verified.\n");
free(pbEncodedBlob);
fReturn = 1;
}
else
{
DWORD tmp;
tmp = GetLastError();
if(GetLastError() == CRYPT_E_ASN1_BADTAG)
printf("1");
if(GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE)
printf("2");
if(GetLastError() == CRYPT_E_NO_SIGNER)
printf("3");
if(GetLastError() == NTE_BAD_ALGID)
printf("4");
if(GetLastError() == NTE_BAD_SIGNATURE)
printf("5");
if(GetLastError() == CRYPT_E_ASN1_EOD)
printf("6");
printf("Verification message failed.\n");
}
return fReturn;
}</code></pre>
</div></div><br /><br />А теперь мне надо чтобы сертификат из detached файла проверялся на отозванность и доверие. Как я понял нужно последним параметром в CryptVerifyDetachedMessageSignature передать указатель на сертификат и с ним работать. Спасибо!</td></tr></table>2012-07-31T18:01:39+03:002012-07-31T18:01:39+03:00Treno1<table class="content postContainer_Alt" width="100%"><tr><td>Решено без "мусора":<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">int VerifySignedMessage(
char* infile,char* outfile)
{
int fReturn = 0;
CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
FILE *infile_f;
char infile_str[512] = {'\0'};
char tmpi[512] = {NULL};
char outfile_str[512] = {'\0'};
char* tmpo;
FILE *outfile_f;
BYTE* pbContent;
DWORD cbContent;
DWORD cbpb;
DWORD cbEncodedBlob;
BYTE* pbEncodedBlob;
HCRYPTPROV hCryptProv; // CSP handle
HCERTSTORE hStoreHandle; // Store handle
PCCERT_CONTEXT pSignerCert; // Signer certificate
CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo;
CMSG_SIGNER_ENCODE_INFO SignerEncodeInfoArray[1];
CERT_BLOB SignerCertBlob;
CERT_BLOB SignerCertBlobArray[1];
CMSG_SIGNED_ENCODE_INFO SignedMsgEncodeInfo;
HCRYPTMSG hMsg;
DWORD dwKeySpec;
CRYPT_VERIFY_MESSAGE_PARA msgPara;
long lSize;
outfile_f = fopen(outfile, "rb");
if(!outfile_f) {
return(0);
}
fseek (outfile_f , 0 , SEEK_END);
lSize = ftell (outfile_f);
rewind (outfile_f);
tmpo = (char*) malloc (sizeof(char)*lSize);
// copy the file into the buffer:
cbEncodedBlob = fread (tmpo,1,lSize,outfile_f);
if (cbEncodedBlob != lSize) {
return(0);
}
infile_f = fopen(infile, "rb");
if(!infile_f) {
return(0);
}
while(!feof(infile_f))
{
fgets(infile_str, 512, infile_f);
strcat(tmpi,infile_str);
}
pbContent = (BYTE*)tmpi;
cbContent = strlen((char *) pbContent);
cbpb = strlen((char *)tmpo);
//---------------------------------------------------------------
// Allocate memory for the encoded BLOB.
if(!(pbEncodedBlob = (BYTE *) malloc(cbpb)))
{
MyHandleError("Malloc operation failed.");
}
pbEncodedBlob = (BYTE*)tmpo;
msgPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
msgPara.dwMsgAndCertEncodingType =
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
msgPara.hCryptProv = NULL;
msgPara.pfnGetSignerCertificate = NULL;
msgPara.pvGetArg = NULL;
if ( CryptVerifyDetachedMessageSignature(
&msgPara,
0,
pbEncodedBlob,
cbEncodedBlob,
1,
&pbContent,
&cbContent,
NULL
) )
{
printf("The Signature verified.\n");
free(pbEncodedBlob);
fReturn = 1;
}
else
{
DWORD tmp;
tmp = GetLastError();
if(GetLastError() == CRYPT_E_ASN1_BADTAG)
printf("1");
if(GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE)
printf("2");
if(GetLastError() == CRYPT_E_NO_SIGNER)
printf("3");
if(GetLastError() == NTE_BAD_ALGID)
printf("4");
if(GetLastError() == NTE_BAD_SIGNATURE)
printf("5");
if(GetLastError() == CRYPT_E_ASN1_EOD)
printf("6");
printf("Verification message failed.\n");
}
return fReturn;
}</code></pre>
</div></div><br /><br />А теперь мне надо чтобы сертификат из detached файла проверялся на отозванность и доверие. Как я понял нужно последним параметром в CryptVerifyDetachedMessageSignature передать указатель на сертификат и с ним работать. Спасибо!</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29531:1CryptSignMessage detached сохранение подписи<table class="content postContainer" width="100%"><tr><td>Получаеться что я заного создаю подпись и потом вставляю в pbEncodedBlob то , что считал с файла. Это наверное не правильно?</td></tr></table>2012-07-31T17:28:46+03:002012-07-31T17:28:46+03:00Treno1<table class="content postContainer" width="100%"><tr><td>Получаеться что я заного создаю подпись и потом вставляю в pbEncodedBlob то , что считал с файла. Это наверное не правильно?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29529:1CryptSignMessage detached сохранение подписи<table class="content postContainer_Alt" width="100%"><tr><td>Это не мусор<br /><br /><br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite/html/group___l_l_msg_func.html" title="http://cpdn.cryptopro.ru/content/capilite/html/group___l_l_msg_func.html">Низкоуровневые</a> vs <a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite/html/group___simpl_msg_func.html" title="http://cpdn.cryptopro.ru/content/capilite/html/group___simpl_msg_func.html">Высокоуровневые </a>функции <br /><br />определять тебе, какие использовать...</td></tr></table>2012-07-31T17:21:14+03:002012-07-31T17:21:14+03:00Андрей *<table class="content postContainer_Alt" width="100%"><tr><td>Это не мусор<br /><br /><br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite/html/group___l_l_msg_func.html" title="http://cpdn.cryptopro.ru/content/capilite/html/group___l_l_msg_func.html">Низкоуровневые</a> vs <a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite/html/group___simpl_msg_func.html" title="http://cpdn.cryptopro.ru/content/capilite/html/group___simpl_msg_func.html">Высокоуровневые </a>функции <br /><br />определять тебе, какие использовать...</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29527:1CryptSignMessage detached сохранение подписи<table class="content postContainer" width="100%"><tr><td>szOID_OIWSEC_sha1RSASign криптоАрм тоже дал успех.<br /><br />Ещё вот такой вопрос:<br /><br />В моей функции проверки я думаю что слишком много мусора, но без него ничего не работает.<br /><br />Вот что я думаю что мусор:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">if(!(cbEncodedBlob = CryptMsgCalculateEncodedLength(
MY_ENCODING_TYPE, // Message encoding type
0, // Flags
CMSG_SIGNED, // Message type
&SignedMsgEncodeInfo, // Pointer to structure
NULL, // Inner content OID
cbContent))) // Size of content
{
MyHandleError("Getting cbEncodedBlob length failed.");
}
//---------------------------------------------------------------
// Allocate memory for the encoded BLOB.
if(!(pbEncodedBlob = (BYTE *) malloc(cbEncodedBlob)))
{
MyHandleError("Malloc operation failed.");
}
//---------------------------------------------------------------
// Open a message to encode.
if(!(hMsg = CryptMsgOpenToEncode(
MY_ENCODING_TYPE, // Encoding type
CMSG_DETACHED_FLAG, // Flags
CMSG_SIGNED, // Message type
&SignedMsgEncodeInfo, // Pointer to structure
NULL, // Inner content OID
NULL))) // Stream information (not used)
{
MyHandleError("OpenToEncode failed");
}
//---------------------------------------------------------------
// Update the message with the data.
if(!(CryptMsgUpdate(
hMsg, // Handle to the message
pbContent, // Pointer to the content
cbContent, // Size of the content
TRUE))) // Last call
{
MyHandleError("MsgUpdate failed");
}
//---------------------------------------------------------------
// Get the resulting message.
if(!CryptMsgGetParam(
hMsg, // Handle to the message
CMSG_CONTENT_PARAM, // Parameter type
0, // Index
pbEncodedBlob, // Pointer to the BLOB
&cbEncodedBlob)) // Size of the BLOB
{
MyHandleError("MsgGetParam failed.");
}
//---------------------------------------------------------------
// The message is signed and encoded.
// Close the message handle and the certificate store.
CryptMsgClose(hMsg);
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_FORCE_FLAG);
CryptReleaseContext(hCryptProv, 0);</code></pre>
</div></div><br /><br />Получаеться что я заного создаю подпись и потом вставляю в pbEncodedBlob то , что считал с файла. Это наверное не правильно.<br /><br />Когда я считываю из .sig файла то получаю cbEncodedBlob 1388, а программа получает для новой подписи cbEncodedBlob 1408 и выделяет память на pbEncodedBlob 1408, а потом через CryptMsgGetParam делает 1388 в cbEncodedBlob. Это всё посылаеться в CryptVerifyDetachedMessageSignature и получаю valid.<br /><br />Если я убираю "мусор" и выделяю 1388 памяти под pbEncodedBlob и записиваю туда всё что считал из файла то в CryptVerifyDetachedMessageSignature я получаю CRYPT_E_ASN1_BADTAG или CRYPT_E_ASN1_EOD. <br /><br />Что делать с мусором?</td></tr></table>2012-07-31T17:13:59+03:002012-07-31T17:13:59+03:00Treno1<table class="content postContainer" width="100%"><tr><td>szOID_OIWSEC_sha1RSASign криптоАрм тоже дал успех.<br /><br />Ещё вот такой вопрос:<br /><br />В моей функции проверки я думаю что слишком много мусора, но без него ничего не работает.<br /><br />Вот что я думаю что мусор:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">if(!(cbEncodedBlob = CryptMsgCalculateEncodedLength(
MY_ENCODING_TYPE, // Message encoding type
0, // Flags
CMSG_SIGNED, // Message type
&SignedMsgEncodeInfo, // Pointer to structure
NULL, // Inner content OID
cbContent))) // Size of content
{
MyHandleError("Getting cbEncodedBlob length failed.");
}
//---------------------------------------------------------------
// Allocate memory for the encoded BLOB.
if(!(pbEncodedBlob = (BYTE *) malloc(cbEncodedBlob)))
{
MyHandleError("Malloc operation failed.");
}
//---------------------------------------------------------------
// Open a message to encode.
if(!(hMsg = CryptMsgOpenToEncode(
MY_ENCODING_TYPE, // Encoding type
CMSG_DETACHED_FLAG, // Flags
CMSG_SIGNED, // Message type
&SignedMsgEncodeInfo, // Pointer to structure
NULL, // Inner content OID
NULL))) // Stream information (not used)
{
MyHandleError("OpenToEncode failed");
}
//---------------------------------------------------------------
// Update the message with the data.
if(!(CryptMsgUpdate(
hMsg, // Handle to the message
pbContent, // Pointer to the content
cbContent, // Size of the content
TRUE))) // Last call
{
MyHandleError("MsgUpdate failed");
}
//---------------------------------------------------------------
// Get the resulting message.
if(!CryptMsgGetParam(
hMsg, // Handle to the message
CMSG_CONTENT_PARAM, // Parameter type
0, // Index
pbEncodedBlob, // Pointer to the BLOB
&cbEncodedBlob)) // Size of the BLOB
{
MyHandleError("MsgGetParam failed.");
}
//---------------------------------------------------------------
// The message is signed and encoded.
// Close the message handle and the certificate store.
CryptMsgClose(hMsg);
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_FORCE_FLAG);
CryptReleaseContext(hCryptProv, 0);</code></pre>
</div></div><br /><br />Получаеться что я заного создаю подпись и потом вставляю в pbEncodedBlob то , что считал с файла. Это наверное не правильно.<br /><br />Когда я считываю из .sig файла то получаю cbEncodedBlob 1388, а программа получает для новой подписи cbEncodedBlob 1408 и выделяет память на pbEncodedBlob 1408, а потом через CryptMsgGetParam делает 1388 в cbEncodedBlob. Это всё посылаеться в CryptVerifyDetachedMessageSignature и получаю valid.<br /><br />Если я убираю "мусор" и выделяю 1388 памяти под pbEncodedBlob и записиваю туда всё что считал из файла то в CryptVerifyDetachedMessageSignature я получаю CRYPT_E_ASN1_BADTAG или CRYPT_E_ASN1_EOD. <br /><br />Что делать с мусором?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29524:1CryptSignMessage detached сохранение подписи<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Treno1 написал:</span><blockquote>Решено: добавлением подписи по ГОСТу ,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">SigParams.HashAlgorithm.pszObjId = szOID_GostR3411_94_CryptoProParamSet;</code></pre>
</div></div><br />Удалением лишних +1 к хешу,<br />Правильной записью в файл,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">fwrite(pbSignedMessageBlob,sizeof(BYTE),cbSignedMessageBlob,outfile_f);</code></pre>
</div></div><br /><br />Единственное что, я не нашёл как проверять сертификат на отозванность и доверенность.</div></div><br /><br /><img src="/forum2/Images/Emoticons/eusa_clap.gif" alt="Applause" /> <br /><br />szOID_GostR3411_94_CryptoProParamSet - конечно, а если будет сертификат RSA ? <img src="/forum2/Images/Emoticons/eusa_shifty.gif" alt="Anxious" /> <br /><br /><em>(по первому куску кода хотел было спросить... а если будет не RSA <img src="/forum2/Images/Emoticons/eusa_shifty.gif" alt="Anxious" /> )</em></td></tr></table>2012-07-31T16:55:36+03:002012-07-31T16:55:36+03:00Андрей *<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Treno1 написал:</span><blockquote>Решено: добавлением подписи по ГОСТу ,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">SigParams.HashAlgorithm.pszObjId = szOID_GostR3411_94_CryptoProParamSet;</code></pre>
</div></div><br />Удалением лишних +1 к хешу,<br />Правильной записью в файл,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">fwrite(pbSignedMessageBlob,sizeof(BYTE),cbSignedMessageBlob,outfile_f);</code></pre>
</div></div><br /><br />Единственное что, я не нашёл как проверять сертификат на отозванность и доверенность.</div></div><br /><br /><img src="/forum2/Images/Emoticons/eusa_clap.gif" alt="Applause" /> <br /><br />szOID_GostR3411_94_CryptoProParamSet - конечно, а если будет сертификат RSA ? <img src="/forum2/Images/Emoticons/eusa_shifty.gif" alt="Anxious" /> <br /><br /><em>(по первому куску кода хотел было спросить... а если будет не RSA <img src="/forum2/Images/Emoticons/eusa_shifty.gif" alt="Anxious" /> )</em></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29523:1CryptSignMessage detached сохранение подписи<table class="content postContainer" width="100%"><tr><td>Решено: добавлением подписи по ГОСТу ,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">SigParams.HashAlgorithm.pszObjId = szOID_GostR3411_94_CryptoProParamSet;</code></pre>
</div></div><br />Удалением лишних +1 к хешу,<br />Правильной записью в файл,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">fwrite(pbSignedMessageBlob,sizeof(BYTE),cbSignedMessageBlob,outfile_f);</code></pre>
</div></div><br /><br />Единственное что, я не нашёл как проверять сертификат на отозванность и доверенность.</td></tr></table>2012-07-31T16:44:28+03:002012-07-31T16:44:28+03:00Treno1<table class="content postContainer" width="100%"><tr><td>Решено: добавлением подписи по ГОСТу ,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">SigParams.HashAlgorithm.pszObjId = szOID_GostR3411_94_CryptoProParamSet;</code></pre>
</div></div><br />Удалением лишних +1 к хешу,<br />Правильной записью в файл,<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">fwrite(pbSignedMessageBlob,sizeof(BYTE),cbSignedMessageBlob,outfile_f);</code></pre>
</div></div><br /><br />Единственное что, я не нашёл как проверять сертификат на отозванность и доверенность.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29479:1CryptSignMessage detached сохранение подписи<table class="content postContainer_Alt" width="100%"><tr><td>Полный код ниже.<br /><br />А разве есть разница какой тип данный записывать в файл?<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>int SignMessage(CRYPT_DATA_BLOB *pSignedMessageBlob,char* infile,char* outfile,char* signer_name)<br />{<br /> int fReturn = 0;<br /> BYTE* pbMessage;<br /> DWORD cbMessage;<br /> HCERTSTORE hCertStore = NULL; <br /> PCCERT_CONTEXT pSignerCert; <br /> CRYPT_SIGN_MESSAGE_PARA SigParams;<br /> DWORD cbSignedMessageBlob;<br /> BYTE *pbSignedMessageBlob = NULL;<br /> const BYTE* MessageArray[] = {"\0"};<br /> DWORD_PTR MessageSizeArray[1];<br /> FILE *infile_f;<br /> char infile_str[512] = {'\0'};<br /> FILE *outfile_f;<br /> wchar_t *convCp_wbuf = NULL;<br /> unsigned short convCp_wbuf_len;<br /> LPCSTR lpszCertSubject;<br /><br /> convCp_wbuf_len = MultiByteToWideChar( CP_ACP , 0, signer_name, -1, NULL, 0);<br /> convCp_wbuf = calloc( sizeof( wchar_t ) , convCp_wbuf_len );<br /><br /> if(MultiByteToWideChar( CP_ACP, 0, signer_name, -1, convCp_wbuf, convCp_wbuf_len)){<br /> lpszCertSubject = (LPCSTR)convCp_wbuf;<br /> }<br /><br /> infile_f = fopen(infile, "rb");<br /> if(!infile_f) {<br /> return(0);<br /> }<br /><br /> while(!feof(infile_f))<br /> {<br /> fgets(infile_str, 512, infile_f);<br /> pbMessage = (BYTE*)infile_str;<br /> }<br /> MessageArray[0] = pbMessage;<br /> fclose(infile_f);<br /> // Initialize the output pointer.<br /> pSignedMessageBlob->cbData = 0;<br /> pSignedMessageBlob->pbData = NULL;<br /><br /> // Calculate the size of message. To include the <br /> // terminating null character, the length is one more byte <br /> // than the length returned by the strlen function.<br /> cbMessage = (lstrlen((TCHAR*) pbMessage) + 1) * sizeof(TCHAR);<br /><br /> MessageSizeArray[0] = cbMessage;<br /><br /> // Begin processing. <br /> _tprintf(TEXT("The message to be signed is \"%s\".\n"),<br /> pbMessage);<br /><br /> // Open the certificate store.<br /> if ( !( hCertStore = CertOpenStore(<br /> CERT_STORE_PROV_SYSTEM,<br /> 0,<br /> NULL,<br /> CERT_SYSTEM_STORE_CURRENT_USER,<br /> CERT_STORE_NAME)))<br /> {<br /> MyHandleError(TEXT("The MY store could not be opened."));<br /> goto exit_SignMessage;<br /> }<br /><br /> //MultiByteToWideChar(CP_ACP, 0, signer_name, strlen(signer_name)+1, signer_name,strlen(signer_name)+1);<br /><br /> // Get a pointer to the signer's certificate.<br /> // This certificate must have access to the signer's private key.<br /> if(pSignerCert = CertFindCertificateInStore(<br /> hCertStore,<br /> MY_ENCODING_TYPE,<br /> 0,<br /> CERT_FIND_SUBJECT_STR,<br /> lpszCertSubject,<br /> NULL))<br /> {<br /> _tprintf(TEXT("The signer's certificate was found.\n"));<br /> }<br /> else<br /> {<br /> MyHandleError( TEXT("Signer certificate not found."));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Initialize the signature structure.<br /> SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);<br /> SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;<br /> SigParams.pSigningCert = pSignerCert;<br /> SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;<br /> SigParams.HashAlgorithm.Parameters.cbData = NULL;<br /> SigParams.cMsgCert = 1;<br /> SigParams.rgpMsgCert = &pSignerCert;<br /> SigParams.cAuthAttr = 0;<br /> SigParams.dwInnerContentType = 0;<br /> SigParams.cMsgCrl = 0;<br /> SigParams.cUnauthAttr = 0;<br /> SigParams.dwFlags = 0;<br /> SigParams.pvHashAuxInfo = NULL;<br /> SigParams.rgAuthAttr = NULL;<br /><br /> // First, get the size of the signed BLOB.<br /> if(CryptSignMessage(<br /> &SigParams,<br /> TRUE,<br /> 1,<br /> MessageArray,<br /> MessageSizeArray,<br /> NULL,<br /> &cbSignedMessageBlob))<br /> {<br /> _tprintf(TEXT("%d bytes needed for the encoded BLOB.\n"),<br /> cbSignedMessageBlob);<br /> }<br /> else<br /> {<br /> MyHandleError(TEXT("Getting signed BLOB size failed"));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Allocate memory for the signed BLOB.<br /> if(!(pbSignedMessageBlob = <br /> (BYTE*)malloc(cbSignedMessageBlob)))<br /> {<br /> MyHandleError(<br /> TEXT("Memory allocation error while signing."));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Get the signed message BLOB.<br /> if(CryptSignMessage(<br /> &SigParams,<br /> TRUE,<br /> 1,<br /> MessageArray,<br /> MessageSizeArray,<br /> pbSignedMessageBlob,<br /> &cbSignedMessageBlob))<br /> {<br /> _tprintf(TEXT("The message was signed successfully. \n"));<br /><br /> // pbSignedMessageBlob now contains the signed BLOB.<br /> fReturn = 1;<br /> }<br /> else<br /> {<br /> MyHandleError(TEXT("Error getting signed BLOB"));<br /> goto exit_SignMessage;<br /> }<br /><br />exit_SignMessage:<br /><br /> // Clean up and free memory as needed.<br /> if(pSignerCert)<br /> {<br /> CertFreeCertificateContext(pSignerCert);<br /> }<br /> <br /> if(hCertStore)<br /> {<br /> CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG);<br /> hCertStore = NULL;<br /> }<br /><br /> // Only free the signed message if a failure occurred.<br /> if(!fReturn)<br /> {<br /> if(pbSignedMessageBlob)<br /> {<br /> free(pbSignedMessageBlob);<br /> pbSignedMessageBlob = NULL;<br /> }<br /> }<br /><br /> if(pbSignedMessageBlob)<br /> {<br /> char buf[256] = {NULL};<br /> outfile_f = fopen(outfile, "wb");<br /> if(!outfile_f) {<br /> return(0);<br /> }<br /> strcpy(buf,(char*)pbSignedMessageBlob);<br /> strcat(buf,"\0");<br /> fprintf(outfile_f, buf); <br /> fclose(outfile_f);<br /> }<br /> <br /> return fReturn;<br />}</div></div></td></tr></table>2012-07-30T18:59:05+03:002012-07-30T18:59:05+03:00Treno1<table class="content postContainer_Alt" width="100%"><tr><td>Полный код ниже.<br /><br />А разве есть разница какой тип данный записывать в файл?<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>int SignMessage(CRYPT_DATA_BLOB *pSignedMessageBlob,char* infile,char* outfile,char* signer_name)<br />{<br /> int fReturn = 0;<br /> BYTE* pbMessage;<br /> DWORD cbMessage;<br /> HCERTSTORE hCertStore = NULL; <br /> PCCERT_CONTEXT pSignerCert; <br /> CRYPT_SIGN_MESSAGE_PARA SigParams;<br /> DWORD cbSignedMessageBlob;<br /> BYTE *pbSignedMessageBlob = NULL;<br /> const BYTE* MessageArray[] = {"\0"};<br /> DWORD_PTR MessageSizeArray[1];<br /> FILE *infile_f;<br /> char infile_str[512] = {'\0'};<br /> FILE *outfile_f;<br /> wchar_t *convCp_wbuf = NULL;<br /> unsigned short convCp_wbuf_len;<br /> LPCSTR lpszCertSubject;<br /><br /> convCp_wbuf_len = MultiByteToWideChar( CP_ACP , 0, signer_name, -1, NULL, 0);<br /> convCp_wbuf = calloc( sizeof( wchar_t ) , convCp_wbuf_len );<br /><br /> if(MultiByteToWideChar( CP_ACP, 0, signer_name, -1, convCp_wbuf, convCp_wbuf_len)){<br /> lpszCertSubject = (LPCSTR)convCp_wbuf;<br /> }<br /><br /> infile_f = fopen(infile, "rb");<br /> if(!infile_f) {<br /> return(0);<br /> }<br /><br /> while(!feof(infile_f))<br /> {<br /> fgets(infile_str, 512, infile_f);<br /> pbMessage = (BYTE*)infile_str;<br /> }<br /> MessageArray[0] = pbMessage;<br /> fclose(infile_f);<br /> // Initialize the output pointer.<br /> pSignedMessageBlob->cbData = 0;<br /> pSignedMessageBlob->pbData = NULL;<br /><br /> // Calculate the size of message. To include the <br /> // terminating null character, the length is one more byte <br /> // than the length returned by the strlen function.<br /> cbMessage = (lstrlen((TCHAR*) pbMessage) + 1) * sizeof(TCHAR);<br /><br /> MessageSizeArray[0] = cbMessage;<br /><br /> // Begin processing. <br /> _tprintf(TEXT("The message to be signed is \"%s\".\n"),<br /> pbMessage);<br /><br /> // Open the certificate store.<br /> if ( !( hCertStore = CertOpenStore(<br /> CERT_STORE_PROV_SYSTEM,<br /> 0,<br /> NULL,<br /> CERT_SYSTEM_STORE_CURRENT_USER,<br /> CERT_STORE_NAME)))<br /> {<br /> MyHandleError(TEXT("The MY store could not be opened."));<br /> goto exit_SignMessage;<br /> }<br /><br /> //MultiByteToWideChar(CP_ACP, 0, signer_name, strlen(signer_name)+1, signer_name,strlen(signer_name)+1);<br /><br /> // Get a pointer to the signer's certificate.<br /> // This certificate must have access to the signer's private key.<br /> if(pSignerCert = CertFindCertificateInStore(<br /> hCertStore,<br /> MY_ENCODING_TYPE,<br /> 0,<br /> CERT_FIND_SUBJECT_STR,<br /> lpszCertSubject,<br /> NULL))<br /> {<br /> _tprintf(TEXT("The signer's certificate was found.\n"));<br /> }<br /> else<br /> {<br /> MyHandleError( TEXT("Signer certificate not found."));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Initialize the signature structure.<br /> SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);<br /> SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;<br /> SigParams.pSigningCert = pSignerCert;<br /> SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;<br /> SigParams.HashAlgorithm.Parameters.cbData = NULL;<br /> SigParams.cMsgCert = 1;<br /> SigParams.rgpMsgCert = &pSignerCert;<br /> SigParams.cAuthAttr = 0;<br /> SigParams.dwInnerContentType = 0;<br /> SigParams.cMsgCrl = 0;<br /> SigParams.cUnauthAttr = 0;<br /> SigParams.dwFlags = 0;<br /> SigParams.pvHashAuxInfo = NULL;<br /> SigParams.rgAuthAttr = NULL;<br /><br /> // First, get the size of the signed BLOB.<br /> if(CryptSignMessage(<br /> &SigParams,<br /> TRUE,<br /> 1,<br /> MessageArray,<br /> MessageSizeArray,<br /> NULL,<br /> &cbSignedMessageBlob))<br /> {<br /> _tprintf(TEXT("%d bytes needed for the encoded BLOB.\n"),<br /> cbSignedMessageBlob);<br /> }<br /> else<br /> {<br /> MyHandleError(TEXT("Getting signed BLOB size failed"));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Allocate memory for the signed BLOB.<br /> if(!(pbSignedMessageBlob = <br /> (BYTE*)malloc(cbSignedMessageBlob)))<br /> {<br /> MyHandleError(<br /> TEXT("Memory allocation error while signing."));<br /> goto exit_SignMessage;<br /> }<br /><br /> // Get the signed message BLOB.<br /> if(CryptSignMessage(<br /> &SigParams,<br /> TRUE,<br /> 1,<br /> MessageArray,<br /> MessageSizeArray,<br /> pbSignedMessageBlob,<br /> &cbSignedMessageBlob))<br /> {<br /> _tprintf(TEXT("The message was signed successfully. \n"));<br /><br /> // pbSignedMessageBlob now contains the signed BLOB.<br /> fReturn = 1;<br /> }<br /> else<br /> {<br /> MyHandleError(TEXT("Error getting signed BLOB"));<br /> goto exit_SignMessage;<br /> }<br /><br />exit_SignMessage:<br /><br /> // Clean up and free memory as needed.<br /> if(pSignerCert)<br /> {<br /> CertFreeCertificateContext(pSignerCert);<br /> }<br /> <br /> if(hCertStore)<br /> {<br /> CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG);<br /> hCertStore = NULL;<br /> }<br /><br /> // Only free the signed message if a failure occurred.<br /> if(!fReturn)<br /> {<br /> if(pbSignedMessageBlob)<br /> {<br /> free(pbSignedMessageBlob);<br /> pbSignedMessageBlob = NULL;<br /> }<br /> }<br /><br /> if(pbSignedMessageBlob)<br /> {<br /> char buf[256] = {NULL};<br /> outfile_f = fopen(outfile, "wb");<br /> if(!outfile_f) {<br /> return(0);<br /> }<br /> strcpy(buf,(char*)pbSignedMessageBlob);<br /> strcat(buf,"\0");<br /> fprintf(outfile_f, buf); <br /> fclose(outfile_f);<br /> }<br /> <br /> return fReturn;<br />}</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29478:1CryptSignMessage detached сохранение подписи<table class="content postContainer" width="100%"><tr><td>ну и где кусок по заполнению памяти данными?<br /> MessageArray<br /><br />судя по блоку: <br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>char buf[256]</div></div><br />char передаешь? и правильно, что не понимают другие средства для проверки ЭЦП... <br /><br />ps. byte* нужно ... </td></tr></table>2012-07-30T18:53:05+03:002012-07-30T18:53:05+03:00Андрей *<table class="content postContainer" width="100%"><tr><td>ну и где кусок по заполнению памяти данными?<br /> MessageArray<br /><br />судя по блоку: <br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>char buf[256]</div></div><br />char передаешь? и правильно, что не понимают другие средства для проверки ЭЦП... <br /><br />ps. byte* нужно ... </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid29477:1CryptSignMessage detached сохранение подписи<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день!<br /><br />Проблема такова: Подписываю файл с помощью CryptSignMessage, записываю подпись в файл, но не криптоАрм не csptest подпись не понимают. csptest выдаёт "В ASN1 встречен неожиданный конец данных". Самописная программа с CryptVerifyDetachedMessageSignature подпись понимает и считает valid`ной. Чего я сделал не правильно?<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pSignerCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
// First, get the size of the signed BLOB.
if(CryptSignMessage(
&SigParams,
TRUE,
1,
MessageArray,
MessageSizeArray,
NULL,
&cbSignedMessageBlob))
{
_tprintf(TEXT("%d bytes needed for the encoded BLOB.\n"),
cbSignedMessageBlob);
}
else
{
MyHandleError(TEXT("Getting signed BLOB size failed"));
goto exit_SignMessage;
}
// Allocate memory for the signed BLOB.
if(!(pbSignedMessageBlob =
(BYTE*)malloc(cbSignedMessageBlob)))
{
MyHandleError(
TEXT("Memory allocation error while signing."));
goto exit_SignMessage;
}
// Get the signed message BLOB.
if(CryptSignMessage(
&SigParams,
TRUE,
1,
MessageArray,
MessageSizeArray,
pbSignedMessageBlob,
&cbSignedMessageBlob))
{
_tprintf(TEXT("The message was signed successfully. \n"));
// pbSignedMessageBlob now contains the signed BLOB.
fReturn = 1;
}
else
{
MyHandleError(TEXT("Error getting signed BLOB"));
goto exit_SignMessage;
}
if(pbSignedMessageBlob)
{
char buf[256] = {NULL};
outfile_f = fopen(outfile, "wb");
if(!outfile_f) {
return(0);
}
strcpy(buf,(char*)pbSignedMessageBlob);
strcat(buf,"\0");
fprintf(outfile_f, buf);
fclose(outfile_f);
}</code></pre>
</div></div></td></tr></table>2012-07-30T18:37:48+03:002012-07-30T18:37:48+03:00Treno1<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день!<br /><br />Проблема такова: Подписываю файл с помощью CryptSignMessage, записываю подпись в файл, но не криптоАрм не csptest подпись не понимают. csptest выдаёт "В ASN1 встречен неожиданный конец данных". Самописная программа с CryptVerifyDetachedMessageSignature подпись понимает и считает valid`ной. Чего я сделал не правильно?<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pSignerCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
// First, get the size of the signed BLOB.
if(CryptSignMessage(
&SigParams,
TRUE,
1,
MessageArray,
MessageSizeArray,
NULL,
&cbSignedMessageBlob))
{
_tprintf(TEXT("%d bytes needed for the encoded BLOB.\n"),
cbSignedMessageBlob);
}
else
{
MyHandleError(TEXT("Getting signed BLOB size failed"));
goto exit_SignMessage;
}
// Allocate memory for the signed BLOB.
if(!(pbSignedMessageBlob =
(BYTE*)malloc(cbSignedMessageBlob)))
{
MyHandleError(
TEXT("Memory allocation error while signing."));
goto exit_SignMessage;
}
// Get the signed message BLOB.
if(CryptSignMessage(
&SigParams,
TRUE,
1,
MessageArray,
MessageSizeArray,
pbSignedMessageBlob,
&cbSignedMessageBlob))
{
_tprintf(TEXT("The message was signed successfully. \n"));
// pbSignedMessageBlob now contains the signed BLOB.
fReturn = 1;
}
else
{
MyHandleError(TEXT("Error getting signed BLOB"));
goto exit_SignMessage;
}
if(pbSignedMessageBlob)
{
char buf[256] = {NULL};
outfile_f = fopen(outfile, "wb");
if(!outfile_f) {
return(0);
}
strcpy(buf,(char*)pbSignedMessageBlob);
strcat(buf,"\0");
fprintf(outfile_f, buf);
fclose(outfile_f);
}</code></pre>
</div></div></td></tr></table>