:: Visual Foxpro, Foxpro for DOS
Re: Найти CRls
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
rvc44
Кстати, помимо VFP, все эти знания как вручную работать с API и со структурами данных, могут пригодиться и на Python'е, где вместо CreateObject можно использовать Dispatch и вперёд!

Возможно, в Python подобный способ себя оправдывает.
Хотя, если в Фоксе, как в некоторых языках, заранее записать структуры (да и функции тоже, возможно) в текстовом формате и написать несколько процедур для их расшифровки, то необходимость в доморощенных методах отпадет.
Но, увы, попытки автоматизировать преобразования типов оказались неудачными, а сейчас в этом нет никакого смысла.
Ratings: 0 negative/0 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Уважаемый lulgu, а Вы в курсе, что существует Visual Foxpro Advanced 10 64 bits 2018.10.03 esn.rar FREE ?
Многие уже испробовали данный китайский продукт! И ведь он работает ;)
Только давайте не будем засорять данную тему его обсуждением здесь.
Для этого есть раздел "Курилка"
Ratings: 0 negative/0 positive
Re: Найти CRls
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
rvc44
Уважаемый lulgu, а Вы в курсе, что существует Visual Foxpro Advanced 10 64 bits 2018.10.03 esn.rar FREE ?
Многие уже испробовали данный китайский продукт! И ведь он работает ;)
Только давайте не будем засорять данную тему его обсуждением здесь.
Для этого есть раздел "Курилка"

Согласен с вами, честь и хвала китайскому продукту.
Непонятно, правда, с чего вы его вдруг помянули.
В данном случае речь идет о том, что ручная работа опытнейших программистов с WinApi не повод для гордости, к сожалению.
Ratings: 0 negative/0 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
И всё-таки, кажется, я был прав, что размер структуры CERT_EXTENSION составляем именно 16 байт, а не 13 байт.
По крайней мере вот этот код под отладчиком выдаёт более-меенее похожие на правду значения:

lcCERT_EXTENSION = SYS(2600, rgExtension, 16)
cbValue = CTOBIN(SubStr(m.lcCERT_EXTENSION, 9, 4), "4RS") && CRLExtension.Value.cbData
pbValue = CTOBIN(SubStr(m.lcCERT_EXTENSION, 13, 4), "4RS") && CRLExtension.Value.pbData

cbValue = 3
pbValue = 902140213

тогда как если брать длину всей структуры 13 байт, то в полях этой структуры возвращается бред сумасшедшего.
Тем не менее, код продолжает не работать и дальше, вовращая ошибку с кодом 9 "Несоответствие типов данных".
Я грешу на параметр
LPCSTR lpszStructType
A pointer to an OID that defines the encoded data. If the high-order word of the lpszStructType parameter is zero, the low-order word specifies the integer identifier for the type of the given structure. Otherwise, this parameter is a long pointer to a null-terminated string.

Что здесь может быть не так?
Уже пробовал заменить lpszStructType = szOID_CRL_REASON_CODE на lpszStructType = StrConv(szOID_CRL_REASON_CODE + CHR(0), 5), но ни так, ни по-другому не работает!
Ratings: 0 negative/0 positive
Re: Найти CRls
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
Привет форум.
Роман, ты пытаешься взять регион расширений из контекста сертификата или CRL?
Если это контекст сертификата, вот пример того, как этого добиться, для чего используйте ваш образец сертификата. Я думаю, что это не должно сильно отличаться от CRL, поскольку они имеют схожие структуры.
PS: надеюсь, вы понимаете, что я пишу, я использую переводчик.

