using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kz.GammaTech.Xml;
using System.IO;


namespace ConsoleApplication24
{
    class Program
    {
        static void Main(string[] args)
        {
            // Пример подписания/проверки xml на потоках. Для работы с массиовм байт, необходимо вывести массив в поток 
            // например так:
            
            FileStream file = new FileStream("input.xml", FileMode.Open);
            byte[] arr = new byte[file.Length];
           file.Read(arr, 0, (int)file.Length);
            file.Close();
            MemoryStream mem_stream = new MemoryStream(arr);
           
            XmlSigned xml_s = new XmlSigned();
            // считываем файл для подписи в поток
          StreamReader stream_read = new StreamReader("data.xsl",new UTF8Encoding());                    
          Stream read_base = stream_read.BaseStream;
            
            
            // подготавливаем поток для записи подписанного xml 
         // StreamWriter stream_write = new StreamWriter("data.sign.xsl",false,new UTF8Encoding(),8196);
          //Stream write_base = stream_write.BaseStream;

          MemoryStream stream_write = new MemoryStream();
            // считываем pkcs12 в поток
          StreamReader p12 = new StreamReader("123456789.p12");
          Stream p12_base = p12.BaseStream;

          //   метод перегруженный   
          //    public void SignXmlFile(Stream FileStream, Stream SignedStream, Stream pkcs12_stream, string pass_key)
          //   public  void SignXmlFile(string FileName, string SignedFileName, string KeyFile, string pass_key)


         //  xml_s.SignXmlFile(read_base, write_base,p12_base , "123456789");

         // xml_s.SignXmlFile(read_base, stream_write, p12_base, "123456789");
          xml_s.SignXmlFile(mem_stream, stream_write, p12_base, "123456789"); //- для массива
           Console.WriteLine("Xml signed");

           byte[] temp = mem_stream.ToArray();

           byte[] temp2 = stream_write.ToArray();

           long r = stream_write.Seek(0, SeekOrigin.Begin);

           byte[] temp21 = stream_write.GetBuffer();
          
//------------------------------------------------------------------------------------------------------

            // считываем подписанный xml  в поток
        
         //  StreamReader stream_read2 = new StreamReader("input.sign.xml", new UTF8Encoding());
          // Stream read2_base = stream_read2.BaseStream;

            // или через массив
           FileStream file1 = new FileStream("data.sign.xsl", FileMode.Open);
           byte[] arr2 = new byte[file1.Length];
           file1.Read(arr2, 0, (int)file1.Length);
           file1.Close();

           byte[] arr1 = stream_write.ToArray();

            MemoryStream mem_stream1 = new MemoryStream(arr1);
            

            
          
         

           //   метод перегруженный   
           // public bool VerifyXmlFile(Stream SignedStream)
           // public bool VerifyXmlFile(string SignedFileName)

           // bool result = xml_s.VerifyXmlFile(read2_base); - для потока

           bool result = xml_s.VerifyXmlFile(mem_stream1);
            if (result)
            {
                Console.WriteLine("Xml verifyed");
            }
            else
            {
                Console.WriteLine("Xml not verifyed");
            }
            // вывести DN - имя подписавшего xml 
            Console.WriteLine(xml_s.SignerName);
            Console.ReadKey();
        }
    }
}
