using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace SmartX1Demo
{
  public  class SmartX1_X86
    {

      //注意不要添加.dll后缀
        // Find
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Find(string appID, int[] keyHandles, int[] keyNumber);

        //open
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Open(int keyHandle, int uPin1, int uPin2, int uPin3, int uPin4);
        //close

        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Close(int keyHandle);

        //checkExist

        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1CheckExist(int keyHandle);

        //getUid
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1GetUid(int keyHandle, StringBuilder uid);

        //ReadStorage
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadStorage(int keyHandle, int startAddr, int length, byte[] pBuffer);

        //WriteStorage
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WriteStorage(int keyHandle, int startAddr, int length, byte[] pBuffer);

        //PageLogin
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageLogin(int keyHandle, int pageNo, byte[] password, int length);

        //PageLogout
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageLogout(int keyHandle, int pageNo);

        //ReadPage
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadPage(int keyHandle, int pageNo, int startAddr, ref int length, byte[] pBuffer);

        //WritePage
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WritePage(int keyHandle, int pageNo, int startAddr, int length, byte[] pBuffer);

        //ReadMem
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadMem(int keyHandle, int start, int length, byte[] pBuffer);

        //WriteMem
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WriteMem(int keyHandle, int start, int length, byte[] pBuffer);

        //encrypt
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1TriDesEncrypt(int keyHandle, int buffSize, byte[] pBuffer);

        //desDecrypt
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1TriDesDecrypt(int keyHandle, int buffSize, byte[] pBuffer);

        //led
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Led(int keyHandle, int state);

     
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageGetProperty(int keyHandle, int pageNo, int propId, int[] propValue);
     
        [DllImport("SmartX1App", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1GetSoftVersion(int keyHandle, int[] version);
       
        public static string TridesEncrypt(string data, string key, Encoding encoding)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = Encoding.Default.GetBytes(key);
            des.Mode = CipherMode.ECB;

            des.Padding = PaddingMode.PKCS7;

            ICryptoTransform DesEncrypt = des.CreateEncryptor();
            byte[] dataBytes = encoding.GetBytes(data);
            byte[] outPut = DesEncrypt.TransformFinalBlock(dataBytes, 0, dataBytes.Length);
            return Convert.ToBase64String(outPut);

        }

        public static string TridesDecEncrypt(byte[] data, string key, Encoding encoding)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = Encoding.Default.GetBytes(key);
            des.Padding = PaddingMode.PKCS7;
            des.Mode = CipherMode.ECB;
            ICryptoTransform DesDecEncrypt = des.CreateDecryptor();    
            byte[] outValue = DesDecEncrypt.TransformFinalBlock(data, 0, data.Length);
            return encoding.GetString(outValue);
        }
    }


    class SmartX1_X64
    {
        // Find
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Find(string appID, int[] keyHandles, int[] keyNumber);

        //open
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Open(int keyHandle, int uPin1, int uPin2, int uPin3, int uPin4);
        //close

        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Close(int keyHandle);

        //checkExist

        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1CheckExist(int keyHandle);

        //getUid
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1GetUid(int keyHandle, StringBuilder uid);

        //ReadStorage
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadStorage(int keyHandle, int startAddr, int length, byte[] pBuffer);

        //WriteStorage
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WriteStorage(int keyHandle, int startAddr, int length, byte[] pBuffer);

        //PageLogin
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageLogin(int keyHandle, int pageNo, byte[] password, int length);

        //PageLogout
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageLogout(int keyHandle, int pageNo);

        //ReadPage
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadPage(int keyHandle, int pageNo, int startAddr, ref int length, byte[] pBuffer);

        //WritePage
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WritePage(int keyHandle, int pageNo, int startAddr, int length, byte[] pBuffer);

        //ReadMem
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1ReadMem(int keyHandle, int start, int length, byte[] pBuffer);

        //WriteMem
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1WriteMem(int keyHandle, int start, int length, byte[] pBuffer);

        //encrypt
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1TriDesEncrypt(int keyHandle, int buffSize, byte[] pBuffer);

        //desDecrypt
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1TriDesDecrypt(int keyHandle, int buffSize, byte[] pBuffer);

        //led
        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1Led(int keyHandle, int state);


        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1PageGetProperty(int keyHandle, int pageNo, int propId, int[] propValue);

        [DllImport("SmartX1AppX64", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int SmartX1GetSoftVersion(int keyHandle, int[] version);

        public static  string TridesEncrypt(string data, string key, Encoding encoding)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = Encoding.Default.GetBytes(key);
            des.Mode = CipherMode.ECB;

            des.Padding = PaddingMode.PKCS7;

            ICryptoTransform DesEncrypt = des.CreateEncryptor();
            byte[] dataBytes = encoding.GetBytes(data);
            byte[] outPut = DesEncrypt.TransformFinalBlock(dataBytes, 0, dataBytes.Length);
            return Convert.ToBase64String(outPut);

        }

        public static  string TridesDecEncrypt(byte[] data, string key, Encoding encoding)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = Encoding.Default.GetBytes(key);
            des.Padding = PaddingMode.PKCS7;
            des.Mode = CipherMode.ECB;
            ICryptoTransform DesDecEncrypt = des.CreateDecryptor();
            byte[] outValue = DesDecEncrypt.TransformFinalBlock(data, 0, data.Length);
            return encoding.GetString(outValue);
        }
    }
}