#DEFINE CRYPT_STRING_BASE64HEADER 0
#DEFINE CRYPT_STRING_BASE64 1
#DEFINE CRYPT_STRING_BINARY 2
#DEFINE CRYPT_STRING_ANY 7
#DEFINE X509_ASN_ENCODING 1
#DEFINE PKCS_7_ASN_ENCODING 0x00010000
#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 4096
CLEAR
=DeclarationsApi()
TEXT TO lcCertB64 TEXTMERGE ADDITIVE NOSHOW
MIIIjTCCCDygAwIBAgIRAZe4dS0WrMSA6BEUsUB9qOYwCAYGKoUDAgIDMIHuMR4wHAYJKoZIhvcN
AQkBFg91Y2ZvbXNAZmZvbXMucnUxGDAWBgUqhQNkARINMTAyNzczOTcxMjg1NzEaMBgGCCqFAwOB
AwEBEgwwMDc3MjcwMzIzODIxCzAJBgNVBAYTAlJVMRgwFgYDVQQIDA83NyDQnNC+0YHQutCy0LAx
FTATBgNVBAcMDNCc0L7RgdC60LLQsDEyMDAGA1UECQwp0J3QvtCy0L7RgdC70L7QsdC+0LTRgdC6
0LDRjyDRg9C7Liwg0LQuMzcxETAPBgNVBAoMCNCk0J7QnNChMREwDwYDVQQDDAjQpNCe0JzQoTAe
Fw0xODA5MDUxMzU2MzdaFw0xOTEyMDUxNDA2MzdaMIIBlzEaMBgGCCqFAwOBAwEBEgwwMDY4MzEw
MDAyNjUxGDAWBgUqhQNkARINMTAyNjgwMTE1ODgxMjEbMBkGCSqGSIb3DQEJARYMdGZvbXNAdG1i
LnJ1MQswCQYDVQQGEwJSVTEsMCoGA1UECAwj0KLQsNC80LHQvtCy0YHQutCw0Y8g0L7QsdC70LDR
gdGC0YwxFTATBgNVBAcMDNCi0LDQvNCx0L7QsjErMCkGA1UECQwi0YPQuy4g0JrQvtC80LzRg9C9
0LDQu9GM0L3QsNGPLCAxODE3MDUGA1UECgwu0KLQpNCe0JzQoSDQotCw0LzQsdC+0LLRgdC60L7Q
uSDQvtCx0LvQsNGB0YLQuDFJMEcGA1UECwxA0J7RgtC00LXQuyDQuNC90YTQvtGA0LzQsNGG0LjQ
vtC90L3QvtCz0L4g0L7QsdC10YHQv9C10YfQtdC90LjRjzE/MD0GA1UEAww20JDQmNChINCf0KMg
0J7QnNChINCi0LDQvNCx0L7QstGB0LrQvtC5INC+0LHQu9Cw0YHRgtC4MGMwHAYGKoUDAgITMBIG
ByqFAwICJAAGByqFAwICHgEDQwAEQJClKMdUgM0jjkBUJzW+mGmTF26Gmgcvk1LbPwllgCg5FxzN
HqF7k3CmIawgTzWyMhIsdCCQHSu9HTdGhZ5NtZejggUFMIIFATAOBgNVHQ8BAf8EBAMCA/gwHQYD
VR0OBBYEFM9X1n2LqtthzFr7YScF5TyaY5shMDMGCSsGAQQBgjcVBwQmMCQGHCqFAwICMgEJyZlh
lao6hJGWT4WgsXOD13KDtj4CAQECAQAwggGGBgNVHSMEggF9MIIBeYAUFbdV5IiKzBbjPrBbebba
8+cNX/ehggFSpIIBTjCCAUoxHjAcBgkqhkiG9w0BCQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UE
BhMCUlUxHDAaBgNVBAgMEzc3INCzLiDQnNC+0YHQutCy0LAxFTATBgNVBAcMDNCc0L7RgdC60LLQ
sDE/MD0GA1UECQw2MTI1Mzc1INCzLiDQnNC+0YHQutCy0LAsINGD0LsuINCi0LLQtdGA0YHQutCw
0Y8sINC0LiA3MSwwKgYDVQQKDCPQnNC40L3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB0LjQuDEY
MBYGBSqFA2QBEg0xMDQ3NzAyMDI2NzAxMRowGAYIKoUDA4EDAQESDDAwNzcxMDQ3NDM3NTFBMD8G
A1UEAww40JPQvtC70L7QstC90L7QuSDRg9C00L7RgdGC0L7QstC10YDRj9GO0YnQuNC5INGG0LXQ
vdGC0YCCCwD0Z+EyAAAAAAJqMCcGA1UdJQQgMB4GCCsGAQUFBwMCBggrBgEFBQcDBAYIKwYBBQUH
AwEwMwYJKwYBBAGCNxUKBCYwJDAKBggrBgEFBQcDAjAKBggrBgEFBQcDBDAKBggrBgEFBQcDATAd
BgNVHSAEFjAUMAgGBiqFA2RxATAIBgYqhQNkcQIwggFDBgUqhQNkcASCATgwggE0DDTQodCa0JfQ
mCAi0JrRgNC40L/RgtC+0J/RgNC+IENTUCIgKNCy0LXRgNGB0LjRjyA0LjApDFrQn9CQ0JogItCj
0LTQvtGB0YLQvtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgCAi0JrRgNC40L/RgtC+0J/RgNC+
INCj0KYiINCy0LXRgNGB0LjQuCAyLjAMT9Ch0LXRgNGC0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQ
tdGC0YHRgtCy0LjRjyDihJYg0KHQpC8xMjQtMjg2NCDQvtGCIDIwLjAzLjIwMTYMT9Ch0LXRgNGC
0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDihJYg0KHQpC8xMjgtMjk4MyDQ
vtGCIDE4LjExLjIwMTYwLAYFKoUDZG8EIwwh0KHQmtCX0JggItCa0YDQuNC/0YLQvtCf0YDQviBD
U1AiMFgGA1UdHwRRME8wTaBLoEmGR2h0dHA6Ly91Y2ZvbXMuZmZvbXMucnUvY2RwLzE1Yjc1NWU0
ODg4YWNjMTZlMzNlYjA1Yjc5YjZkYWYzZTcwZDVmZjcuY3JsMIGXBggrBgEFBQcBAQSBijCBhzAw
BggrBgEFBQcwAYYkaHR0cDovL3VjZm9tcy5mZm9tcy5ydS9vY3NwL29jc3Auc3JmMFMGCCsGAQUF
BzAChkdodHRwOi8vdWNmb21zLmZmb21zLnJ1L2FpYS8xNWI3NTVlNDg4OGFjYzE2ZTMzZWIwNWI3
OWI2ZGFmM2U3MGQ1ZmY3LmNydDArBgNVHRAEJDAigA8yMDE4MDkwNTEzNTYzN1qBDzIwMTkwOTA1
MTM1NjM3WjAIBgYqhQMCAgMDQQB5goLR7QDXU6ZtYraFLA8KpEPBlDOXhgRxsZwRZNvyfoshn9+Z
KOYIaFyw5lc7/PwRgyq/XmAf3iZ7ObUdeN7i
ENDTEXT
SET STEP ON
lnCertContext = GetCertCreateCertificateContext(lcCertB64)
IF lnCertContext>0
? "2.5.29.21"
? GetOidValues(lnCertContext, "2.5.29.21")
?
? "2.5.29.31"
? GetOidValues(lnCertContext, "2.5.29.31")
ENDIF
PROCEDURE GetCertCreateCertificateContext()
PARAMETERS tcCertEncodedB64 AS String
pCertContext = 0
IF !EMPTY(tcCertEncodedB64)
dwCertEncodingType = BITOR(PKCS_7_ASN_ENCODING, X509_ASN_ENCODING)
pbCertEncoded = GetCryptStringToBinary(ALLTRIM(STRTRAN(tcCertEncodedB64, CHR(0), "")))
cbCertEncoded = LEN(pbCertEncoded)
pCertContext = CertCreateCertificateContext(dwCertEncodingType, pbCertEncoded, cbCertEncoded)
ENDIF
RETURN pCertContext
ENDPROC
PROCEDURE GetCryptStringToBinary()
PARAMETERS tcStringCert AS String
lcRespStr = ""
IF VARTYPE(tcStringCert)=="C"
dwBufferLen=0
pdwSkip=0
pdwFlags=0
nResp = CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_ANY, NULL, @dwBufferLen, @pdwSkip, @pdwFlags)
pbCertEncoded = SPACE(dwBufferLen)
DO CASE
CASE pdwFlags=0
*------- Base64, with certificate beginning and ending headers.
CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_BASE64HEADER, @pbCertEncoded, @dwBufferLen, @pdwSkip, @pdwFlags)
CASE pdwFlags=1
*------- Base64, without headers.
CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_BASE64, @pbCertEncoded, @dwBufferLen, @pdwSkip, @pdwFlags)
CASE pdwFlags=2
*------- Pure binary copy.
pbCertEncoded=tcStringCert
ENDCASE
lcRespStr = pbCertEncoded
ENDIF
RETURN lcRespStr
ENDPROC
PROCEDURE GetOidValues()
LPARAMETERS tpCertContext AS Long, tcOidName AS String
cReturnStr = ""
nExtensions = 0
lcCertInfo = ""
IF VARTYPE(tpCertContext)="N"
lbCertInfo = SUBSTR(SYS(2600, tpCertContext, 20), 13, 4)
lcCertInfo = SYS(2600, CTOBIN(lbCertInfo, "4RS"), 112)
ENDIF
IF !EMPTY(lcCertInfo)
cBinaryOid = SUBSTR(lcCertInfo ,105,8)
nExtensions = CTOBIN(SUBSTR(cBinaryOid,1,4),"4RS")
pRegExtens = CTOBIN(SUBSTR(cBinaryOid,5,4),"4RS")
ENDIF
IF nExtensions>0
lpCertOid = CertFindExtension(tcOidName, nExtensions, pRegExtens)
IF lpCertOid>0
cOidBinary = SYS(2600, lpCertOid, 16)
cOidName = SYS(2600, CTOBIN(SUBSTR(cOidBinary,1,4), "4RS"), 32)
nOidType = CTOBIN(SUBSTR(cOidBinary,5,4), "4RS")
nOidLenght = CTOBIN(SUBSTR(cOidBinary,9,4), "4RS")
cOidValue = SYS(2600, CTOBIN(SUBSTR(cOidBinary,13,4), "4RS"), nOidLenght)
cReturnStr = GetCryptFormatObject(tcOidName, cOidValue, nOidLenght)
ENDIF
ENDIF
RETURN cReturnStr
ENDPROC
PROCEDURE GetCryptFormatObject()
LPARAMETERS tbExtName AS String, tbExtValue AS String, tpExtLeng AS Long
dwCertEncodingType = BITOR(PKCS_7_ASN_ENCODING, X509_ASN_ENCODING)
dwFormatType = 0
dwFormatStrType = 1
pFormatStruct = 0
lpszStructType = tbExtName
pbEncoded = tbExtValue
cbEncoded = tpExtLeng
pbFormat = NULL
pcbFormat = 0
nResp = CryptFormatObject(dwCertEncodingType, dwFormatType, dwFormatStrType, pFormatStruct, ;
lpszStructType, pbEncoded, cbEncoded, pbFormat, @pcbFormat)
IF pcbFormat>0
pbFormat = SPACE(pcbFormat)
nResp = CryptFormatObject(dwCertEncodingType, dwFormatType, dwFormatStrType, pFormatStruct, ;
lpszStructType, pbEncoded, cbEncoded, @pbFormat, @pcbFormat)
ENDIF
RETURN STRCONV(pbFormat,6)
ENDPROC
PROCEDURE DeclarationsApi()
DECLARE LONG CryptStringToBinary IN Crypt32;
STRING @pszString, ;
LONG cchString, ;
LONG dwFlags,;
STRING @pbBinary, ;
LONG @pcbBinary,;
LONG @pdwSkip, ;
LONG @pdwFlags
DECLARE LONG CertCreateCertificateContext IN Crypt32;
LONG dwCertEncodingType,;
STRING pbCertEncoded,;
LONG cbCertEncoded
DECLARE LONG CryptGetObjectUrl IN CryptNet;
LONG pszUrlOid,;
LONG pvPara,;
LONG dwFlags,;
STRING @pUrlArray,;
LONG @pcbUrlArray,;
STRING @pUrlInfo,;
LONG @pcbUrlInfo,;
LONG pvReserved
DECLARE LONG CryptRetrieveObjectByUrlA IN CryptNet;
STRING pszUrl,;
LONG pszObjectOid,;
LONG dwRetrievalFlags,;
LONG dwTimeout,;
LONG @ppvObject,;
STRING hAsyncRetrieve,;
STRING pCredentials,;
STRING pvVerify,;
STRING pAuxInfo
DECLARE LONG CertVerifyCRLTimeValidity IN Crypt32;
LONG pTimeToVerify,;
LONG pCrlInfo
DECLARE LONG CertFindCertificateInCRL IN Crypt32;
LONG pCert,;
LONG pCrlContext,;
LONG dwFlags,;
LONG pvReserved,;
LONG @ppCrlEntry
DECLARE LONG CertFindExtension IN Crypt32;
STRING pszObjId,;
LONG nExtensions,;
LONG rgExtensions
DECLARE LONG CryptFormatObject IN Crypt32;
LONG dwCertEncodingType,;
LONG dwFormatType,;
LONG dwFormatStrType,;
LONG pFormatStruct,;
STRING lpszStructType,;
STRING pbEncoded,;
LONG cbEncoded,;
STRING @pbFormat,;
LONG @pcbFormat
DECLARE LONG CertFreeCertificateContext IN Crypt32;
LONG pCertContext
DECLARE LONG CertFreeCRLContext IN Crypt32;
LONG pCrlContext
DECLARE LONG GetLastError IN Kernel32
DECLARE LONG FormatMessage IN Kernel32;
LONG dwFlags, ;
STRING @lpSource, ;
LONG dwMessageId, ;
LONG dwLanguageId, ;
STRING @lpBuffer, ;
LONG nSize, ;
LONG Arguments
ENDPROC
Ratings: 0 negative/0 positive
Re: Найти CRls
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
В этом примере показаны все причины отзыва.
Обратите внимание, как декодирование структуры CRL похоже на сертификат.

