:: Visual Foxpro, Foxpro for DOS
Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Добрый день!

Разбираюсь сейчас с Приложением №2 к приказу Министерства юстиции Российской Федерации от 24 мая 2018 г. № 89 "Формат предоставления сведений...", в котором содержится пункт:

2. Сведения представляют собой электронный документ ... содержащий метку времени (для электронного документа, подписанного усиленной квалифицированной электронной подписью), наложенную в соответствии со спецификацией Internet X.509 PublicKeyInfrastructureTime-StampProtocol (TSP) и спецификацией CAdES-T (ETSI TS 101 733 «CMSAdvancedElectronicSignatures (CadES)

Такая метка времени формируется внутри блока подписи Signature XML-документа и выглядит, как показано на скриншотах ниже:

[attachment 31403 MetkaVremeni01.jpg]

На первом скриншоте сформированная метка времени, содержащаяся в теге ds:Object, показана в свёрнутом виде.
А на втором скриншоте продемонстрирован тот же узел, содержащий метку времени ds:Object в развернутом виде.

[attachment 31404 MetkaVremeni02.jpg]

Каким образом, с помощью CryptoAPI или как-то иначе сформировать подобную метку времени?

Например, значение для заполнения тега (элемента) dsigestValue формируется с помощью последовательности вызовов CryptoAPI-функций CryptAcquireContextA, CryptSetProvParam, CryptCreateHash, CryptGetHashParam и CryptHashData, с последующим CryptDestroyHash и CryptReleaseContext.

Здесь же вообще непонятно с какой стороны подходить и существует ли CryptoAPI для работы с TSP и CAdES-T ?
Для экспериментирования можно использовать TSP-сервер компании КриптоПро testca.cryptopro.ru
Для тестирования меток времени в запросах можно использовать тестовый сервис Крипто-Про www.cryptopro.ru

Подскажите, в какую сторону копать, чтобы реализовать данный функционал не на java, где есть все необходимые библиотеки и можео даже развернуть собственный TSP-сервер?
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
sphinx

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Здесь ничего не натолкнет?

www.cryptopro.ru

Описание формата CadES: docplayer.ru и tools.ietf.org


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
Привет Роман

Что вы знаете о EncapsulatedTimeStamp?
Если вы получите примеры того, как получить его в C++, дайте мне знать, чтобы проверить и перейти на Fox, я хочу включить это в свою библиотеку, даже если я еще не использую его.
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
Роман, мы должны прочитать это:
docs.microsoft.com

Я нашел бесплатный TSA, его можно было бы использовать для тестирования.
www.freetsa.org

Внизу страницы есть несколько примеров с openssl, это не выглядит так сложно.
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Доброй ночи!

Для начала попробую объяснить суть вопроса на русском. Если что-то будет непонятно, позже могу уточнить отдельные детали.

Упомянутые спецификации Internet X.509 PublicKeyInfrastructureTime-StampProtocol (TSP) и CAdES-T (ETSI TS 101 733 «CMSAdvancedElectronicSignatures (CadES) являются де-факто мировыми стандартами, а не используются лишь в какой-то одной стране мира. Вместе с тем, не уверен, что компания Microsoft их уже реализовала или собирается реализовывать в своих библиотеках CryptoAPI.

В России в органах исполнительной власти и местного самоуправления де-юре с 2010 года, а де-факто с 2012 года так называемая Система Межведомственного Электронного Взаимодействия (SMEV), в которой используется криптография в соответствии с российскими и международными стандартами. Российские криптографические алгоритмы реализованы в виде надстройки (введены дополнительные ID алгоритмов) к стандартному CryptoAPI Windows и это всё в настоящее время портировано в Linux и в другие платформы. Существуют два или более независимых разработчиков, имеющих лицензии от органа, уполномоченного по вопросам криптографии в России. Это компании CryptoPro и VipNet. Мы работаем с первой из них.

Особенности создания подписанных CMS сообщений в CryptoPro CSP 3.6 и выше: Для того, чтобы создаваемые с помощью CryptoAPI сообщения могли быть впоследствии дополнены до форматов усовершенствованной ЭЦП (CAdES-T, CAdES-X Long Type 1 и других), они должны как минимум соответствовать базовому формату усовершенствованной ЭЦП (CAdES BES).

Формат электронной подписи CAdES BES требует наличия в подписанном сообщении подписанного атрибута, идентифицирующего сертификат подписывающего:

•SigningCertificate (для подписей с алгоритмом хэширования SHA1),
•SigningCertificateV2 (для подписей с остальными алгоритмами хэширования).

Поскольку после создания подписи нельзя добавлять или изменять подписанные атрибуты, криптопровайдер CryptoPro CSP при создании подписанного сообщения с использованием российского национального алгоритма GOST R 34.10/34.11 добавляет к нему подписанный атрибут SigningCertificateV2.

Также в сообщение добавляется отметка о времени создания подписи в виде подписанного атрибута signingTime (время в атрибуте указывается по часам локального компьютера).

Особенности добавления атрибутов

Добавление атрибутов SigningCertificateV2 и signingTime затрагивает работу следующих функций: CryptMsgOpenToEncode, CryptMsgControl, CryptMsgCalculateEncodedLength и CryptSignMessage.

Атрибуты SigningCertificateV2 и signingTime не будут добавлены в подписанное сообщение, если выполняется хотя бы одно из следующих условий:
•В параметрах вызова функции уже указан хотя бы один из подписанных атрибутов: SigningCertificate, SigningCertificateV2 или otherSigningCertificate.
•Алгоритм подписи не GOST R 34.10/34.11
•Не удаётся найти сертификат лица, создающего электронную подпись, необходимый для вычисления значения атрибута SigningCertificateV2

Поиск сертификата ключа электронной подписи

В функцию CryptSignMessage сертификат ключа электронной подписи передаётся в качестве аргумента, в то время как при использовании функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl производится его поиск в следующих местах:
•В контейнере закрытого ключа
•В коллекции сертификатов, добавленных в подписанное сообщение
•В хранилищах "My" (Личные) текущего пользователя и локального компьютера (если не указан флаг CPCMSG_CADES_DISABLE_CERT_SEARCH)

Для поиска сертификата используется имя издателя и серийный номер, заданный в качестве идентификатора подписывающего при вызове функции. Если в качестве идентификатора подписывающего указан идентификатор ключа, поиск сертификата не ведётся и атрибуты в сообщение не добавляются.

Отключение добавления атрибутов

Существуют следующие способы отключить добавление атрибутов SigningCertificateV2 и signingTime в подписанное сообщение:
•Задать флаг, отключающий добавление атрибутов (CPCMSG_CADES_DISABLE/CPCRYPT_MESSAGE_CADES_DISABLE)
•Установить параметр реестра, отключающий добавление атрибутов (AddEsAttribute)

Параметр dwFlags для функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl может содержать дополнительные флаги, определённые в файле WinCryptEx.h.

Добавление атрибутов на всём компьютере регулируется параметром реестра AddEsAttribute. Если данный параметр отсутствует, то добавление дополнительных атрибутов будет производиться. Для того, чтобы отключить добавление атрибутов, нужно добавить параметр AddEsAttribute типа DWORD и значением 0 в ветку реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters".

Библиотеки компании CryptoPro и руководство разработчика описаны здесь: cpdn.cryptopro.ru Криптопровайдер CryptoPro CSP 4.0 с поддержкой российских криптоалгоритмов можно загрузить с сайта компании после бесплатной регистрации. Его полнофункциональная версия (без ввода ключа) будет работать 90 дней. В дальнейшем, ключ можно приобрести менее чем за $40 или можно переустановить ПО на другой компьютер и пользоваться ещё 3 месяца.

Чтобы не возникало проблем с кодировкой при использовании реализации CryptoAPI от компании CryptoPro, которая обеспечивает в Windows 100% совместимость с Microsoft CryptoAPI и расширяет его поддержкой российских криптоалгоритмов, рекомендуется по возможности пользоваться только widechar-вариантами функций (например, CryptAcquireContextW)

Штамп времени в CryptoPro можно получить при помощи tsputil.exe. Тестовый сервер штампов времени компании CryptoPro поддерживает анонимный доступ, т.е. клиентский сертификат в запросах к нему не нужен. Для разработки программного обеспечения для проставления штампов (меток) времени необходим TSP SDK версии 1.05 или выше. В C++ рабочим вариантом точно является
CryptoPro::PKI::TSP::Client::CStamp Stamp(Request.Send(false));
В полученном штампе времени должен присутствовать сертификат службы штампов. Полученный штамп можно сохранить в файл с расширением .tsr, тогда его можно будет открыть и посмотреть его свойства. Сертификат тестового удостоверяющего центра должен быть установлен в хранилище Доверенные корневые центры сертификации.

Функция Verify находится в библиотеке tspcli, прототип можно посмотреть в файле tspcli.h. Функция Verify имеет тип возвращаемого значения не unsigned int, а int, поэтому важно, чтобы файл tspcli.h у вас был из нового SDK.

int Verify(PCCERT_CONTEXT pCert = NULL, char *AllowedCriticalExtensions = NULL) const;

Пример реализации на C++ функции, успешно отрабатывающей на тестовом сервере Крипто ПРО: www.cryptopro.ru

Как реализовать вызов функций из CryptoPro SDK на VFP не знаю! У кого-то есть идеи без написания внешней dll/fll?



Исправлено 1 раз(а). Последнее : rvc44, 04.09.19 02:05
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
У нас есть собственный развёрнутый TSA сервер и мне известна еще куча адресов. К сожалению, большинство из них находятся в защищенной сети, изолированной от Интернета. России до Китая еще далеко, но закон о суверенном интернете уже подготовили "на случай войны".
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Вы в курсе, что для использования не тестового, а продуктивного TSA-сервера необходимо, чтобы раздел "Улучшенный ключ" используемого сертификата содержал объектный идентификатор OID = "1.3.6.1.5.5.7.3.8" ("Установка отметки времени")? Кстати, одним из условий штатного функционирования TSA/TSP-сервера является наличие регулярно загружаемых актуальных (не просроченных) списков отзыва сертификатов. У нас эта задача настроена в планировщикe задач в виде .bat файла и выполняется по настроенному расписанию. Если задача вдруг по каким-то причинам не отработала, то сервер TSP не сможет проставить метку времени, которая необходима, чтобы удостовериться, что на сервере подписания XML-запроса установлено правильное время. Поэтому мне стала интересна тема, как отказаться от .bat файла и реализовать загрузку CRL lists программно через CryptoAPI, поскольку точки распространения списков отзыва (CDP) не всегда бывают доступны. В этих случаях нужно использовать резервные CDP. В России метки времени активно использует пока только одно ведомство - Федеральная служба судебных приставов (ФССП России). Соответственно, для взаимодействия с ними необходимо иметь весь этот реализованный функционал. В SMEV2 метки времени только в формате XAdES, а не CAdES использовало еще Федеральное казначейство. Но в новой версии SMEV3 от них решено было отказаться и их убрали из описания формата взаимодействия, поскольку далеко не все участники взаимодействия - контрагенты, могли их реализовать на своей стороне. Это сложно и дорого. Казначейство всем прощало и закрывало глаза. С ФССП России такой номер не пройдет! Они ежемесячно заваливают всех Губернаторов регионов письмами с жалобами, что с ними никто не взаимодействует, регулярно вынося всем мозг. Поэтому, не реагировать нельзя, нужно разбираться.



Исправлено 3 раз(а). Последнее : rvc44, 04.09.19 03:00
Ratings: 0 negative/0 positive
Re: Как наложить метку времени в соответствии со спецификацией TSP и спецификацией CAdES-T?
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
Чтобы получить значение узла EncapsultatedTimeStamp, для формата Xades-T в соответствии с руководством ETSI: www.etsi.org должен быть создан хеш для значения узла подписи "<ds: SignatureValue id = value_uri_of_your_node> этот хэш должен быть передан в TSA, который будет отмечать временную подпись.
В следующем примере мы используем бесплатный TSA для тех, кто находится в сети, со значением Hash, которое я ранее получил из значения узла SignatureValue, и алгоритмом.
Надеюсь, это поможет вам развернуть Xades-T.
Привет!

#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
#DEFINE TIMESTAMP_DONT_HASH_DATA 0x00000001
#DEFINE TIMESTAMP_VERIFY_CONTEXT_SIGNATURE 0x00000020
#DEFINE TIMESTAMP_NO_AUTH_RETRIEVAL 0x00020000
#DEFINE CERT_STORE_CERTIFICATE_CONTEXT 0x00000001
#DEFINE X509_ASN_ENCODING 0x00000001
#DEFINE PKCS_7_ASN_ENCODING 0x00010000
CLEAR
=SetDeclarationAPI()
*------------ Servidores TSA de prueba
lcUrl = "http://time.certum.pl" && OK
*lcUrl = "http://dse200.ncipher.com/TSS/HttpTspServer" && FAIL, NOT FOUND
*lcUrl = "http://tsa.tecxoft.com" && FAIL, SE HA ENCONTRADO UN VALOR DE ETIQUETA INCORRECTO
*lcUrl = "http://zeitstempel.dfn.de" && OK, rapido pro no da TSA
*lcUrl = "https://ca.signfiles.com/tsa/get.aspx" && FAIL, NO SE PUEDE COMPROBAR EL CERTIFICADO CA
*lcUrl = "https://tsp.iaik.tugraz.at/tsp/TspRequest" && OK - DEMO no da TSA
*lcUrl = "http://tsa.starfieldtech.com" && OK, rapido pro no da TSA
*lcUrl = "http://timestamp.comodoca.com/rfc3161" && OK
*lcUrl = "http://services.globaltrustfinder.com/adss/tsa" && FAIL, NOT FOUND
*lcUrl = "https://timestamp.geotrust.com/tsa" && FAIL, NOT FOUND
*lcUrl = "http://sha256timestamp.ws.symantec.com/sha256/timestamp" && OK
*lcUrl = "http://timestamp.globalsign.com/scripts/timstamp.dll" && OK
*lcUrl = "http://timestamp.comodoca.com" && OK
*lcUrl = "https://freetsa.org/tsr" && OK, TSA defectuoso
lcHashToStamp = "00bpE3vtYVJamTeSmgvZ48biWmO1dju9lf4WK50B7zo="
lcAlgorithm = "2.16.840.1.101.3.4.2.1"
SET STEP ON
=GetCryptRetrieveTimeStamp(lcUrl, lcHashToStamp, lcAlgorithm)
PROCEDURE GetCryptRetrieveTimeStamp()
LPARAMETERS tcUrl AS String, tcHashToStamp AS String, tcAlgorithm AS String
wszUrl = STRCONV(tcUrl+ CHR(0), 5)
dwRetrievalFlags = TIMESTAMP_VERIFY_CONTEXT_SIGNATURE
dwTimeout = 0
pszHashId = lcAlgorithm + CHR(0)
pPara = SetStructure_CRYPT_TIMESTAMP_PARA()
pbData = tcHashToStamp
cbData = LEN(pbData)
ppTsContext = 0
ppTsSigner = 0
phStore= 0
nResp = CryptRetrieveTimeStamp(wszUrl, dwRetrievalFlags, dwTimeout, pszHashId, pPara, pbData, cbData, @ppTsContext, @ppTsSigner, @phStore)
IF nResp=0
GetMensajeError()
ENDIF
*----- Estructura PCRYPT_TIMESTAMP_CONTEXT
bTsContext = SYS(2600, ppTsContext, 12)
ncbEmcoded = CTOBIN(SUBSTR(bTsContext, 1, 4), "4RS")
ppbEncoded = CTOBIN(SUBSTR(bTsContext, 5, 4), "4RS")
ppTimeStamp = CTOBIN(SUBSTR(bTsContext, 9, 4), "4RS")
*----- Valor para el Nodo EncapsultatedTimeStamp
cTSB64=SetTimeStampToken(ncbEmcoded, ppbEncoded)
? cTSB64
*----- Estructura CRYPT_TIMESTAMP_INFO
=GetDedoce_TimeStampInfo(ppTimeStamp)
*----- Certificado del firmante TSA (Time Stamp Authority)
CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, ppTsSigner, 0, NULL, 0, 0)
ENDPROC
PROCEDURE GetDedoce_TimeStampInfo()
LPARAMETERS ppTimeStamp AS Long
cTimeStampInfo = SYS(2600, ppTimeStamp, 76)
*------- dwVersion
ndwVersion = CTOBIN(SUBSTR(cTimeStampInfo, 1, 4), "4RS")
*------- pszTSAPolicyId
ppszTSAPolicyId = CTOBIN(SUBSTR(cTimeStampInfo, 5, 4), "4RS")
nLenTSAPolicyId = GetStrLenA(ppszTSAPolicyId)
cpszTSAPolicyId = SYS(2600, ppszTSAPolicyId, nLenTSAPolicyId)
*------- HashAlgorithm
bHashAlgorithm = SUBSTR(cTimeStampInfo, 9, 12)
pAlgorithm1 = CTOBIN(SUBSTR(bHashAlgorithm, 1, 4), "4RS")
nLenAlgorit = GetStrLenA(pAlgorithm1)
nParameters = CTOBIN(SUBSTR(bHashAlgorithm, 5, 4), "4RS")
pParameters = CTOBIN(SUBSTR(bHashAlgorithm, 9, 4), "4RS")
cAlgorithm1 = SYS(2600, pAlgorithm1, nLenAlgorit)
cParameters = STRCONV(SYS(2600, pParameters, nParameters), 15)
*------- HashedMessage
bHashedMessage = SUBSTR(cTimeStampInfo, 21, 8)
nHashedMessage = CTOBIN(SUBSTR(bHashedMessage, 1, 4), "4RS")
pHashedMessage = CTOBIN(SUBSTR(bHashedMessage, 5, 4), "4RS")
cHash = SYS(2600, pHashedMessage, nHashedMessage)
B64Hash = STRCONV(cHash,13)
*-------- SerialNumber
bSerialNumber = SUBSTR(cTimeStampInfo, 29, 8)
nSerialNumber = CTOBIN(SUBSTR(bSerialNumber, 1, 4), "4RS")
pSerialNumber = CTOBIN(SUBSTR(bSerialNumber, 5, 4), "4RS")
cSerialNumber = SYS(2600, pSerialNumber, nSerialNumber)
hSerialNumber = STRCONV(cSerialNumber, 15)
*-------- ftTime
bftTime = 0h + SUBSTR(cTimeStampInfo, 37, 8)
lpSystemTime = SPACE(16)
IF FileTimeToSystemTime(bftTime, @lpSystemTime)>0
dwLowDateTime = GetCryptBinaryToDateTime(lpSystemTime)
ENDIF
*-------- pvAccuracy
bpvAccuracy = SUBSTR(cTimeStampInfo, 45, 4)
npvAccuracy = CTOBIN(SUBSTR(bpvAccuracy, 1, 4), "4RS")
*--------- fOrdering
bfOrdering = SUBSTR(cTimeStampInfo, 49, 4)
nfOrdering1 = CTOBIN(SUBSTR(bfOrdering, 1, 4), "4RS")
*--------- Nonce
bNonce = SUBSTR(cTimeStampInfo, 53, 8)
nNonce = CTOBIN(SUBSTR(bNonce, 1, 4), "4RS")
pNonce = CTOBIN(SUBSTR(bNonce, 5, 4), "4RS")
*------- Tsa
bTsa = SUBSTR(cTimeStampInfo, 61, 8)
nTsa = CTOBIN(SUBSTR(bTsa, 1, 4), "4RS")
pTsa = CTOBIN(SUBSTR(bTsa, 5, 4), "4RS")
cTSA = SYS(2600, pTsa, nTsa)
IF !EMPTY(cTSA)
tsb64 = STRCONV(cTSA,13)
cSTRTSA=SUBSTR(cTSA, AT("0", cTSA))
lcTSA = GetStructure_CertNameBlob(bTsa, cTSA)
ENDIF
*------- Extensions
ncExtension = CTOBIN(SUBSTR(cTimeStampInfo, 69, 4), "4RS")
nrgExtension = CTOBIN(SUBSTR(cTimeStampInfo, 73, 4), "4RS")
ENDPROC
*------- Time Stamp Token
PROCEDURE SetTimeStampToken()
LPARAMETERS tncbEmcoded AS Long, tppbEncoded AS Long
cByteString = SYS(2600, tppbEncoded, tncbEmcoded)
cTimeStampB64 = STRCONV(cByteString,13)
RETURN cTimeStampB64
ENDPROC
*------ Estructura CRYPT_TIMESTAMP_PARA
PROCEDURE SetStructure_CRYPT_TIMESTAMP_PARA()
pszTSAPolicyId = BINTOC(0, "4RS")
fRequestCerts = BINTOC(1, "4RS")
cbNonce = BINTOC(0, "4RS")
pbNonce = BINTOC(0, "4RS")
cExtension = BINTOC(0, "4RS")
rgExtension = BINTOC(0, "4RS")
CRYPT_TIMESTAMP_PARA = 0h + pszTSAPolicyId + fRequestCerts + cbNonce + pbNonce + cExtension + rgExtension
RETURN CRYPT_TIMESTAMP_PARA
ENDPROC
*------ Estructura CERT_NAME_BLOB
PROCEDURE GetStructure_CertNameBlob()
LPARAMETERS tcNameBlob AS String, tcStringBinary AS String
lcIssuerStr=""
IF VARTYPE(tcNameBlob)="C"
lcIssuerByte = 0h + tcNameBlob
pbCert_Name_Blob = HeapAlloc(GetProcessHeap(), 0, LEN(lcIssuerByte))
RtlMoveMemory(pbCert_Name_Blob, @lcIssuerByte, LEN(lcIssuerByte))
lcIssuerStr = GetCertNameToString(pbCERT_NAME_BLOB)
HeapFree(GetProcessHeap(), 0, pbCert_Name_Blob)
ENDIF
IF EMPTY(lcIssuerStr) AND !EMPTY(tcStringBinary)
cbData = LEN(tcStringBinary)
lbIssuer = SUBSTR(tcStringBinary, 1, cbData)
pbData = HeapAlloc(GetProcessHeap(), 0, cbData)
RtlMoveMemory(pbData, @lbIssuer, cbData)
lcIssuerByte = 0h + BINTOC(cbData,"4RS") + BINTOC(pbData, "4RS")
pbCert_Name_Blob = HeapAlloc(GetProcessHeap(), 0, LEN(lcIssuerByte))
RtlMoveMemory(pbCert_Name_Blob, @lcIssuerByte, LEN(lcIssuerByte))
lcIssuerStr = GetCertNameToString(pbCERT_NAME_BLOB)
HeapFree(GetProcessHeap(), 0, pbCert_Name_Blob)
HeapFree(GetProcessHeap(), 0, pbData)
ENDIF
RETURN lcIssuerStr
ENDPROC
PROCEDURE GetCertNameToString()
LPARAMETERS pbCertNameBlob AS Long
*----- Valores posibles para wDwStrType, pueden ser la suma de varios
SIMPLENAMESTR = 1
OIDNAMESTR = 2
X500NAMESTR = 3
SEMICOLONFLAG = 0x40000000
CRLFFLAG = 0x08000000
NOPLUSFLAG = 0x20000000
NOQUOTINGFLAG = 0x10000000
NAMEREVERSE = 0x02000000
DISABLEIE4UTF8= 0x00010000
ENABLEPUNYCODE= 0x00200000
*----- Asignamos valores a Parametros
nCertEncodTyp = X509_ASN_ENCODING
cpName = pbCertNameBlob
nDwStrType = BITOR(X500NAMESTR, OIDNAMESTR, NAMEREVERSE, SEMICOLONFLAG)
lcNameDecoded = ""
lnNameLong = 0
*----- Intento 1, obtenemos longitud de cadena
lnNameLong = CertNameToStr(nCertEncodTyp, cpName, nDwStrType, @lcNameDecoded, @lnNameLong)
IF lnNameLong <> 0
*----- Intento 2, conociendo longitud de cadena, Obtenemos el nombre decodificado
lcNameDecoded= REPLICATE(CHR(0), lnNameLong)
CertNameToStr(nCertEncodTyp, cpName, nDwStrType, @lcNameDecoded, @lnNameLong)
ENDIF
*----- La funci&#243;n devuelve una cadena terminada en nulo, quitamos el CHR(0) que represanta nulo
RETURN STRTRAN(lcNameDecoded, CHR(0), "")
ENDPROC
PROCEDURE GetCryptBinaryToDateTime()
PARAMETERS tbSystemTime AS String
ltDateTime = ""
IF !EMPTY(tbSystemTime)
wYear = CTOBIN(SUBSTR(tbSystemTime,1,2),"2RS")
wMonth = CTOBIN(SUBSTR(tbSystemTime,3,2),"2RS")
wDayWeek = CTOBIN(SUBSTR(tbSystemTime,5,2),"2RS")
wDay = CTOBIN(SUBSTR(tbSystemTime,7,2),"2RS")
wHour = CTOBIN(SUBSTR(tbSystemTime,9,2),"2RS")
wMinute = CTOBIN(SUBSTR(tbSystemTime,11,2),"2RS")
wSecond = CTOBIN(SUBSTR(tbSystemTime,13,2),"2RS")
wMilSec = CTOBIN(SUBSTR(tbSystemTime,15,2),"2RS")
ltDateTime = DATETIME(wYear, wMonth, wDay, wHour, wMinute, wSecond)
ENDIF
RETURN ltDateTime
ENDPROC
PROCEDURE GetMensajeError()
lnErrorCode = GetLastError()
lpBuffer = SPACE(128)
=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 'WINERROR.H', lnErrorCode, 0, @lpBuffer, 128 , 0)
=MESSAGEBOX(lpBuffer, 16, "Error: " + TRANSFORM(lnErrorCode,"@0"))
ENDPROC
PROCEDURE SetDeclarationAPI()
DECLARE LONG CryptRetrieveTimeStamp IN Crypt32;
STRING wszUrl,;
LONG dwRetrievalFlags,;
LONG dwTimeout,;
STRING pszHashId,;
STRING pPara,;
STRING pbData,;
LONG cbData,;
LONG @ppTsContext,;
LONG @ppTsSigner,;
LONG @phStore
DECLARE LONG CertNameToStr IN Crypt32;
LONG dwCertEncodingType, ;
LONG pName, ;
LONG dwStrType, ;
STRING @psz, ;
LONG csz
DECLARE LONG CryptUIDlgViewContext IN Cryptui;
LONG dwContextType,;
LONG pvContext,;
LONG hwnd,;
STRING pwszTitle,;
LONG dwFlags,;
LONG pvReserved
DECLARE LONG FileTimeToSystemTime IN Kernel32;
STRING lpFileTime,;
STRING @lpSystemTime
DECLARE LONG GetLastError IN Kernel32
DECLARE LONG FormatMessage IN Kernel32;
LONG dwFlags, ;
STRING @lpSource, ;
LONG dwMessageId, ;
LONG dwLanguageId, ;
STRING @lpBuffer, ;
LONG nSize, ;
LONG Arguments
DECLARE LONG lstrlenA IN Kernel32 AS GetStrLenA ;
LONG lpString
DECLARE LONG GetProcessHeap IN Kernel32
DECLARE LONG HeapAlloc IN Kernel32;
LONG hHeap,;
LONG dwFlags,;
LONG dwBytes
DECLARE LONG HeapFree IN Kernel32;
LONG hHeap,;
LONG dwFlags,;
LONG lpMem
DECLARE RtlMoveMemory IN Kernel32;
LONG Destination,;
STRING @Source,;
LONG Length
ENDPROC
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 38 (Гостей: 38)

© 2000-2024 Fox Club 
Яндекс.Метрика