Attribute VB_Name = "test_cipher_comp"
Option Explicit

' Test code to demonstrate changes with CIPHER functions in CryptoSys PKI v11.1

' $Id: test_cipher_comp.bas $
' $Date: 2016/05/28 09:37:00 $

' Copyright (C) 2016 David Ireland, DI Management Services Pty Ltd <www.di-mgt.com.au>

Public Sub test_CIPHER_Bytes_comp()
    Dim key() As Byte
    Dim iv() As Byte
    Dim pt() As Byte
    Dim ct() As Byte
    Dim ptlen As Long
    Dim ctlen As Long
    Dim keylen As Long
    Dim ivlen As Long
    Dim r As Long
    
    ' Setup input data
    key = cnvBytesFromHexStr("0123456789abcdeffedcba987654321089abcdef01234567")
    iv = cnvBytesFromHexStr("1234567890abcdef")
    ' PT = "Now is the time for all good men"
    pt = cnvBytesFromHexStr("4E6F77206973207468652074696D6520666F7220616C6C20676F6F64206D656E")
    ptlen = UBound(pt) + 1
    Debug.Print "ptlen=" & ptlen
    
    keylen = 24
    ivlen = 8
    ctlen = ptlen
    
    ReDim ct(ctlen - 1)
    
    ' @deprecated
    r = TDEA_BytesMode(ct(0), pt(0), ptlen, key(0), ENCRYPT, "CBC", iv(0))
    
    Debug.Assert (r = 0)
    Debug.Print "CT=" & cnvHexStrFromBytes(ct)
    
    ' @deprecated
    r = CIPHER_Bytes(ENCRYPT, ct(0), pt(0), ptlen, key(0), iv(0), "tdea/cbc", 0)
    
    Debug.Assert (r = 0)
    Debug.Print "CT=" & cnvHexStrFromBytes(ct)
    
    ' @deprecated
    ctlen = CIPHER_EncryptBytesPad(ct(0), ctlen, pt(0), ptlen, key(0), iv(0), "tdea/cbc/nopad", 0)
    
    Debug.Assert (ctlen > 0)
    Debug.Print "CT=" & cnvHexStrFromBytes(ct)

    ' RECOMMENDED
    ctlen = CIPHER_EncryptBytes2(ct(0), ctlen, pt(0), ptlen, key(0), keylen, iv(0), ivlen, "tdea/cbc/nopad", 0)
    
    Debug.Assert (ctlen > 0)
    Debug.Print "CT=" & cnvHexStrFromBytes(ct)

End Sub

Public Sub test_CIPHER_File_comp()

    Dim key() As Byte
    Dim iv() As Byte
    Dim keylen As Long
    Dim ivlen As Long
    Dim r As Long
    Dim filein As String
    Dim fileout As String
    Dim b() As Byte
    
    ' Setup input data
    key = cnvBytesFromHexStr("0123456789abcdeffedcba987654321089abcdef01234567")
    iv = cnvBytesFromHexStr("1234567890abcdef")
    keylen = 24
    ivlen = 8
    
    filein = "abc.txt"
    fileout = "abc-enc.txt"
    
    b = ReadFileIntoBytes(filein)
    Debug.Print "PT=" & cnvHexStrFromBytes(b)
    
    ' @deprecated
    r = TDEA_File(fileout, filein, key(0), ENCRYPT, "CBC", iv(0))
    
    Debug.Assert (r = 0)
    b = ReadFileIntoBytes(fileout)
    Debug.Print "CT=" & cnvHexStrFromBytes(b)
    
    ' @deprecated
    r = CIPHER_File(ENCRYPT, fileout, filein, key(0), iv(0), "tdea/cbc", 0)
    
    Debug.Assert (r = 0)
    b = ReadFileIntoBytes(fileout)
    Debug.Print "CT=" & cnvHexStrFromBytes(b)

    ' RECOMMENDED
    r = CIPHER_FileEncrypt(fileout, filein, key(0), keylen, iv(0), ivlen, "tdea/cbc", 0)
    
    Debug.Assert (r = 0)
    b = ReadFileIntoBytes(fileout)
    Debug.Print "CT=" & cnvHexStrFromBytes(b)
    
    ' Now use AES-128: Setup new key and IV and change length variables to match
    key = cnvBytesFromHexStr("0123456789ABCDEFF0E1D2C3B4A59687")
    iv = cnvBytesFromHexStr("FEDCBA9876543210FEDCBA9876543210")
    keylen = 16
    ivlen = 16

    r = CIPHER_FileEncrypt(fileout, filein, key(0), keylen, iv(0), ivlen, "aes128/cbc/OneAndZeroes", PKI_IV_PREFIX)

    Debug.Assert (r = 0)
    b = ReadFileIntoBytes(fileout)
    Debug.Print "CT=" & cnvHexStrFromBytes(b)

End Sub

Private Function ReadFileIntoBytes(sFilePath As String) As Variant
' Reads file (if it exists) into a byte array.
    Dim abIn() As Byte
    Dim hFile As Integer
    
    ' Check if file exists
    If Len(Dir(sFilePath)) = 0 Then
        Exit Function
    End If
    hFile = FreeFile
    Open sFilePath For Binary Access Read As #hFile
    abIn = InputB(LOF(hFile), #hFile)
    Close #hFile
    ReadFileIntoBytes = abIn
    
End Function