' This PowerBasic header was prepared by Dr Richard Koch ' and is provided without any warranties whatsoever. ' Please make your own checks and use at your own risk. ' The basCrPKI module contains the full list of declaration statements ' for the CryptoSys (tm) PKI Toolkit Version 2.2 library. ' Last updated: ' $Date: 2005/01/01 14:50:00 $ '************************* COPYRIGHT NOTICE************************* ' Copyright (c) 2002-5 DI Management Services Pty Limited. ' All rights reserved. ' This code may only be used by licensed users. ' The latest version of the CryptoSys PKI Toolkit and a licence ' may be obtained from . ' This copyright notice must always be left intact. '****************** END OF COPYRIGHT NOTICE************************* ' CONSTANTS %PKI_MAX_HASH_LEN = 40 %PKI_DIR_ENCRYPT = -1 %PKI_DIR_DECRYPT = 0 ' CONSTANTS USED IN OPTION FLAGS %PKI_DEFAULT = 0 %PKI_SIG_SHA1RSA = 0 ' default %PKI_SIG_MD5RSA = 1 %PKI_SIG_MD2RSA = 2 %PKI_PBE_SHA1_3DES = 0 ' default %PKI_PBE_MD5_DES = 1 %PKI_PBE_MD2_DES = 2 %PKI_HASH_SHA1 = 0 ' default %PKI_HASH_MD5 = 1 %PKI_HASH_MD2 = 2 %PKI_KEYGEN_INDICATE = &H10 %PKI_KEY_NODELAY = &H20 %PKI_X509_FORMAT_PEM = &H10000 %PKI_X509_FORMAT_BIN = &H20000 %PKI_X509_REQ_KLUDGE = &H100000 %PKI_X509_NO_BASIC = &H2000000 %PKI_X509_CA_TRUE = &H4000000 %PKI_X509_VERSION1 = &H8000000 %PKI_CMS_FORMAT_BASE64 = &H10000 %PKI_CMS_EXCLUDE_CERTS = &H100 %PKI_CMS_EXCLUDE_DATA = &H200 %PKI_CMS_INCLUDE_ATTRS = &H800 %PKI_CMS_ADD_SIGNTIME = &H1000 %PKI_CMS_ADD_SMIMECAP = &H2000 ' CONSTANTS USED IN RSA EXPONENT PARAMETER %PKI_RSAEXP_EQ_3 = 0 %PKI_RSAEXP_EQ_5 = 1 %PKI_RSAEXP_EQ_17 = 2 %PKI_RSAEXP_EQ_257 = 3 %PKI_RSAEXP_EQ_65537 = 4 ' CONSTANTS USED IN KEY USAGE FLAG %PKI_X509_KEYUSAGE_DIGITALSIGNATURE = &H1 %PKI_X509_KEYUSAGE_NONREPUDIATION = &H2 %PKI_X509_KEYUSAGE_KEYENCIPHERMENT = &H4 %PKI_X509_KEYUSAGE_DATAENCIPHERMENT = &H8 %PKI_X509_KEYUSAGE_KEYAGREEMENT = &H10 %PKI_X509_KEYUSAGE_KEYCERTSIGN = &H20 %PKI_X509_KEYUSAGE_CRLSIGN = &H40 %PKI_X509_KEYUSAGE_ENCIPHERONLY = &H80 %PKI_X509_KEYUSAGE_DECIPHERONLY = &H100 $vbNullString = "" ' CRYPTOGRAPHIC MESSAGE SYNTAX (CMS) FUNCTIONS DECLARE FUNCTION CMS_MakeEnvData LIB "diCrPKI.dll" ALIAS "CMS_MakeEnvData" _ (BYVAL strFileOut AS STRING, BYVAL strFileIn AS STRING, _ BYVAL strCertList AS STRING, BYVAL strSeed AS STRING, BYVAL nSeedLen AS LONG, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_MakeEnvDataFromString LIB "diCrPKI.dll" ALIAS "CMS_MakeEnvDataFromString" _ (BYVAL strFileOut AS STRING, BYVAL strDataIn AS STRING, _ BYVAL strCertList AS STRING, BYVAL strSeed AS STRING, BYVAL nSeedLen AS LONG, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_ReadEnvData LIB "diCrPKI.dll" ALIAS "CMS_ReadEnvData" _ (BYVAL strFileOut AS STRING, BYVAL strFileIn AS STRING, _ BYVAL strCertFile AS STRING, BYVAL strPrivateKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_ReadEnvDataToString LIB "diCrPKI.dll" ALIAS "CMS_ReadEnvDataToString" _ (BYVAL strDataOut AS STRING, BYVAL nDataLen AS LONG, _ BYVAL strFileIn AS STRING, BYVAL strCertFile AS STRING, _ BYVAL strPrivateKey AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_MakeSigData LIB "diCrPKI.dll" ALIAS "CMS_MakeSigData" _ (BYVAL strFileOut AS STRING, BYVAL strFileIn AS STRING, _ BYVAL strCertList AS STRING, BYVAL strPrivateKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_MakeSigDataFromString LIB "diCrPKI.dll" ALIAS "CMS_MakeSigDataFromString" _ (BYVAL strFileOut AS STRING, BYVAL strDataIn AS STRING, _ BYVAL strCertList AS STRING, BYVAL strPrivateKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_MakeDetachedSig LIB "diCrPKI.dll" ALIAS "CMS_MakeDetachedSig" _ (BYVAL strFileOut AS STRING, BYVAL strHexDigest AS STRING, _ BYVAL strCertList AS STRING, BYVAL strPrivateKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_ReadSigData LIB "diCrPKI.dll" ALIAS "CMS_ReadSigData" _ (BYVAL strFileOut AS STRING, BYVAL strFileIn AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_ReadSigDataToString LIB "diCrPKI.dll" ALIAS "CMS_ReadSigDataToString" _ (BYVAL strDataOut AS STRING, BYVAL nDataLen AS LONG, _ BYVAL strFileIn AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION CMS_GetSigDataDigest LIB "diCrPKI.dll" ALIAS "CMS_GetSigDataDigest" _ (BYVAL strHexDigest AS STRING, BYVAL nHexDigestLen AS LONG, _ BYVAL strFileIn AS STRING, BYVAL strCertFile AS STRING, _ BYVAL nOptions AS LONG) AS LONG ' RSA KEY FUNCTIONS DECLARE FUNCTION RSA_MakeKeys LIB "diCrPKI.dll" ALIAS "RSA_MakeKeys"_ (BYVAL strPubKeyFile AS STRING, BYVAL strPvkKeyFile AS STRING, _ BYVAL nBits AS LONG, BYVAL nExpFermat AS LONG, BYVAL nTests AS LONG, _ BYVAL nCount AS LONG, BYVAL strPassword AS STRING, _ BYVAL strSeed AS STRING, BYVAL nSeedLen AS LONG, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_ReadEncPrivateKey LIB "diCrPKI.dll" ALIAS "RSA_ReadEncPrivateKey" _ (BYVAL strPrivateKey AS STRING, BYVAL nKeyMaxLen AS LONG, BYVAL strEpkFileName AS STRING, _ BYVAL strPassword AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_ReadPrivateKeyInfo LIB "diCrPKI.dll" ALIAS "RSA_ReadPrivateKeyInfo" _ (BYVAL strPrivateKey AS STRING, BYVAL nKeyMaxLen AS LONG, BYVAL strPriFileName AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_ReadPublicKey LIB "diCrPKI.dll" ALIAS "RSA_ReadPublicKey" _ (BYVAL strPublicKey AS STRING, BYVAL nKeyMaxLen AS LONG, BYVAL strKeyFileName AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_SavePublicKey LIB "diCrPKI.dll" ALIAS "RSA_SavePublicKey" _ (BYVAL strOutputFile AS STRING, BYVAL strPublicKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_GetPublicKeyFromCert LIB "diCrPKI.dll" ALIAS "RSA_GetPublicKeyFromCert" _ (BYVAL strPublicKey AS STRING, BYVAL nKeyMaxLen AS LONG, BYVAL strCertFileName AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_SaveEncPrivateKey LIB "diCrPKI.dll" ALIAS "RSA_SaveEncPrivateKey" _ (BYVAL strOutputFile AS STRING, BYVAL strPrivateKey AS STRING, BYVAL nCount AS LONG, _ BYVAL strPassword AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_SavePrivateKeyInfo LIB "diCrPKI.dll" ALIAS "RSA_SavePrivateKeyInfo" _ (BYVAL strOutputFile AS STRING, BYVAL strPrivateKey AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_GetPrivateKeyFromPFX LIB "diCrPKI.dll" ALIAS "RSA_GetPrivateKeyFromPFX" _ (BYVAL strOutputFile AS STRING, BYVAL strPfxFile AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_RawLib LIB "diCrPKI.dll" ALIAS "RSA_RawLib" _ (BYREF abData AS BYTE, BYVAL nDataLen AS LONG, _ BYVAL strPublicKey AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_RawPrivate LIB "diCrPKI.dll" ALIAS "RSA_RawPrivate" _ (BYREF abData AS BYTE, BYVAL nDataLen AS LONG, _ BYVAL strPrivateKey AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RSA_KeyBits LIB "diCrPKI.dll" ALIAS "RSA_KeyBits" _ (BYVAL strKey AS STRING) AS LONG DECLARE FUNCTION RSA_KeyBytes LIB "diCrPKI.dll" ALIAS "RSA_KeyBytes" _ (BYVAL strKey AS STRING) AS LONG ' X.509 CERTIFICATE FUNCTIONS DECLARE FUNCTION X509_MakeCertSelf LIB "diCrPKI.dll" ALIAS "X509_MakeCertSelf"_ (BYVAL strNewCertFile AS STRING, BYVAL strEPKFile AS STRING, _ BYVAL nCertNum AS LONG, BYVAL nYearsValid AS LONG, _ BYVAL strDistName AS STRING, BYVAL strEmail AS STRING, _ BYVAL KeyUsageFlags AS LONG, _ BYVAL strPassword AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_MakeCert LIB "diCrPKI.dll" ALIAS "X509_MakeCert"_ (BYVAL strNewCertFile AS STRING, BYVAL strIssuerCertFile AS STRING, _ BYVAL strSubjectPubKeyFile AS STRING, BYVAL strIssuerPvkInfoFile AS STRING, _ BYVAL nCertNum AS LONG, BYVAL nYearsValid AS LONG, _ BYVAL strDistName AS STRING, BYVAL strEmail AS STRING, _ BYVAL KeyUsageFlags AS LONG, _ BYVAL strPassword AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertRequest LIB "diCrPKI.dll" ALIAS "X509_CertRequest" _ (BYVAL strReqFile AS STRING, BYVAL strEPKFile AS STRING, _ BYVAL strDistName AS STRING, BYVAL strReserved AS STRING, _ BYVAL strPassword AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_VerifyCert LIB "diCrPKI.dll" ALIAS "X509_VerifyCert" _ (BYVAL strCertToVerify AS STRING, BYVAL strIssuerCert AS STRING, _ BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertThumb LIB "diCrPKI.dll" ALIAS "X509_CertThumb" _ (BYVAL strCertFile AS STRING, BYVAL strHexHash AS STRING, _ BYVAL nHexHashLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertIsValidNow LIB "diCrPKI.dll" ALIAS "X509_CertIsValidNow" _ (BYVAL strCertFile AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertIssuedOn LIB "diCrPKI.dll" ALIAS "X509_CertIssuedOn" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertExpiresOn LIB "diCrPKI.dll" ALIAS "X509_CertExpiresOn" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertSerialNumber LIB "diCrPKI.dll" ALIAS "X509_CertSerialNumber" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertIssuerName LIB "diCrPKI.dll" ALIAS "X509_CertIssuerName" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL strDelim AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_CertSubjectName LIB "diCrPKI.dll" ALIAS "X509_CertSubjectName" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL strDelim AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION X509_HashIssuerAndSN LIB "diCrPKI.dll" ALIAS "X509_HashIssuerAndSN" _ (BYVAL strCertFile AS STRING, BYVAL strOutput AS STRING, _ BYVAL nOutputLen AS LONG, BYVAL nOptions AS LONG) AS LONG ' TRIPLE DATA ENCRYPTION ALGORITHM (TDEA/3DES/TRIPLE DES) BLOCK CIPHER FUNCTIONS DECLARE FUNCTION TDEA_BytesMode LIB "diCrPKI.dll.dll" ALIAS "TDEA_BytesMode" _ (BYREF aResult AS BYTE, BYREF aData AS BYTE, BYVAL lngDataLen AS LONG, _ BYREF aKey AS BYTE, BYVAL bEncrypt AS LONG, _ BYVAL sMode AS STRING, BYREF aInitV AS BYTE) AS LONG DECLARE FUNCTION TDEA_HexMode LIB "diCrPKI.dll" ALIAS "TDEA_HexMode" _ (BYVAL sOutput AS STRING, BYVAL sInput AS STRING, _ BYVAL sHexKey AS STRING, BYVAL bEncrypt AS LONG, _ BYVAL sMode AS STRING, BYVAL sHexIV AS STRING) AS LONG DECLARE FUNCTION TDEA_B64Mode LIB "diCrPKI.dll" ALIAS "TDEA_B64Mode" _ (BYVAL sOutput AS STRING, BYVAL sInput AS STRING, _ BYVAL sKey64 AS STRING, BYVAL bEncrypt AS LONG, _ BYVAL sMode AS STRING, BYVAL sIV64 AS STRING) AS LONG ' ENCODING CONVERSION FUNCTIONS DECLARE FUNCTION CNV_HexStrFromBytes LIB "diCrPKI.dll" ALIAS "CNV_HexStrFromBytes" _ (BYVAL strHex AS STRING, BYVAL nHexStrLen AS LONG, _ BYREF abData AS BYTE, BYVAL nDataLen AS LONG) AS LONG ' See cnvHexStrFromBytes below DECLARE FUNCTION CNV_BytesFromHexStr LIB "diCrPKI.dll" ALIAS "CNV_BytesFromHexStr" _ (BYREF abData AS BYTE, BYVAL nDataLen AS LONG, BYVAL strHex AS STRING) AS LONG ' See cnvBytesFromHexStr below DECLARE FUNCTION CNV_HexFilter LIB "diCrPKI.dll" ALIAS "CNV_HexFilter" _ (BYVAL strOutput AS STRING, BYVAL strInput AS STRING, BYVAL nStrLen AS LONG) AS LONG ' See cnvHexFilter below DECLARE FUNCTION CNV_B64StrFromBytes LIB "diCrPKI.dll" ALIAS "CNV_B64StrFromBytes" _ (BYVAL strB64 AS STRING, BYVAL nB64StrLen AS LONG, _ BYREF abData AS BYTE, BYVAL nDataLen AS LONG) AS LONG ' See cnvB64StrFromBytes below DECLARE FUNCTION CNV_BytesFromB64Str LIB "diCrPKI.dll" ALIAS "CNV_BytesFromB64Str" _ (BYREF abData AS BYTE, BYVAL nDataLen AS LONG, BYVAL strB64 AS STRING) AS LONG ' See cnvBytesFromB64Str below DECLARE FUNCTION CNV_B64Filter LIB "diCrPKI.dll" ALIAS "CNV_B64Filter" _ (BYVAL strOutput AS STRING, BYVAL strInput AS STRING, BYVAL nStrLen AS LONG) AS LONG ' See cnvB64Filter below ' MISCELLANEOUS FUNCTIONS DECLARE FUNCTION PKI_LastError LIB "diCrPKI.dll" ALIAS "PKI_LastError" _ (BYVAL strErrMsg AS STRING, BYVAL nMaxMsgLen AS LONG) AS LONG ' See also pkiGetLastError() below DECLARE FUNCTION PKI_ErrorCode LIB "diCrPKI.dll" ALIAS "PKI_ErrorCode" () AS LONG DECLARE FUNCTION PKI_ErrorLookup LIB "diCrPKI.dll" ALIAS "PKI_ErrorLookup" _ (BYVAL strErrMsg AS STRING, BYVAL nMaxMsgLen AS LONG, BYVAL nErrorCode AS LONG) AS LONG DECLARE FUNCTION PKI_PowerUpTests LIB "diCrPKI.dll" ALIAS "PKI_PowerUpTests" _ (BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION PKI_Version LIB "diCrPKI.dll" ALIAS "PKI_Version" _ (BYREF nMajor AS LONG, BYREF nMinor AS LONG) AS LONG DECLARE FUNCTION PKI_LicenceType LIB "diCrPKI.dll" ALIAS "PKI_LicenceType" _ (BYVAL nReserved AS LONG) AS LONG DECLARE FUNCTION PKI_CompileTime LIB "diCrPKI.dll" ALIAS "PKI_CompileTime" _ (BYVAL strCompiledOn AS STRING, BYVAL nStrLen AS LONG) AS LONG DECLARE FUNCTION PKI_ModuleName LIB "diCrPKI.dll" ALIAS "PKI_ModuleName" _ (BYVAL strModuleName AS STRING, BYVAL nStrLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION PWD_Prompt LIB "diCrPKI.dll" ALIAS "PWD_Prompt" _ (BYVAL strPassword AS STRING, BYVAL nPwdLen AS LONG, BYVAL strCaption AS STRING) AS LONG DECLARE FUNCTION PWD_PromptEx LIB "diCrPKI.dll" ALIAS "PWD_PromptEx" _ (BYVAL strPassword AS STRING, BYVAL nPwdLen AS LONG, BYVAL strCaption AS STRING, _ BYVAL strPrompt AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION HASH_HexFromBytes LIB "diCrPKI.dll" ALIAS "HASH_HexFromBytes" _ (BYVAL strHexDigest AS STRING, BYVAL nLenHex AS LONG, BYREF abMessage AS BYTE, _ BYVAL nMsgLen AS LONG, BYVAL nOptions AS LONG) AS LONG ' Alternative Alias to cope with ANSI strings... DECLARE FUNCTION HASH_HexFromString LIB "diCrPKI.dll" ALIAS "HASH_HexFromBytes" _ (BYVAL strHexDigest AS STRING, BYVAL nLenHex AS LONG, BYVAL strMessage AS STRING, _ BYVAL nMsgLen AS LONG, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION RNG_Bytes LIB "diCrPKI.dll" ALIAS "RNG_Bytes" _ (BYREF abData AS BYTE, BYVAL nDataLen AS LONG, BYVAL strSeed AS STRING, _ BYVAL nSeedLen AS LONG) AS LONG ' Alternative Alias to write to an ANSI string... DECLARE FUNCTION RNG_String LIB "diCrPKI.dll" ALIAS "RNG_Bytes" _ (BYVAL strData AS STRING, BYVAL nDataLen AS LONG, BYVAL strSeed AS STRING, _ BYVAL nSeedLen AS LONG) AS LONG DECLARE FUNCTION WIPE_File LIB "diCrPKI.dll" ALIAS "WIPE_File" _ (BYVAL strFileName AS STRING, BYVAL nOptions AS LONG) AS LONG DECLARE FUNCTION WIPE_Data LIB "diCrPKI.dll" ALIAS "WIPE_Data" _ (BYREF abData AS BYTE, BYVAL nBytes AS LONG) AS LONG ' Alternative Aliases to cope with Byte and String types explicitly... DECLARE FUNCTION WIPE_Bytes LIB "diCrPKI.dll" ALIAS "WIPE_Data" _ (BYREF abData AS BYTE, BYVAL nBytes AS LONG) AS LONG DECLARE FUNCTION WIPE_String LIB "diCrPKI.dll" ALIAS "WIPE_Data" _ (BYVAL strData AS STRING, BYVAL nStrLen AS LONG) AS LONG ' *** END OF CRYPTOSYS PKI DECLARATIONS ' SOME USEFUL WRAPPER FUNCTIONS FUNCTION cnvHexStrFromBytes(abData() AS BYTE) AS STRING ON ERROR GOTO CatchEmptyData DIM strHex AS STRING DIM nHexLen AS LONG DIM nDataLen AS LONG nDataLen = UBOUND(abData) - LBOUND(abData) + 1 nHexLen = CNV_HexStrFromBytes($vbNullString, 0, abData(0), nDataLen) IF nHexLen <= 0 THEN EXIT FUNCTION END IF strHex = STRING$(nHexLen, " ") nHexLen = CNV_HexStrFromBytes(strHex, nHexLen, abData(0), nDataLen) cnvHexStrFromBytes = LEFT$(strHex, nHexLen) CatchEmptyData: END FUNCTION SUB cnvBytesFromHexStr(strHex AS STRING, abData() AS BYTE) LOCAL nDataLen AS LONG LOCAL nHexLen AS LONG nDataLen = CNV_BytesFromHexStr(0, 0, strHex) IF nDataLen <= 0 THEN EXIT SUB END IF REDIM abData(nDataLen - 1) nDataLen = CNV_BytesFromHexStr(abData(0), nDataLen, strHex) REDIM PRESERVE abData(nDataLen - 1) ' cnvBytesFromHexStr = abData() END SUB FUNCTION cnvHexFilter(strHex AS STRING) AS STRING LOCAL strFiltered AS STRING LOCAL nDataLen AS LONG strFiltered = STRING$(LEN(strHex), " ") nDataLen = CNV_HexFilter(strFiltered, strHex, LEN(strHex)) strFiltered = LEFT$(strFiltered, nDataLen) cnvHexFilter = strFiltered END FUNCTION FUNCTION cnvB64StrFromBytes(abData() AS BYTE) AS STRING ON ERROR GOTO CatchEmptyData LOCAL strB64 AS STRING LOCAL nB64Len AS LONG LOCAL nDataLen AS LONG nDataLen = UBOUND(abData) - LBOUND(abData) + 1 nB64Len = CNV_B64StrFromBytes($vbNullString, 0, abData(0), nDataLen) IF nB64Len <= 0 THEN EXIT FUNCTION END IF strB64 = STRING$(nB64Len, " ") nB64Len = CNV_B64StrFromBytes(strB64, nB64Len, abData(0), nDataLen) cnvB64StrFromBytes = LEFT$(strB64, nB64Len) CatchEmptyData: END FUNCTION SUB cnvBytesFromB64Str(strB64 AS STRING, abData() AS BYTE) ' LOCAL abData() AS BYTE LOCAL nDataLen AS LONG LOCAL nB64Len AS LONG ' cnvBytesFromB64Str = abData() nDataLen = CNV_BytesFromB64Str(0, 0, strB64) IF nDataLen <= 0 THEN EXIT SUB END IF REDIM abData(nDataLen - 1) nDataLen = CNV_BytesFromB64Str(abData(0), nDataLen, strB64) REDIM PRESERVE abData(nDataLen - 1) ' cnvBytesFromB64Str = abData() END SUB FUNCTION cnvB64Filter(strB64 AS STRING) AS STRING LOCAL strFiltered AS STRING LOCAL nDataLen AS LONG strFiltered = STRING$(LEN(strB64), " ") nDataLen = CNV_B64Filter(strFiltered, strB64, LEN(strB64)) strFiltered = LEFT$(strFiltered, nDataLen) cnvB64Filter = strFiltered END FUNCTION FUNCTION pkiGetLastError() AS STRING LOCAL sErrMsg AS STRING LOCAL nLen AS LONG nLen = 511 sErrMsg = STRING$(nLen, " ") nLen = PKI_LastError(sErrMsg, nLen) sErrMsg = LEFT$(sErrMsg, nLen) pkiGetLastError = sErrMsg END FUNCTION FUNCTION pwdPrompt(OPTIONAL sCaption AS STRING) AS STRING LOCAL sPassword AS STRING LOCAL nLen AS LONG nLen = 255 sPassword = STRING$(nLen, " ") nLen = PWD_Prompt(sPassword, nLen, sCaption) IF nLen < 0 THEN EXIT FUNCTION ELSEIF nLen > 0 THEN pwdPrompt = LEFT$(sPassword, nLen) END IF ' Clean up local variable CALL WIPE_String(sPassword, nLen) END FUNCTION FUNCTION rsaReadPrivateKey(strEPKFile AS STRING, strPassword AS STRING) AS STRING LOCAL lngKeyLen AS LONG LOCAL lngRet AS LONG LOCAL rsaReadPrivateKey1 AS STRING ' How LONG is PrivateKey string? lngKeyLen = RSA_ReadEncPrivateKey("", 0, strEPKFile, strPassword, 0) IF lngKeyLen <= 0 THEN EXIT FUNCTION END IF ' Pre-dimension the string to receive data rsaReadPrivateKey1 = STRING$(lngKeyLen, " ") ' Read in the Private Key lngRet = RSA_ReadEncPrivateKey(rsaReadPrivateKey1, lngKeyLen, strEPKFile, strPassword, 0) rsaReadPrivateKey = rsaReadPrivateKey1 END FUNCTION FUNCTION rsaReadPublicKey(strKeyFile AS STRING) AS STRING LOCAL lngKeyLen AS LONG LOCAL lngRet AS LONG LOCAL rsaReadPublicKey1 AS STRING ' How LONG is key string? lngKeyLen = RSA_ReadPublicKey("", 0, strKeyFile, 0) IF lngKeyLen <= 0 THEN EXIT FUNCTION END IF ' Pre-dimension the string to receive data rsaReadPublicKey1 = STRING$(lngKeyLen, " ") ' Read in the Private Key lngRet = RSA_ReadPublicKey(rsaReadPublicKey1, lngKeyLen, strKeyFile, 0) rsaReadPublicKey = rsaReadPublicKey1 END FUNCTION ' *** END OF USEFUL WRAPPER FUNCTIONS