#DEFINE CRYPT_STRING_BASE64HEADER 0
#DEFINE CRYPT_STRING_BASE64 1
#DEFINE CRYPT_STRING_BINARY 2
#DEFINE CRYPT_STRING_ANY 7
#DEFINE X509_ASN_ENCODING 1
#DEFINE PKCS_7_ASN_ENCODING 0x00010000
CLEAR
=DeclarationsApi()
cFileCrl=GETFILE("CRL")
IF EMPTY(cFileCrl)
RETURN
ENDIF
lcCRLASN1=FILETOSTR(cFileCrl)
lnCrlContext = GetCertCreateCRLContext(lcCRLASN1)
IF lnCrlContext>0
GetOidValues(lnCrlContext)
ENDIF
CertFreeCRLContext(lnCrlContext)
PROCEDURE GetCertCreateCRLContext()
PARAMETERS tcCrlEncodedASN1 AS String
pCertContext = 0
IF !EMPTY(tcCrlEncodedASN1 )
dwCertEncodingType = BITOR(PKCS_7_ASN_ENCODING, X509_ASN_ENCODING)
pbCertEncoded = tcCrlEncodedASN1
cbCertEncoded = LEN(pbCertEncoded)
pCertContext = CertCreateCRLContext(dwCertEncodingType, pbCertEncoded, cbCertEncoded)
ENDIF
RETURN pCertContext
ENDPROC
PROCEDURE GetCryptStringToBinary()
PARAMETERS tcStringCert AS String
lcRespStr = ""
IF VARTYPE(tcStringCert)=="C"
dwBufferLen=0
pdwSkip=0
pdwFlags=0
nResp = CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_ANY, NULL, @dwBufferLen, @pdwSkip, @pdwFlags)
pbCertEncoded = SPACE(dwBufferLen)
DO CASE
CASE pdwFlags=0
*------- Base64, with certificate beginning and ending headers.
CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_BASE64HEADER, @pbCertEncoded, @dwBufferLen, @pdwSkip, @pdwFlags)
CASE pdwFlags=1
*------- Base64, without headers.
CryptStringToBinary(tcStringCert, 0, CRYPT_STRING_BASE64, @pbCertEncoded, @dwBufferLen, @pdwSkip, @pdwFlags)
CASE pdwFlags=2
*------- Pure binary copy.
pbCertEncoded=tcStringCert
ENDCASE
lcRespStr = pbCertEncoded
ENDIF
RETURN lcRespStr
ENDPROC
PROCEDURE GetOidValues()
LPARAMETERS tpCertContext AS Long, tcOidName AS String
cReturnStr = ""
nExtensions = 0
lcCertInfo = ""
IF VARTYPE(tpCertContext)="N"
lbCrlInfo = SUBSTR(SYS(2600, tpCertContext, 20), 13, 4)
lcCrlInfo = SYS(2600, CTOBIN(lbCrlInfo, "4RS"), 112)
ENDIF
IF !EMPTY(lcCrlInfo)
dwVersion = SUBSTR(lcCrlInfo, 1, 4)
SignatureAlgorithm = SUBSTR(lcCrlInfo, 5, 12)
Issuer = SUBSTR(lcCrlInfo, 17, 8)
ThisUpdate = SUBSTR(lcCrlInfo, 25, 8)
NextUpdate = SUBSTR(lcCrlInfo, 33, 8)
cCRLEntry = SUBSTR(lcCrlInfo, 41, 4)
rgCRLEntry = SUBSTR(lcCrlInfo, 45, 4)
cExtension = SUBSTR(lcCrlInfo, 49, 4)
rgExtension = SUBSTR(lcCrlInfo, 53, 4)
nVersion = CTOBIN(dwVersion, "4RS")
nCRLEntry = CTOBIN(cCRLEntry, "4RS")
pCRLEntry = CTOBIN(rgCRLEntry, "4RS")
nExtension = CTOBIN(cExtension, "4RS")
pExtension = CTOBIN(rgExtension, "4RS")
ENDIF
IF nExtension>0
cBlobExt = SYS(2600, pExtension, (nExtension*16))
nIniChr=1
FOR I = 1 TO nExtension
cOidName = SYS(2600, CTOBIN(SUBSTR(cBlobExt, nIniChr, 4), "4RS"), 32)
nOidType = CTOBIN(SUBSTR(cBlobExt, nIniChr+4, 4), "4RS")
nOidLenght = CTOBIN(SUBSTR(cBlobExt, nIniChr+8,4), "4RS")
cOidValue = SYS(2600, CTOBIN(SUBSTR(cBlobExt, nIniChr+12,4), "4RS"), nOidLenght)
cOidName = SUBSTR(cOidName, 1, AT(CHR(0), cOidName))
? cOidName
? GetCryptFormatObject(cOidName, cOidValue, nOidLenght)
?
nIniChr = nIniChr + 16
NEXT
ENDIF
SET STEP ON
IF nCRLEntry>0
cBlobCRL = SYS(2600, pCRLEntry, (nCRLEntry*24))
nIniCRL=1
FOR X = 1 TO nCRLEntry
bSerialNumber = SUBSTR(cBlobCRL, nIniCRL, 8)
RevocationDate = SUBSTR(cBlobCRL, nIniCRL+8, 8)
cExtension = SUBSTR(cBlobCRL, nIniCRL+16, 4)
rgExtension = SUBSTR(cBlobCRL, nIniCRL+20, 4)
nExtCRL = CTOBIN(cExtension, "4RS")
pExtCRL = CTOBIN(rgExtension, "4RS")
cBlobExt = SYS(2600, pExtCRL, (nExtCRL*16))
nIniChr=1
FOR I = 1 TO nExtCRL
cOidName = SYS(2600, CTOBIN(SUBSTR(cBlobExt, nIniChr, 4), "4RS"), 32)
nOidType = CTOBIN(SUBSTR(cBlobExt, nIniChr+4, 4), "4RS")
nOidLenght = CTOBIN(SUBSTR(cBlobExt, nIniChr+8,4), "4RS")
cOidValue = SYS(2600, CTOBIN(SUBSTR(cBlobExt, nIniChr+12,4), "4RS"), nOidLenght)
cOidName = SUBSTR(cOidName, 1, AT(CHR(0), cOidName))
? cOidName, GetCryptFormatObject(cOidName, cOidValue, nOidLenght)
?
nIniChr = nIniChr + 16
NEXT
nIniCRL = nIniCRL + 24
NEXT
ENDIF
RETURN cReturnStr
ENDPROC
PROCEDURE GetCryptFormatObject()
LPARAMETERS tbExtName AS String, tbExtValue AS String, tpExtLeng AS Long
dwCertEncodingType = BITOR(PKCS_7_ASN_ENCODING, X509_ASN_ENCODING)
dwFormatType = 0
dwFormatStrType = 1
pFormatStruct = 0
lpszStructType = tbExtName
pbEncoded = tbExtValue
cbEncoded = tpExtLeng
pbFormat = NULL
pcbFormat = 0
nResp = CryptFormatObject(dwCertEncodingType, dwFormatType, dwFormatStrType, pFormatStruct, ;
lpszStructType, pbEncoded, cbEncoded, pbFormat, @pcbFormat)
IF pcbFormat>0
pbFormat = SPACE(pcbFormat)
nResp = CryptFormatObject(dwCertEncodingType, dwFormatType, dwFormatStrType, pFormatStruct, ;
lpszStructType, pbEncoded, cbEncoded, @pbFormat, @pcbFormat)
ENDIF
RETURN STRCONV(pbFormat,6)
ENDPROC
PROCEDURE DeclarationsApi()
DECLARE LONG CryptStringToBinary IN Crypt32;
STRING @pszString, ;
LONG cchString, ;
LONG dwFlags,;
STRING @pbBinary, ;
LONG @pcbBinary,;
LONG @pdwSkip, ;
LONG @pdwFlags
DECLARE LONG CertCreateCRLContext IN Crypt32;
LONG dwCertEncodingType,;
STRING pbCrlEncoded,;
LONG cbCrlEncoded
DECLARE LONG CryptFormatObject IN Crypt32;
LONG dwCertEncodingType,;
LONG dwFormatType,;
LONG dwFormatStrType,;
LONG pFormatStruct,;
STRING lpszStructType,;
STRING pbEncoded,;
LONG cbEncoded,;
STRING @pbFormat,;
LONG @pcbFormat
DECLARE LONG CertFreeCRLContext IN Crypt32;
LONG pCrlContext
ENDPROC
Ratings: 0 negative/0 positive
Re: Найти CRls
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
BOOL это на самом деле 4 байта. Оно определено как
typedef int BOOL;
Вообще при использовании си в программировании с апи винды обнаруживаешь настолько много "логических типов", что разбираясь с этим порой невольно задаёшься вопросом, а не идиоты ли те кто всё это придумал


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Спасибо за пример, Fernando!
Я никак не ожидал, что нужно было устанавливать значение:
dwFormatStrType = 1
Я после двух бессонных ночей упорно пытался устанавливать это значение
dwFormatStrType = 0
И не придал этому должного внимания из-за невнятного описания параметра в MSDN. Теперь впредь постараюсь быть более внимательным.
Кстати, у Вас отличный русский!
Вас на этом русском форуме все прекрасно поняли.
Знаю, что по-испански Вы меня тоже всегда понимали.
Главное это передать мысль и идею, а языковые преграды в XXI веке нам не помеха! ))
Muchas gracias! Visitanos mas seguido!

