19.04.2005 10:06:09Дата и время подписи Ответов: 9
Дмитрий
Подскажите пожалуйста как из подписи получить дату и время.
Пробую:
{---------------------------------------
Îïðåäåëèì äàòó è âðåìÿ ïîäïèñè
---------------------------------------}
if not CryptMsgGetParam(
hMsg, {/* Handle to the message*/}
CMSG_SIGNER_AUTH_ATTR_PARAM, {/* Parameter type*/}
0, {/* Signer Index*/}
nil, {/* Address for returned info*/}
authAttr_len) then {/* Size of the returned info*/}
ShowMessage(’The attribute CMSG_SIGNER_AUTH_ATTR_PARAM is not included into message.\n’);


{ /* Ðåçåðâèðóåì ïàìÿòü*/}


GetMem(authAttr,authAttr_len);
{ /*--------------------------------------------------------------------*/
/* Âåðíåì àòðèáóò*/}

if not CryptMsgGetParam(
hMsg, {/* Handle to the message*/}
CMSG_SIGNER_AUTH_ATTR_PARAM, {/* Parameter type*/}
0, {/* Signer Index*/}
authAttr, {/* Address for returned info*/}
authAttr_len) then {/* Size of the returned info*/}
ShowMessage(’Decode CMSG_SIGNER_AUTH_ATTR_PARAM #2 failed’);




if (authAttr.rgAttr.pszObjId= szOID_RSA_signingTime) then .....

Вот здесь authAttr.rgAttr.pszObjId= Всегда ==’1.2.840.113549.1.9.3’
Как еще можно попробывать?
 
Ответы:
19.04.2005 10:37:42Kirill Sobolev
authAttr.rgAttr - это массив длиной authAttr.cAttr. Надо просто перебрать его весь.
28.09.2007 11:45:16Man
function get_signing_time(hMsg: HCRYPTMSG; signerIndex: Integer): TSYSTEMTIME;
var
ret: DWORD;
authAttr: PCRYPT_ATTRIBUTES;
authAttr_len: DWORD;
i: DWORD;
timeBlob: PCRYPT_ATTR_BLOB;
size: DWORD;
fileTime: TFILETIME;
systemTime: TSYSTEMTIME;
begin
authAttr := nil;
authAttr_len := 0;
i := 0;
timeBlob := nil;
size := 0;

if not CryptMsgGetParam(hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM, signerIndex,nil, @authAttr_len) then
begin
exit;
end;
if authAttr_len <> 0 then
begin
getmem(authAttr, authAttr_len);
end;
if authAttr = nil then exit;
CryptMsgGetParam(hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM, signerIndex, authAttr, @authAttr_len);
for i := 0 to authAttr.cAttr do
begin
if (CompareText(authAttr.rgAttr.pszObjId, szOID_RSA_signingTime)=0)
and (authAttr.rgAttr.cValue <> 0) then
begin
timeBlob := authAttr.rgAttr.rgValue;
size := sizeof (TFILETIME);
CryptDecodeObject(MY_ENCODING_TYPE, szOID_RSA_signingTime, timeBlob.pbData,timeBlob.cbData,0,@fileTime, @size);
end;
end;
if not FileTimeToSystemTime(fileTime, systemTime) then result := systemTime;
end;

Перебираю весь массив, но и в нем всегда встречается 1.2.840.113549.1.9.3. То есть contentType, а мне нужен signingTime. Почему так может происходить?
28.09.2007 11:47:51Kirill Sobolev
А вообще в подписанном сообщении этот атрибут есть?
28.09.2007 12:01:11Man
Должно быть. Вот так подписываю

FillChar(SigParams, SizeOf( CRYPT_SIGN_MESSAGE_PARA ), #0 );
SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType := MY_ENCODING_TYPE;
SigParams.pSigningCert := pSignerCert;
SigParams.HashAlgorithm.pszObjId := szOID_RSA_MD5;//pSignerCert.pCertInfo.SignatureAlgorithm.pszObjId;
SigParams.HashAlgorithm.Parameters.cbData := 0;
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @pSignerCert;
SigParams.cAuthAttr := 0;
SigParams.dwInnerContentType := 0;
SigParams.cMsgCrl := 0;
SigParams.cUnauthAttr := 0;
SigParams.dwFlags := 0;
SigParams.pvHashAuxInfo := nil;
SigParams.rgAuthAttr := nil;

GetSystemTime(systemTime);
SystemTimeToFileTime(systemTime, fileTime);

CryptEncodeObject(MY_ENCODING_TYPE, szOID_RSA_signingTime, @fileTime, nil, @cbAuth);

GetMem(pbAuth,cbAuth);

CryptEncodeObject(MY_ENCODING_TYPE, szOID_RSA_signingTime, @fileTime, pbAuth, @cbAuth);

cablob.cbData := cbAuth;
cablob.pbData := pbAuth;

ca.pszObjId := szOID_RSA_signingTime;
ca.cValue := 1;
ca.rgValue := @cablob;

SigParams.cAuthAttr := 1;
SigParams.rgAuthAttr := @ca;
28.09.2007 12:03:15Kirill Sobolev
Вы лучше результат подписи сюда в base64 выложите.
28.09.2007 12:52:41Man
Просмотрел подписанный файл через "Управление подписанными данными" - время создания ЭЦП там есть.

А как вывести результат подписи в Base64 - я к сожалению не знаю.
28.09.2007 13:51:03Kirill Sobolev
Я не очень хорошо помню паскаль
но в любом случае в цикле перебора атрибутов должно быть что-то типа
authAttr.rgAttr[i].pszObjId, authAttr.rgAttr[i].cValue - иначе всегда будет обращение к первому элементу массива.
28.09.2007 15:01:19Man
Мля!!! Ну я лошара. Стыжусь за столь глупую ошибку. Просто криво СИшный код на паскаль перевел.
05.11.2007 14:08:28Debbie
Hi! Nice site! I wish you well!