| ||||
| ||||
Подскажите пожалуйста как из подписи получить дату и время. Пробую: {--------------------------------------- Îïðåäåëèì äàòó è âðåìÿ ïîäïèñè ---------------------------------------} 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’ Как еще можно попробывать? | ||||
Ответы: | ||||
| ||||
authAttr.rgAttr - это массив длиной authAttr.cAttr. Надо просто перебрать его весь. | ||||
| ||||
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. Почему так может происходить? | ||||
| ||||
А вообще в подписанном сообщении этот атрибут есть? | ||||
| ||||
Должно быть. Вот так подписываю 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; | ||||
| ||||
Вы лучше результат подписи сюда в base64 выложите. | ||||
| ||||
Просмотрел подписанный файл через "Управление подписанными данными" - время создания ЭЦП там есть. А как вывести результат подписи в Base64 - я к сожалению не знаю. | ||||
| ||||
Я не очень хорошо помню паскаль но в любом случае в цикле перебора атрибутов должно быть что-то типа authAttr.rgAttr[i].pszObjId, authAttr.rgAttr[i].cValue - иначе всегда будет обращение к первому элементу массива. | ||||
| ||||
Мля!!! Ну я лошара. Стыжусь за столь глупую ошибку. Просто криво СИшный код на паскаль перевел. | ||||
| ||||
Hi! Nice site! I wish you well! | ||||