P.S.: Надо написать Joys'у, что не все испанские символы поддерживаются. Явно используемая кодировка на сайте не UTF8?



Исправлено 4 раз(а). Последнее : rvc44, 04.09.19 09:23
Ratings: 0 negative/0 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Игорь, и Вам большое спасибо! Ваши комментарии и даже любые намёки "в какую сторону копать" всегда очень ценны!

P.S.: "апи винды" это API Windows (специально для Fernando)



Исправлено 2 раз(а). Последнее : rvc44, 02.09.19 23:48
Ratings: 0 negative/1 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Для сертификатов структура CRL_INFO составляет 112 байт
lcCertInfo = SYS(2600, CTOBIN(lbCertInfo, "4RS"), 112)
а для списков отзыва сертификатов (CRL list, он же СОС) структура CRL_INFO составляет уже 56 байт, поэтому, правильнее будет написать так:
lcCrlInfo = SYS(2600, CTOBIN(lbCrlInfo, "4RS"), 56)
Привожу для сравнения обе структуры, чтобы видеть, что они разные:
* Structure CERT_INFO from MSDN:
* msdn.microsoft.com
* docs.microsoft.com
*|typedef struct _CERT_INFO {
*| DWORD dwVersion; 0:4
*| CRYPT_INTEGER_BLOB SerialNumber; 4:8
*| CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 12:12
*| CERT_NAME_BLOB Issuer; 24:8
*| FILETIME NotBefore; 32:8
*| FILETIME NotAfter; 40:8
*| CERT_NAME_BLOB Subject; 48:8
*| CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; 56:24
*| CRYPT_BIT_BLOB IssuerUniqueId; 80:12
*| CRYPT_BIT_BLOB SubjectUniqueId; 92:12
*| DWORD cExtension; 104:4
*| PCERT_EXTENSION rgExtension; 108:4 && Pointer to CERT_EXTENSION
*|} CERT_INFO, *PCERT_INFO; total 112 bytes
* Structure CRL_INFO from MSDN:
* docs.microsoft.com
*|typedef struct _CRL_INFO {
*| DWORD dwVersion; 0:4 offset 0
*| CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; 4:12 offset 5
*| CERT_NAME_BLOB Issuer; 16:8 offset 17: CRLInfo.Issuer
*| FILETIME ThisUpdate; 24:8
*| FILETIME NextUpdate; 32:8
*| DWORD cCRLEntry; 40:4 offset 41: CRLInfo.cCRLEntry Number of elements in the rgCRLEntry array
*| PCRL_ENTRY rgCRLEntry; 44:4 offset 45: CRLInfo.rgCRLEntry Array of pointers to CRL_ENTRY structures. Each of these structures represents a revoked certificate.
*| DWORD cExtension; 48:4
*| PCERT_EXTENSION rgExtension; 52:4 && Pointer to CRL_EXTENSION
*|} CRL_INFO, *PCRL_INFO; total 56 bytes

