Dim m_nErrors

Sub TestError(sMsg)
    Response.Write  Chr(13) & Chr(10) & "***TEST FAILURE FOR " & sMsg & Chr(13) & Chr(10)
    m_nErrors = m_nErrors + 1
End Sub

    Dim oGen
    Dim oConv 
    Dim oRng
    Dim oAes
    Dim oTdea 
    Dim oDes 
    Dim oBlf 
    Dim oPc1 
    Dim oMd5 
    Dim oSha 
    Dim oSha2 
    Dim oPbe
    Dim oCrc
    
    Dim sHexKey
    Dim sHexIV
    Dim sPlain
    Dim sCipher
    Dim sOutput
    Dim sDigest
    Dim sCorrect
    Dim sHexData
    Dim i
    Dim bOK
    
    Set oGen = Server.CreateObject("diCryptOCX.gen")
    Set oConv = Server.CreateObject("diCryptOCX.conv")
    Set oRng = Server.CreateObject("diCryptOCX.rng")
    Set oAes = Server.CreateObject("diCryptOCX.aes128")
    Set oTdea = Server.CreateObject("diCryptOCX.tdea")
    Set oDes = Server.CreateObject("diCryptOCX.des")
    Set oBlf = Server.CreateObject("diCryptOCX.blf")
    Set oPc1 = Server.CreateObject("diCryptOCX.pc1")
    Set oMd5 = Server.CreateObject("diCryptOCX.md5")
    Set oSha = Server.CreateObject("diCryptOCX.sha1")
    Set oSha2 = Server.CreateObject("diCryptOCX.sha256")
    Set oPbe = Server.CreateObject("diCryptOCX.pbe")
    Set oCrc = Server.CreateObject("diCryptOCX.crc32")
   
    Response.Write "Time now: " & Now() & Chr(13) & Chr(10)
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing General functions..." & Chr(13) & Chr(10)
    Response.Write "Version=" & oGen.Version & Chr(13) & Chr(10)
    Response.Write "ActiveX Version=" & oGen.ActivexVersion & Chr(13) & Chr(10)
    Response.Write "Licence Type=" & oGen.LicenceType & Chr(13) & Chr(10)
    Response.Write "Module Name=" & oGen.ModuleName & Chr(13) & Chr(10)
    Response.Write "Compiled=" & oGen.CompileTime & Chr(13) & Chr(10)
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing RNG (these should always be different)..." & Chr(13) & Chr(10)
    Response.Write "5 random 192-bit keys..." & Chr(13) & Chr(10)
    For i = 1 To 5
        Response.Write oRng.KeyHex(24) & Chr(13) & Chr(10)
    Next
    Response.Write "5 random 16-byte nonces..." & Chr(13) & Chr(10)
    For i = 1 To 5
        Response.Write oRng.NonceHex(16) & Chr(13) & Chr(10)
    Next
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing AES128..." & Chr(13) & Chr(10)
    'Source: FIPS-197
    'C.1 AES-128 (Nk=4, Nr=10)
    'PLAINTEXT: 00112233445566778899aabbccddeeff
    'KEY: 000102030405060708090a0b0c0d0e0f
    sHexKey = "000102030405060708090a0b0c0d0e0f"
    sPlain = "00112233445566778899aabbccddeeff"
    sCipher = "69c4e0d86a7b0430d8cdb78070b4c55a"
    
    ' Encrypt in ECB mode
    sOutput = oAes.HexMode(sPlain, sHexKey, True, "ECB", "")
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("AES128-ECB-Enc")
    
    ' Decrypt in ECB mode
    sOutput = oAes.HexMode(sCipher, sHexKey, False, "ECB", "")
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("AES128-ECB-Dec")
    
    'Source: RFC 3602 The AES-CBC Cipher Algorithm and Its Use with IPsec
    ' Case #4: Encrypting 64 bytes (4 blocks) using AES-CBC with 128-bit key
    ' Key       : 0x56e47a38c5598974bc46903dba290349
    ' IV        : 0x8ce82eefbea0da3c44699ed7db51b7d9
    ' Plaintext : 0xa0a1a2a3a4a5a6a7a8a9aaabacadaeaf
    '               b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
    '               c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
    '               d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
    ' Ciphertext: 0xc30e32ffedc0774e6aff6af0869f71aa
    '               0f3af07a9a31a9c684db207eb0ef8e4e
    '               35907aa632c3ffdf868bb7b29d3d46ad
    '               83ce9f9a102ee99d49a53e87f4c3da55
    
    sHexKey = "56e47a38c5598974bc46903dba290349"
    sHexIV = "8ce82eefbea0da3c44699ed7db51b7d9"
    sPlain = "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" _
        & "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" _
        & "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" _
        & "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
    sCipher = "c30e32ffedc0774e6aff6af0869f71aa" _
        & "0f3af07a9a31a9c684db207eb0ef8e4e" _
        & "35907aa632c3ffdf868bb7b29d3d46ad" _
        & "83ce9f9a102ee99d49a53e87f4c3da55"

    ' Encrypt in CBC mode
    sOutput = oAes.HexMode(sPlain, sHexKey, True, "CBC", sHexIV)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("AES128-CBC-Enc")
    
    ' Decrypt in CBC mode
    sOutput = oAes.HexMode(sCipher, sHexKey, False, "CBC", sHexIV)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("AES128-CBC-Dec")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing Triple DES..." & Chr(13) & Chr(10)
    'Source: NIST Special Publication 800-67 Appendix B
    'Key1 = 0123456789ABCDEF
    'Key2 = 23456789ABCDEF01
    'Key3 = 456789ABCDEF0123
    'Plaintext:
    '"The quic" 5468652071756663
    '"k brown " 6B2062726F776E20
    '"fox jump" 666F78206A756D70
    'Ciphertext:
    'A826FD8CE53B855F CCE21C8112256FE6 68D5C05DD9B6B900
    sHexKey = "0123456789ABCDEF23456789ABCDEF01456789ABCDEF0123"
    sPlain = "54686520717566636B2062726F776E20666F78206A756D70"
    sCipher = "A826FD8CE53B855FCCE21C8112256FE668D5C05DD9B6B900"
    
    ' Encrypt in ECB mode
    sOutput = oTdea.HexMode(sPlain, sHexKey, True, "ECB", "")
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("TDEA-ECB-Enc")
    
    ' Decrypt in ECB mode
    sOutput = oTdea.HexMode(sCipher, sHexKey, False, "ECB", "")
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("TDEA-ECB-Dec")
    
    'Source: Section 8.1 of smime-examples
    sPlain = "5468697320736F6D652073616D706520636F6E74656E742E0808080808080808"
    '         T h i s _ s o m e _ s a m p e _ c o n t e n t . (padding 8 x 08)
    sHexKey = "737C791F25EAD0E04629254352F7DC6291E5CB26917ADA32"
    sHexIV = "B36B6BFB6231084E"
    sCipher = "d76fd1178fbd02f84231f5c1d2a2f74a4159482964f675248254223daf9af8e4"
 
    ' Encrypt in CBC mode
    sOutput = oTdea.HexMode(sPlain, sHexKey, True, "CBC", sHexIV)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("TDEA-CBC-Enc")
    
    ' Decrypt in CBC mode
    sOutput = oTdea.HexMode(sCipher, sHexKey, False, "CBC", sHexIV)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("TDEA-CBC-Dec")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing single DES..." & Chr(13) & Chr(10)
    'Source: FIPS-81 DES MODES OF OPERATION Table B1
    'Cryptographic Key = 0123456789abcdef
    'Plaintext = "Now is the time for all "
    '= 4e6f772069732074 68652074696d6520 666f7220616c6c20
    'Cipher text = 3fa40e8a984d4815 6a271787ab8883f9 893d51ec4b563b53

    sHexKey = "0123456789abcdef"
    sPlain = "4e6f77206973207468652074696d6520666f7220616c6c20"
    sCipher = "3fa40e8a984d48156a271787ab8883f9893d51ec4b563b53"
    
    ' Encrypt in ECB mode
    sOutput = oDes.HexMode(sPlain, sHexKey, True, "ECB", "")
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("DES-ECB-Enc")
    
    ' Decrypt in ECB mode
    sOutput = oDes.HexMode(sCipher, sHexKey, False, "ECB", "")
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("DES-ECB-Dec")
    
    'Source: FIPS-81 DES MODES OF OPERATION Table C1
    'Cryptographic Key = 0123456789abcdef
    'Initialization Vector = 1234567890abcdef
    'Plaintext = "Now is the time for all "
    '= 4e6f772069732074 68652074696d6520 666f7220616c6c20
    'Cipher text = e5c7cdde872bf27c 43e934008c389c0f 683788499a7c05f6
    sHexKey = "0123456789abcdef"
    sHexIV = "1234567890abcdef"
    sPlain = "4e6f77206973207468652074696d6520666f7220616c6c20"
    sCipher = "e5c7cdde872bf27c43e934008c389c0f683788499a7c05f6"
 
    ' Encrypt in CBC mode
    sOutput = oDes.HexMode(sPlain, sHexKey, True, "CBC", sHexIV)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("DES-CBC-Enc")
    
    ' Decrypt in CBC mode
    sOutput = oDes.HexMode(sCipher, sHexKey, False, "CBC", sHexIV)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("DES-CBC-Dec")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing Blowfish..." & Chr(13) & Chr(10)
    ' Source: Blowfish test vectors by Eric Young
    ' Key = FEDCBA9876543210
    ' Plaintext = FFFFFFFFFFFFFFFF
    ' Ciphertext = 6B5C5A9C5D9E0A5A

    sHexKey = "FEDCBA9876543210"
    sPlain = "FFFFFFFFFFFFFFFF"
    sCipher = "6B5C5A9C5D9E0A5A"
    
    ' Encrypt in ECB mode
    sOutput = oBlf.HexMode(sPlain, sHexKey, True, "ECB", "")
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("BLF-ECB-Enc")
    
    ' Decrypt in ECB mode
    sOutput = oBlf.HexMode(sCipher, sHexKey, False, "ECB", "")
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("BLF-ECB-Dec")
    
    ' Source: Blowfish test vectors by Eric Young
    'key[16]   = 0123456789ABCDEFF0E1D2C3B4A59687
    'iv[8]     = FEDCBA9876543210
    'data[29]  = "7654321 Now is the time for " (includes trailing '\0')
    'data[29]  = 37363534333231204E6F77206973207468652074696D6520666F722000
    'cbc cipher text
    'cipher[32]= 6B77B4D63006DEE605B156E27403979358DEB9E7154616D959F1652BD5FF92CC
    sHexKey = "0123456789ABCDEFF0E1D2C3B4A59687"
    sHexIV = "FEDCBA9876543210"
    ' NB Plaintext is padded with 3 x nulls for CBC test
    sPlain = "37363534333231204E6F77206973207468652074696D6520666F722000000000"
    sCipher = "6B77B4D63006DEE605B156E27403979358DEB9E7154616D959F1652BD5FF92CC"
 
    ' Encrypt in CBC mode
    sOutput = oBlf.HexMode(sPlain, sHexKey, True, "CBC", sHexIV)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("BLF-CBC-Enc")
    
    ' Decrypt in CBC mode
    sOutput = oBlf.HexMode(sCipher, sHexKey, False, "CBC", sHexIV)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("BLF-CBC-Dec")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing PC1 encryption..." & Chr(13) & Chr(10)
    ' Source: Eric Rescorla
    'Test vector 0
    'Key: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
    'Input: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
    '0 Output: 0x75 0xb7 0x87 0x80 0x99 0xe0 0xc5 0x96 

    sHexKey = "0123456789abcdef"
    sPlain = "0123456789abcdef"
    sCipher = "75b7878099e0c596"
    
    Response.Write "KY=" & sHexKey & Chr(13) & Chr(10)
    ' Encrypt (there's no other way)
    sOutput = oPc1.EncryptHex(sPlain, sHexKey)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("PC1-Enc")
    
    ' Decrypt (just encrypt again)
    sOutput = oPc1.EncryptHex(sCipher, sHexKey)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("PC1-Dec")

    'Test vector 3
    'Key: 0xef 0x01 0x23 0x45 
    'Input: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
    '0 Output: 0xd6 0xa1 0x41 0xa7 0xec 0x3c 0x38 0xdf 0xbd 0x61 
    
    sHexKey = "ef012345"
    sPlain = "00000000000000000000"
    sCipher = "d6a141a7ec3c38dfbd61"
    
    Response.Write "KY=" & sHexKey & Chr(13) & Chr(10)
    ' Encrypt
    sOutput = oPc1.EncryptHex(sPlain, sHexKey)
    Response.Write "CT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sCipher
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("PC1-Enc")
    
    ' Decrypt
    sOutput = oPc1.EncryptHex(sCipher, sHexKey)
    Response.Write "PT=" & sOutput & Chr(13) & Chr(10)
    sCorrect = sPlain
    Response.Write "OK=" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("PC1-Dec")

' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing Hash Functions..." & Chr(13) & Chr(10)
    ' Source: RFC 1321
    sDigest = oMd5.StringHexHash("abc")
    Response.Write "MD5('abc')      =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "900150983cd24fb0d6963f7d28e17f72"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("MD5")
    
    sDigest = oMd5.HexHexHash("616263")
    Response.Write "MD5(0x616263)   =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "900150983cd24fb0d6963f7d28e17f72"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("MD5")
    
     ' Source: FIPS PUB 180-2 Appendix A.1
    sDigest = oSha.StringHexHash("abc")
    Response.Write "SHA1('abc')     =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "a9993e364706816aba3e25717850c26c9cd0d89d"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("SHA-1")
    
    sDigest = oSha.HexHexHash("616263")
    Response.Write "SHA1(0x616263)  =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "a9993e364706816aba3e25717850c26c9cd0d89d"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("SHA-1")
    
    ' Source: FIPS PUB 180-2 Appendix B.1
    sDigest = oSha2.StringHexHash("abc")
    Response.Write "SHA256('abc')   =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("SHA-256")
 
    sDigest = oSha2.HexHexHash("616263")
    Response.Write "SHA256(0x616263)=" & sDigest & Chr(13) & Chr(10)
    sCorrect = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
    Response.Write "Correct         =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("SHA-256")
 
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing HMAC Functions..." & Chr(13) & Chr(10)
    'Source: Test No 1. from RFC 2104
    sHexData = oConv.HexFromString("Hi There")
    sDigest = oMd5.HmacHex(sHexData, "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b")
    Response.Write "HMAC-MD5    =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "9294727a3638bb1c13f48ef8158bfc9d"
    Response.Write "Correct     =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("HMAC-MD5")
    
    'Source: Wei Dai's Crypto++ test vectors
    'fipstest.cpp - written and placed in the public domain by Wei Dai
    'From http://trolocsis.com/crypto++/fipstest_8cpp-source.html
    'MAC_KnownAnswerTest<HMAC<SHA> >(    
    sHexData = oConv.HexFromString("Sample #2")
    sDigest = oSha.HmacHex(sHexData, "303132333435363738393a3b3c3d3e3f40414243")
    Response.Write "HMAC-SHA1   =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "0922d3405faa3d194f82a45830737d5cc6c75d24"
    Response.Write "Correct     =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("HMAC-SHA1")
    
    'MAC_KnownAnswerTest<HMAC<SHA256> >(
    sHexData = oConv.HexFromString("abc")
    sDigest = oSha2.HmacHex(sHexData, "303132333435363738393a3b3c3d3e3f40414243")
    Response.Write "HMAC-SHA256 =" & sDigest & Chr(13) & Chr(10)
    sCorrect = "d28363f335b2dae468793a38680dea9f7fb8be1dceda197cdb3b1cb59a9f6422"
    Response.Write "Correct     =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sDigest, 1) <> 0 Then Call TestError("HMAC-SHA256")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing PBEKDF Function..." & Chr(13) & Chr(10)
    ' Source: PKCS #5 v2.0 from test vectors provided by Dr. Stephen Henson
    ' Derives a 24-byte key from the password "password" with
    ' 8-byte salt = 78 57 8E 5A 5D 63 CB 06 and iteration count = 2048.
    sOutput = oPbe.DKF2FromString(24, "password", "78578E5A5D63CB06", 2048)
    Response.Write "PBE_KDF2=" & sOutput & Chr(13) & Chr(10)
    sCorrect = "BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643"
    Response.Write "Correct =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("PBE-KDF2")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing CRC32 Function..." & Chr(13) & Chr(10)
    ' Source: A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS by Ross N. Williams
    ' ross@guest.adelaide.edu.au
    sOutput = oCrc.StringHex("123456789")
    Response.Write "CRC32('123456789')=" & sOutput & Chr(13) & Chr(10)
    sCorrect = "cbf43926"
    Response.Write "Correct           =" & sCorrect & Chr(13) & Chr(10)
    If StrComp(sCorrect, sOutput, 1) <> 0 Then Call TestError("CRC32-String")
    
' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    Response.Write "Testing Bytes/Hex/base64 conversions..." & Chr(13) & Chr(10)
    Dim abData
    sHexData = "DEADBEEFCAFE"
    abData = oConv.BytesFromHex(sHexData)
    sOutput = oConv.HexFromBytes(abData)
    Response.Write "Hex(0xdeadbeefcafe)=" & sOutput & Chr(13) & Chr(10)
    If StrComp(sHexData, sOutput, 1) <> 0 Then Call TestError("Bytes-Hex")
    
    sOutput = oConv.Base64FromBytes(abData)
    Response.Write "Base64(0xdeadbeefcafe)=" & sOutput & Chr(13) & Chr(10)
    If StrComp("3q2+78r+", sOutput, 1) <> 0 Then Call TestError("Bytes-Base64")
    sHexData = oConv.HexFromBase64(sOutput)
    Response.Write "Hex(" & sOutput & ")=" & sHexData & Chr(13) & Chr(10)
    If StrComp(sHexData, "DEADBEEFCAFE", 1) <> 0 Then Call TestError("Hex-Base64")

' ---------------------------------------------------------
    Response.Write Chr(13)& Chr(10) 
    If m_nErrors = 0 Then
        Response.Write "Success. No errors occurred." & Chr(13) & Chr(10)
    Else
        Response.Write m_nErrors & " ERRORS OCCURRED!" & Chr(13) & Chr(10)
    End If