Removes the padding from an encryption block.
Public Declare Function PAD_UnpadBytes Lib "diCrPKI.dll" (ByRef lpOutput As Byte, ByVal nOutputLen As Long, ByRef lpInput As Byte, ByVal nInputLen As Long, ByVal nBlockLen As Long, ByVal nOptions As Long) As Long
nRet = PAD_UnpadBytes(lpOutput(0), nOutputLen, lpInput(0), nInputLen, nBlockLen, nOptions) ' Note the "(0)" after the byte array parameters
long __stdcall PAD_UnpadBytes(unsigned char *lpOutput, long nOutBytes, const unsigned char *lpInput, long nInputLen, long nBlkLen, long nOptions);
If successful, the return value is the number of bytes in the output; otherwise it returns a negative error code.
Public Function padUnpadBytes
(lpInput() As Byte, nBlkLen As Long, Optional nOptions As Long = 0) As Byte()
Use the method associated with the relevant encryption algorithm class:
Cipher.Unpad Method (Byte[], CipherAlgorithm, Padding)
static bvec_t dipki::Cipher::Unpad (const bvec_t &input, Alg alg, Padding pad=Padding::Pkcs5)
static Cipher.unpad(data, alg, pad=Pad.PKCS5)
The padding is expected according to the convention specified.
If nOutBytes is set to zero or lpOutput set to 0 (or NULL
in C or ByVal 0&
in VBA)
then the required number of bytes will be returned. The output is always shorter than the input.
Only block lengths of 8 or 16 bytes are supported.
This example shows how to cope with a zero-length output in VBA (you can't do ReDim(nOutputLen - 1)
when nOutputLen is zero).
Dim abInput() As Byte Dim abOutput() As Byte Dim nOutputLen As Long Dim nInputLen As Long Dim nBlockLen As Long Dim i As Long nBlockLen = 8 ' Prepare test input 8 bytes long, all equal to 0x08 ' (the padded block for a zero-length input) nInputLen = nBlockLen ReDim abInput(nInputLen - 1) For i = 0 To nInputLen - 1 abInput(i) = CByte(nInputLen) Next Debug.Print "Padded data=0x(" & cnvHexStrFromBytes(abInput) & ")" ' Remove padding... ' No need to query for length because we know the output will be shorter than input ' so make sure output is as long as the input nOutputLen = nInputLen ReDim abOutput(nOutputLen - 1) nOutputLen = PAD_UnpadBytes(abOutput(0), nOutputLen, abInput(0), nInputLen, nBlockLen, 0) Debug.Print "Unpadded length is " & nOutputLen & " bytes" ' Check for error If (nOutputLen < 0) Then Exit Function ' Truncate the output to the correct length If nOutputLen > 0 Then ReDim Preserve abOutput(nOutputLen - 1) Else ' Catch zero-length output abOutput = vbNullString End If Debug.Print "Unpadded data=0x(" & cnvHexStrFromBytes(abOutput) & ")"
This should result in output as follows:
Padded data=0x(0808080808080808) Unpadded length is 0 bytes Unpadded data=0x()
Dim lpInput() As Byte Dim lpBlock() As Byte Dim lpUnpadded() As Byte lpInput = cnvBytesFromHexStr("FDFDFDFDFD") Debug.Print "Input data = 0x" & cnvHexStrFromBytes(lpInput) lpBlock = padBytesBlock(lpInput, 8, 0) Debug.Print "Padded data = 0x" & cnvHexStrFromBytes(lpBlock) ' Unpad lpUnpadded = padUnpadBytes(lpBlock, 8, 0) Debug.Print "Unpadded data = 0x" & cnvHexStrFromBytes(lpUnpadded) ' Special corner case - output is the empty string lpBlock = cnvBytesFromHexStr("0808080808080808") Debug.Print "Padded data = 0x" & cnvHexStrFromBytes(lpBlock) lpUnpadded = padUnpadBytes(lpBlock, 8, 0) Debug.Print "Unpadded data = 0x" & cnvHexStrFromBytes(lpUnpadded)
PAD_BytesBlock
PAD_HexBlock
PAD_UnpadHex