Reads and decrypts CMS enveloped-data object using the recipient's private key writing the plaintext data directly into a string.
Public Declare Function CMS_ReadEnvDataToString Lib "diCrPKI.dll"
(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
nRet = CMS_ReadEnvDataToString(strDataOut, nDataLen, strFileIn,
strCertFile, strPrivateKey, nOptions) As Long
long __stdcall CMS_ReadEnvDataToString(char *szOutput, long nOutChars, const char *szFileIn, const char *szCertFile, const char *szPrivateKey, long nOptions);
If successful, the return value is the number of bytes in the decrypted plaintext; otherwise it returns a negative error code.
Public Function cmsReadEnvDataToString
(szFileIn As String, szCertFile As String, szPrivateKey As String, Optional nOptions As Long = 0) As String
Cms.ReadEnvDataToString Method
static Cms.read_envdata_to_string(inputfile, prikeystr, certfile="")
For the "raw" VBA/C function, the user must allocate an output string buffer szOutput of the required length. Specify a zero nOutChars or an empty string for szOutput to find the required length. ANSI C users must add one to this value when allocating memory.
See the remarks for CMS_ReadEnvData()
above.
Alternatively, use the CMS_QueryEnvData()
function with the query "sizeofEncryptedContent"
.
This will return an upper bound on the length of the decrypted plaintext, at most 16 bytes too long.
Calling CMS_ReadEnvDataToString()
with a properly-sized output buffer will return the exact size of the
recovered plaintext.
The buffer must be large enough to receive the entire output or a SHORT_BUF_ERROR
error will result.
Use this function only if the output plaintext is known to be plain ASCII text with no embedded NUL (zero) characters, otherwise use CMS_ReadEnvDataToBytes.
The following example reads the file created with CMS_MakeEnvData
above.
Bob's private key needs to be read into a string first
(see RSA_ReadAnyPrivateKey
).
The output is written into a string.
Dim strPrivateKey As String Dim strFileIn As String Dim strDataOut As String Dim nLen As Long Dim strCertFile As String strFileIn = "cms2bobandcarl.p7m" ' First, Bob reads his private key into a string strPrivateKey = rsaReadPrivateKey("BobPrivRSAEncrypt.p8e", "password") If Len(strPrivateKey) = 0 Then MsgBox "Cannot read private key" Exit Sub End If ' Query the size of encrypted content (no need for an output buffer) nLen = CMS_QueryEnvData("", 0, strFileIn, "sizeofEncryptedContent", 0) Debug.Print "CMS_QueryEnvData returns " & nLen If nLen <= 0 Then GoTo CleanUp End If ' Pre-dimension string and read in the plaintext ' The final plaintext will always be shorter than the encrypted content. strDataOut = String(nLen, " ") nLen = CMS_ReadEnvDataToString(strDataOut, nLen, _ strFileIn, "", strPrivateKey, 0) Debug.Print "CMS_ReadEnvDataToString returns " & nLen If nLen > 0 Then ' Fix correct size for final, unpadded plaintext strDataOut = Left(strDataOut, nLen) Debug.Print "Plaintext is '" & strDataOut & "'" End If CleanUp: WIPE_String strPrivateKey, Len(strPrivateKey) strPrivateKey = ""
Dim strPrivateKey As String Dim lpData() As Byte Dim strData As String ' Read in private key to internal key string strPrivateKey = rsaReadPrivateKey("BobPrivRSAEncrypt.p8e", "password") Debug.Assert Len(strPrivateKey) > 0 ' 1. Decrypted content is UTF-8 encoded lpData = cmsReadEnvDataToBytes("cmsalice2bob_utf8.p7m", "", strPrivateKey, 0) Debug.Assert cnvBytesLen(lpData) > 0 Debug.Print "HEX(PT)=" & cnvHexStrFromBytes(lpData) ' Convert from UTF-8-encoded bytes to VB Unicode string strData = cnvLatin1FromUTF8Bytes(lpData) Debug.Print "PT=" & strData ' 2. Decrypted content is plain ANSI string strData = cmsReadEnvDataToString("cms2bobandcarl.p7m", "", strPrivateKey, 0) Debug.Print "PT=" & strData ' Clean up strPrivateKey = wipeString(strPrivateKey)
CMS_ReadEnvData CMS_ReadEnvDataToBytes CMS_MakeEnvDataFromString CMS_MakeEnvData CMS_QueryEnvData