Imports System
Imports System.Diagnostics
Imports System.IO
Imports FirmaSAT

' Some tests using the FirmaSAT .NET interface.
' Requires certain files to exist in the current working directory.

' 
' **************************** COPYRIGHT NOTICE ****************************
' * Copyright (C) 2010 DI Management Services Pty Limited. 
' * All rights reserved. <www.di-mgt.com.au> <www.cryptosys.net>
' *   $Id: TestFirmaSat.vb $
' *   Last updated:
' *   $Date: 2010-01-12 17:37:00 $
' *   $Version: 2.0.0 $
' ************************* END OF COPYRIGHT NOTICE ************************
' 
' This is a slightly tweaked port of TestFirmaSat.cs from C to VB.NET
' using icsharpcode.net's SharpDevelop v3.0.


Module TestFirmaSATvbnet
    ''' <summary>
    ''' Test examples for FirmaSAT .NET interface
    ''' </summary>
    Sub Main(ByVal args As String())
        Dim n As Integer
        Dim s As String, s1 As String
        Dim fname As String
        Dim ch As Char
        Dim attributeName As String, elementName As String
        Dim newname As String, keyfile As String, password As String, certfile As String

        Console.WriteLine("GENERAL METHODS:")
        Console.WriteLine("Interrogate the core diFirmaSat DLL:")
        n = FirmaSAT.General.Version()
        Console.WriteLine("Version={0}", n)
        s = General.CompileTime()
        Console.WriteLine("CompileTime={0}", s)
        s = General.ModuleName()
        Console.WriteLine("ModuleName={0}", s)
        ch = General.LicenceType()
        Console.WriteLine("LicenceType={0}", ch)

        Console.WriteLine(vbLf & "Interrogate the underlying CryptoSys PKI DLL:")
        n = FirmaSAT.General.PKIVersion()
        Console.WriteLine("PKIVersion={0}", n)
        s = General.PKICompileTime()
        Console.WriteLine("PKICompileTime={0}", s)
        s = General.PKIModuleName()
        Console.WriteLine("PKIModuleName={0}", s)

        Console.WriteLine(vbLf & "TRY VALIDATING XML FILES:")
        Console.WriteLine("1. A valid one:")
        fname = "Muestra_v2_signed2.xml"
        n = Sat.ValidateXml(fname)
        Console.WriteLine("Sat.ValidateXml('{0}') returns {1}", fname, n)
        Debug.Assert(n = 0, "Sat.ValidateXml failed")

        Console.WriteLine("2. An invalid one:")
        fname = "Muestra_v2_bad.xml"
        n = Sat.ValidateXml(fname)
        Console.WriteLine("Sat.ValidateXml('{0}') returns {1}", fname, n)
        s = Sat.LastError()
        Console.WriteLine("ErrorLookup({0})={1}", n, General.ErrorLookup(n))
        Console.WriteLine("LastError={0}", s)

        Console.WriteLine(vbLf & "FORM THE PIPESTRING FROM AN XML FILE:")
        fname = "Muestra_v2_signed2.xml"
        s = Sat.MakePipeStringFromXml(fname)
        Console.WriteLine("Sat.MakePipeStringFromXml('{0}')=" & vbLf & "{1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.MakePipeStringFromXml failed")

        Console.WriteLine(vbLf & "SIGN AN XML FILE:")
        fname = "Muestra_v2_base2.xml"
        newname = "Muestra_v2_signed_new.xml"
        keyfile = "aaa010101aaa_CSD_01.key"
        password = "a0123456789"
        ' CAUTION: DO NOT HARD-CODE REAL PASSWORDS! 
        certfile = "aaa010101aaa_CSD_01.cer"
        n = Sat.SignXml(newname, fname, keyfile, password, certfile)
        Console.WriteLine("Sat.SignXml('{0}'-->'{1}') returns {2}", fname, newname, n)
        Debug.Assert(n = 0, "Sat.SignXml failed")
        ' Did we make a valid XML file?
        n = Sat.ValidateXml(newname)
        Console.WriteLine("Sat.ValidateXml('{0}') returns {1}", newname, n)
        Debug.Assert(n = 0, "Sat.ValidateXml failed")

        Console.WriteLine(vbLf & "VERIFY A SIGNATURE IN AN XML FILE:")
        Console.WriteLine("1. One we know is good:")
        fname = "Muestra_v2_signed2.xml"
        n = Sat.VerifySignature(fname)
        Console.WriteLine("Sat.VerifySignature('{0}') returns {1}", fname, n)
        Debug.Assert(n = 0, "Sat.VerifySignature failed")

        Console.WriteLine("2. One we just made, so it should be good:")
        fname = newname
        n = Sat.VerifySignature(fname)
        Console.WriteLine("Sat.VerifySignature('{0}') returns {1}", fname, n)
        Debug.Assert(n = 0, "Sat.VerifySignature failed")

        Console.WriteLine(vbLf & "FORM THE DIGEST OF THE PIPESTRING IN AN XML FILE:")
        fname = "Muestra_v2_signed2.xml"
        s = Sat.MakeDigestFromXml(fname)
        Console.WriteLine("Sat.MakeDigestFromXml('{0}')=" & vbLf & "{1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.MakeDigestFromXml failed")

        Console.WriteLine(vbLf & "EXTRACT THE DIGEST FROM THE SIGNATURE IN AN XML FILE:")
        fname = "Muestra_v2_signed2.xml"
        s = Sat.ExtractDigestFromSignature(fname)
        Console.WriteLine("Sat.ExtractDigestFromSignature('{0}')=" & vbLf & "{1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.ExtractDigestFromSignature failed")

        Console.WriteLine(vbLf & "EXTRACT AN ATTRIBUTE FROM AN XML FILE:")
        fname = "Muestra_v2_signed2.xml"
        elementName = "Comprobante"
        attributeName = "sello"
        s = Sat.GetXmlAttribute(fname, attributeName, elementName)
        Console.WriteLine("Sat.GetXmlAttribute('{0}',{2},{3})=" & vbLf & "{1}", fname, s, attributeName, elementName)
        Debug.Assert(s.Length > 0, "Sat.GetXmlAttribute failed")

        Console.WriteLine(vbLf & "GET DETAILS OF X.509 CERTIFICATE:")
        Console.WriteLine("1. From embedded `certificado` in XML")
        fname = "Muestra_v2_signed2.xml"
        s = Sat.GetCertNumber(fname)
        Console.WriteLine("Sat.GetCertNumber('{0}')={1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.GetCertNumber failed")
        s = Sat.GetCertExpiry(fname)
        Console.WriteLine("Sat.GetCertExpiry('{0}')={1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.GetCertExpiry failed")

        Console.WriteLine("2. From X.509 file")
        fname = "aaa010101aaa_CSD_01.cer"
        s = Sat.GetCertNumber(fname)
        Console.WriteLine("Sat.GetCertNumber('{0}')={1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.GetCertNumber failed")
        s = Sat.GetCertExpiry(fname)
        Console.WriteLine("Sat.GetCertExpiry('{0}')={1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.GetCertExpiry failed")

        Console.WriteLine(vbLf & "GET CERTIFICATE AS A BASE64 STRING:")
        fname = "aaa010101aaa_CSD_01.cer"
        s = Sat.GetCertAsString(fname)
        Console.WriteLine("Sat.GetCertAsString('{0}')=" & vbLf & "{1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.GetCertAsString failed")
        Console.WriteLine("Sat.GetCertAsString('{0}').Length={1}", fname, s.Length)
        ' Compare against string from XML file
        fname = "Muestra_v2_signed2.xml"
        s1 = Sat.GetCertAsString(fname)
        Console.WriteLine("Sat.GetCertAsString('{0}').Length={1}", fname, s1.Length)
        Debug.Assert(s1.Length > 0, "Sat.GetCertAsString failed")
        Debug.Assert([String].Compare(s, s1, True) = 0, "Sat.GetCertAsString failed")

        Console.WriteLine(vbLf & "MAKE A SIGNATURE FROM A BASE XML FILE:")
        fname = "Muestra_v2_base2.xml"
        keyfile = "aaa010101aaa_CSD_01.key"
        password = "a0123456789"
        ' CAUTION: DO NOT HARD-CODE REAL PASSWORDS! 
        s = Sat.MakeSignatureFromXml(fname, keyfile, password)
        Console.WriteLine("Sat.MakeSignatureFromXml('{0}')=" & vbLf & "{1}", fname, s)
        Debug.Assert(s.Length > 0, "Sat.MakeSignatureFromXml failed")

        Console.WriteLine(vbLf & "SIGN A DETALLISTA XML FILE:")
        fname = "detallista_base.xml"
        newname = "detallista-new-signed.xml"
        keyfile = "aaa010101aaa_CSD_01.key"
        password = "a0123456789"
        ' CAUTION: DO NOT HARD-CODE REAL PASSWORDS! 
        certfile = "aaa010101aaa_CSD_01.cer"
        n = Sat.SignXml(newname, fname, keyfile, password, certfile)
        Console.WriteLine("Sat.SignXml('{0}'-->'{1}') returns {2}", fname, newname, n)
        Debug.Assert(n = 0, "Sat.SignXml failed")
        ' Did we make a valid XML file?
        n = Sat.ValidateXml(newname)
        Console.WriteLine("Sat.ValidateXml('{0}') returns {1}", newname, n)
        Debug.Assert(n = 0, "Sat.ValidateXml failed")
        n = Sat.VerifySignature(newname)
        Console.WriteLine("Sat.VerifySignature('{0}') returns {1}", newname, n)
        Debug.Assert(n = 0, "Sat.VerifySignature failed")

        Console.WriteLine(vbLf & "EXTRACT AN ATTRIBUTE FROM A DETALLISTA XML FILE:")
        fname = "detallista-new-signed.xml"
        elementName = "detallista:detallista"
        attributeName = "documentStructureVersion"
        s = Sat.GetXmlAttribute(fname, attributeName, elementName)
        Console.WriteLine("Sat.GetXmlAttribute('{0}',{2},{3})={1}", fname, s, attributeName, elementName)
        Debug.Assert(s.Length > 0, "Sat.GetXmlAttribute failed")
        Debug.Assert([String].Compare(s, "AMC8.1") = 0, "Invalid detallista.documentStructureVersion")


        '---
        '             Console.WriteLine("\nDISPLAY ALL POSSIBLE ERROR MESSAGES:");
        '             for (i = 0; i < 10000; i++)
        '             {
        '                 s = General.ErrorLookup(i);
        '                 if (s.Length > 0)
        '                     Console.WriteLine("{0}=>{1}", i, s);
        '             }
        '             ---


    End Sub
End Module