#DEFINE CRYPT_EXPORTABLE 0x00000001
#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
#DEFINE CRYPT_STRING_BASE64HEADER 0x00000000
=SetDeclarationsAPI()
cFileP12PFX=GETFILE("P12,PFX")
IF EMPTY(cFileP12PFX)
RETURN
ENDIF
cPassword=INPUTBOX("Ingrese password:")
lhStore = GetImportP12PFX(cFileP12PFX, cPassword)
IF lhStore=0
RETURN
ENDIF
pCertContext=GetSelectCertificateFromCertStore(lhStore)
IF pCertContext=0
RETURN
ENDIF
cX509ASN1 = GetCertEncodex509(pCertContext)
IF EMPTY(cX509ASN1)
RETURN
ENDIF
cX509Base64 = GetCryptBinaryToString(cX509ASN1, CRYPT_STRING_BASE64HEADER)
IF EMPTY(cX509Base64)
RETURN
ENDIF
cPath=ADDBS(JUSTPATH(cFileP12PFX)) + JUSTSTEM(cFileP12PFX) + ".PEM"
STRTOFILE(cX509Base64, cPath)
MESSAGEBOX("Certificado exportado a formato PEM con éxito", 64, _SCREEN.Caption)
CertFreeCertificateContext(pCertContext)
CertCloseStore(lhStore, 0)
PROCEDURE GetImportP12PFX()
LPARAMETERS tcArchivoPfx AS String, tcPassword AS String
hStoreHandle = 0
IF !EMPTY(tcArchivoPfx)
*----- Armamos la Estructura CRYPT_DATA_BLOB
StrPfx = FILETOSTR(tcArchivoPfx)
cbData = LEN(StrPfx)
pbData = HeapAlloc(GetProcessHeap(), 0, cbData)
RtlMoveMemory(pbData, @StrPfx, cbData)
pPFX = 0h + BINTOC(cbData,"4RS") + BINTOC(pbData, "4RS")
*----- Verificamos que el archivo sea certificado Pfx, P12
IF PFXIsPFXBlob(pPFX)>0
*----- Capturamos el Password
cPassword = STRCONV(tcPassword,5) + CHR(0)
*----- Verificamos el Password
IF PFXVerifyPassword(pPFX, cPassword, 0)>0
*----- Importamos el o los certificados (pueden venir varios cert empaquetados en un P12 o PFX)
hStoreHandle = PFXImportCertStore(pPFX, cPassword, CRYPT_EXPORTABLE)
cPassword = ""
pPFX = ""
IF hStoreHandle=0
GetMessageError()
ENDIF
ELSE
GetMessageError()
ENDIF
ELSE
GetMessageError()
ENDIF
HeapFree(GetProcessHeap(), 0, pbData)
ELSE
GetMessageError()
ENDIF
RETURN hStoreHandle
ENDPROC
PROCEDURE GetSelectCertificateFromCertStore()
LPARAMETERS tnStoreHandle AS Long
lpCertContext = 0
lpCertContext=CryptUIDlgSelectCertificateFromStore(tnStoreHandle, 0, null, null, 1, 0, null)
RETURN lpCertContext
ENDPROC
PROCEDURE GetCertEncodex509()
LPARAMETERS tpCertContext AS Long
cAsn1CertEncode = ""
IF tpCertContext>0
cCERT_CONTEXT = SYS(2600, tpCertContext, 20)
nCertType = CTOBIN(SUBSTR(cCERT_CONTEXT, 1, 4), "4RS") && Tipo Certificado
cCertBuffer = CTOBIN(SUBSTR(cCERT_CONTEXT, 5, 4), "4RS") && Certificado Codificado
nCertLength = CTOBIN(SUBSTR(cCERT_CONTEXT, 9, 4), "4RS") && Longitud de Certificado
cCERT_INFO = CTOBIN(SUBSTR(cCERT_CONTEXT, 13, 4), "4RS") && Puntero a región CertInfo
nCertSotre = CTOBIN(SUBSTR(cCERT_CONTEXT, 17, 4), "4RS") && Manejador Certificado
cAsn1CertEncode = SYS(2600, cCertBuffer, nCertLength)
ENDIF
RETURN cAsn1CertEncode
ENDPROC
PROCEDURE GetCryptBinaryToString()
LPARAMETERS tcStringToConvert AS String, tnHexorBase64 AS Integer
lcRespStr = ""
IF VARTYPE(tcStringToConvert)=="C" OR VARTYPE(tnHexorBase64)=="N"
pbBinary = tcStringToConvert
cbBinary = LEN(pbBinary)
dwFlags = tnHexorBase64
pcchString = 0
pszString = ""
nResp = CryptBinaryToString(@pbBinary, cbBinary, dwFlags, NULL, @pcchString)
IF nResp>0
pszString = SPACE(pcchString)
nResp = CryptBinaryToString(@pbBinary, cbBinary, dwFlags, @pszString, @pcchString)
ENDIF
lcRespStr = pszString
ENDIF
RETURN lcRespStr
ENDPROC
PROCEDURE GetMessageError()
LPARAMETERS tnNumError
IF VARTYPE(tnNumError)=="N"
lnErrorCode = tnNumError
ELSE
lnErrorCode = GetLastError()
ENDIF
lcErrorMessage = SPACE(128)
=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 'WINERROR.H', lnErrorCode, 0, @lcErrorMessage, 128 , 0)
MESSAGEBOX(lcErrorMessage , 16, _SCREEN.Caption)
ENDPROC
PROCEDURE SetDeclarationsAPI()
DECLARE LONG PFXIsPFXBlob IN Crypt32;
STRING pPFX
DECLARE LONG PFXVerifyPassword IN Crypt32;
STRING pPFX,;
STRING szPassword,;
LONG dwFlags
DECLARE LONG PFXImportCertStore IN Crypt32;
STRING pPFX,;
STRING szPassword,;
LONG dwFlags
DECLARE LONG CertCreateCertificateContext IN Crypt32;
LONG dwCertEncodingType,;
STRING pbCertEncoded,;
LONG cbCertEncoded
DECLARE LONG CryptUIDlgSelectCertificateFromStore IN Cryptui;
LONG hCertStore,;
LONG hWnd, ;
STRING @pwszTitle, ;
STRING @pwszDisplayString, ;
LONG dwDontUseColumn, ;
LONG dwFlags,;
STRING pvReserved
DECLARE LONG CertFreeCertificateContext IN Crypt32;
LONG pCertContext
DECLARE LONG CertCloseStore IN Crypt32;
LONG hCertStore,;
LONG dwFlags
DECLARE LONG CryptBinaryToString IN Crypt32;
STRING pbBinary, ;
LONG cbBinary, ;
LONG dwFlags,;
STRING @pszString, ;
LONG @pcchString
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 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