コード例 #1
0
        public byte[] CardSendCommand(byte[] cmd)
        {
            if (ShowLog != null)
            {
                ShowLog("------------------------------\r\n");
                ApduCommand msg = new ApduCommand(cmd);

                if (msg.CmdNote.Trim().StartsWith("建立文件"))
                {
                    CPUFileType cpy = (CPUFileType)(msg.Data[0]);
                    msg.CmdNote += "类型" + cpy.ToString() + "    ";
                }
                string log = $"发送原始命令:{BitConverter.ToString(cmd)} \r\n" + msg.ToString() + "\r\n";



                ShowLog(log);
            }

            byte[] result = this.carder.SendCommand(cmd);

            if (ShowLog != null)
            {
                ApduMsg apduMsg = ApduMsgHelper.GetApduMsg(result);

                string msg = "状态:{0}  信息:{1} 结果:{2} \r\n";

                msg = string.Format(msg, apduMsg.Status, apduMsg.Msg, BitConverter.ToString(apduMsg.ResponseData));

                string log = "接收: " + msg;
                ShowLog(log);
            }
            return(result);
        }
コード例 #2
0
        public ApduMsg CreateDFFile(ushort fileID, int fileLenght, string FileAccess = "F0F0")
        {
            //        执行指令: 80E0 3F01 0D 38 0520 F0F0 95 FFFF 4444463031
            //说明: 80E0 :指令类别和指令码; 3F01 :文件标识; 0D:长度; 38 :文件类型
            //0520 :文件的空间大小; F0: 读权限; F0: 写权限;
            //            4444463031 :文件名 DDF01 也就是ASCII码了
            //80-E0-00-01-09-38-00-64-F0-F0-95-FF-FF-31
            //80,E0,3F,01,0D,38,05,20,F0,F0,95,FF,FF,44,44,46,30,31,
            //EF01 文件标识
            //07 LC data 长度(07)
            //28 文件类型(二进制)
            //002A 文件长度
            //F00E 读写权限
            //FF 保留
            //80 不支持线路保护

            ApduCommand cmd = new ApduCommand();

            cmd.CLA = 0x80;
            cmd.INS = 0xE0;
            cmd.SetP1P2(fileID);

            //构造一个data  ,长度,权限,
            List <byte> data = new List <byte>();

            //文件类型
            data.Add((byte)CPUFileType.MFDF);
            //文件长度
            data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileLenght));
            //data.Add(0x05);
            //data.Add(0x20);
            //添加读写权限
            //data.AddRange(CPUCardHelper.ConverToBytes(FileAccess));
            data.Add(0xF0);
            data.Add(0xF0);
            //应用文件ID
            data.Add(0x95);
            //保留字
            data.Add(0xFF);
            data.Add(0xFF);

            //使用文件ID当文件夹名称
            //data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileID));
            data.AddRange(GetDFNameByID(fileID));

            //不支持线路保护
            //data.Add(0x80);

            cmd.Data = data.ToArray();

            ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd));

            if (msg.Code == "6A-86")
            {
                msg.Msg += "(文件已存在)";
            }

            return(msg);
        }
コード例 #3
0
        /// <summary>
        /// 创建文件
        /// </summary>
        /// <param name="fileIDHex">文件标识符2字节</param>
        /// <param name="fileType">枚举文件类型</param>
        /// <param name="fileLenght">文件长度</param>
        /// <param name="fileNameHex">文件名称,十六进制</param>
        /// <param name="FileAccess"></param>
        /// <returns></returns>
        public ApduMsg CreateFile(ushort fileID, CPUFileType fileType, int fileLenght, string FileAccess = "0000")
        {
            //Demo
            //80E0-EF01-07-28-002A-F00E-FF-80
            //EF01 文件标识
            //07 LC data 长度(07)
            //28 文件类型(二进制)
            //002A 文件长度
            //F00E 读写权限
            //FF 保留
            //80 不支持线路保护

            ApduCommand cmd = new ApduCommand();

            cmd.CLA = 0x80;
            cmd.INS = 0xE0;
            cmd.SetP1P2(fileID);

            //构造一个data  ,长度,权限,
            List <byte> data = new List <byte>();

            //文件类型
            data.Add((byte)fileType);
            //文件长度
            data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileLenght));
            //添加读写权限
            data.AddRange(CPUCardHelper.ConverToBytes(FileAccess));
            //添加文件名
            data.AddRange(CPUCardHelper.ConverToBytes("FFFF"));

            //不支持线路保护
            data.Add(0x80);

            cmd.Data = data.ToArray();

            ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd));

            if (msg.Code == "6A-86")
            {
                msg.Msg += "(文件已存在)";
            }

            return(msg);
        }
コード例 #4
0
        /// <summary>
        /// 读余额
        /// </summary>
        public ApduMsg GetBalance(bool IsWallet)
        {
            ApduCommand cmd = new ApduCommand();

            cmd.CLA = 0x80;
            cmd.INS = 0x5C;
            //根据文档,01用于电子存折,02用于电子钱包
            if (!IsWallet)
            {
                cmd.P2 = 0x01;
            }
            else
            {
                cmd.P2 = 0x02;
            }

            cmd.LE = 0x4;

            return(ApduMsg.GetApduByData(SendStrCommand(cmd)));
        }
コード例 #5
0
        /// <summary>
        /// 根据偏移量,写入数据到当前文件
        /// </summary>
        /// <param name="index"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        private ApduMsg WriteContent(ushort index, byte[] data)
        {
            //string fileLenghtHexStr = Convert.ToString(fileLenght, 16).PadLeft(4, '0');

            //00D6-0000-02-0102
            //0000 文件偏移量
            //02 LC,data 长度
            //0102数据
            //FMCOS写文件说明,若P1点高三位为100,则低五位为短的二进制文件标识符。P2为欲写入的文件偏移量
            //若P1点最高位不为1,则P1,P2为欲写入的文件偏移量,所写文件为当前文件

            ApduCommand cmd = new ApduCommand();

            cmd.CLA = 0x00;
            cmd.INS = 0xD6;
            cmd.SetP1P2(index);
            cmd.Data = data;



            //List<byte> array = new List<byte>();
            //array.Add(0x00);
            //array.Add(0xD6);

            ////添加P1 P2参数为文件偏移量

            //array.Add((byte)(index / 256));
            //array.Add((byte)(index % 256));

            ////添加LC,为数据长度
            //array.Add((byte)data.Length);
            ////添加数据
            //array.AddRange(data);
            //ApduMsg msg = ApduMsg.GetApduByData(carder.SendCommand(array.ToArray()));

            ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd));

            return(msg);
        }
コード例 #6
0
 /// <summary>
 /// 发送adpu 命令对象
 /// </summary>
 /// <param name="apdu"></param>
 /// <returns></returns>
 public byte[] SendStrCommand(ApduCommand apdu)
 {
     return(CardSendCommand(apdu.ToArray()));
 }