При этом, структура CRL_CONTEXT полностью идентична структуре CERT_CONTEXT

*|typedef struct _CRL_CONTEXT {
*| DWORD dwCertEncodingType;
*| BYTE *pbCrlEncoded;
*| DWORD cbCrlEncoded;
*| PCRL_INFO pCrlInfo;
*| HCERTSTORE hCertStore;
*|} CRL_CONTEXT, *PCRL_CONTEXT;

А вот структура CRL_ENTRY длиной 24 байта, а не 16 байт:

* Structure CRL_ENTRY from MSDN:
* docs.microsoft.com
*| typedef struct _CRL_ENTRY {
*| CRYPT_INTEGER_BLOB SerialNumber; 0:8 && A BLOB that contains the serial number of a revoked certificate. Leading 0x00 or 0xFF bytes are removed. For more information, see CertCompareIntegerBlob.
*| FILETIME RevocationDate; 8:8 && Date that the certificate was revoked. Time is UTC-time encoded as an eight-byte date/time precise to seconds with a two digit year (that is, YYMMDDHHMMSS plus 2 bytes). The date is interpreted as a date between the years 1968 and 2067.
*| DWORD cExtension; 16:4 && Number of elements in the rgExtension member array of extensions
*| PCERT_EXTENSION rgExtension; 20:4 && Array of pointers to CERT_EXTENSION structures, each providing information about the revoked certificate.
*|} CRL_ENTRY, *PCRL_ENTRY; total 24 bytes



Исправлено 3 раз(а). Последнее : rvc44, 04.09.19 09:21
Ratings: 0 negative/0 positive
Re: Найти CRls
morafernet

Сообщений: 8
Дата регистрации: 09.12.2018
В дополнение к тому, что говорит Роман, в функции GetOidValues замените «tpCertContext» на «tpCrlContext», также «lcCertInfo» на «lcCrlInfo», это может привести к путанице. Функция GetCryptStringToBinary не применяется для этого упражнения.

Удалите сомнения относительно длины расширений (16), и теперь мы знаем длину записей CRL (24). (CRLEntry)

привет
Fernando
Ratings: 0 negative/0 positive
Re: Найти CRls
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Fernando, Ваш второй пример для CRL очень пригодился. Хотя в нем не используется функция CertFindExtension для CRL, мне сегодня удалось реализовать свою первоначальную задумку по осуществлению поиска расширений CRL по конкретному заранее заданному объектному идентификатору (OID)с помощью функции CertFindExtension. Я очень рад, что такую хитрую маршализацию C++ удалось полностью повторить на чистом VFP, причем без применения внешних библиотек и без единого Global/Local/Heap alloc, с использованием только стандартного CryptoAPI. За прошедшие пару дней, пока я нахожусь в отпуске, удалось серьезно повысить уровень своих знаний. Теперь осталось проверить и сравнить несколько разных способов загрузки CRL. С Вашим способом загрузки через CryptoAPI я уже ознакомился. Пока мне не удалось проверить, будет ли он работать через Proxy. Также мне кажется, что загрузка CRL вручную (не через CryptoAPI) может работать быстрее, особенно с учётом того, что мы не будем перебирать все OID'ы при парсинге, а будем выборочно проверять то, что нам нужно с помощью CertFindExtension. Как полностью доделаю, можно будет замерить и сравнить время выполнения на больших CRL lists.
Ratings: 0 negative/0 positive


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

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

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