Question

i am working in smart card development. i have created MF (Master file), DF (dedicated File), EF (Elementary file) in smart card. EF file is used to store the data. This EF may be transparent file or record oriented file. i have written the data to transparent file using 00D1000008 540100 5303 010203 this command.i am also try to write the record oriented file using 00DD000008 540100 5303 010203 this command. but i got the error (6700 error code) wrong length. i need the solution to write the smart card EF record oriented file. please guide me.

Screen shot:

enter image description here

My code:

i have used winscard.dll

     private void button_Transmit_Click(object sender, EventArgs e)
         {
        Status.Text = "";
        byte[] baData = null;
        string sClass = textBox_Class.Text;
        string sIns = textBox_CLA.Text;
        string sP1 = textBox_P1.Text;
        string sP2 = textBox_P2.Text;
        string sP3 = textBox_P3.Text;
        sP3 = sP3.ToUpper();
        int k1 = 70;
        string sData = textBox1.Text;
        byte bP1 = 0;
        byte bP2 = 0;
        byte bP3 = 0;
        byte bClass = byte.Parse(sClass, NumberStyles.AllowHexSpecifier);
        byte bIns = byte.Parse(sIns, NumberStyles.AllowHexSpecifier);
        if (sP1 != "" && sP1 != "@")
            bP1 = byte.Parse(sP1, NumberStyles.AllowHexSpecifier);
        if (sP2 != "" && sP2 != "@")
            bP2 = byte.Parse(sP2, NumberStyles.AllowHexSpecifier);

        int integer = int.Parse(sP3, NumberStyles.AllowHexSpecifier);
        byte bLe = (byte)k1;

        if (integer != 0 && sData.Length != 0)
        {
            baData = new byte[integer];

            for (int nJ = 0; nJ < sData.Length; nJ += 2)
                baData[nJ / 2] = byte.Parse(sData.Substring(nJ, 2), NumberStyles.AllowHexSpecifier);
            bLe = 0;

        }
        UInt32 m_nProtocol = (uint)PROTOCOL.Undefined;
        uint RecvLength = 0;
        byte[] ApduBuffer = null;
        IntPtr ApduResponse = IntPtr.Zero;
        SCard_IO_Request ioRequest = new SCard_IO_Request();
        ioRequest.m_dwProtocol = m_nProtocol;
        ioRequest.m_cbPciLength = 8;
        if (baData == null)
        {
            ApduBuffer = new byte[4 + ((bLe != 0) ? 1 : 0)];
            if (bLe != 0)
            {
                ApduBuffer[4] = (byte)bLe;
            }
        }
        else
        {

            if (textBox1.Text.Length > 8)
            {
                ApduBuffer = new byte[5 + baData.Length];
                Buffer.BlockCopy(baData, 0, ApduBuffer, 5, baData.Length);
                ApduBuffer[4] = (byte)(baData.Length);

            }
            //read binary
            else
            {
                ApduBuffer = new byte[5 + baData.Length + 1];
                Buffer.BlockCopy(baData, 0, ApduBuffer, 5, baData.Length);
                ApduBuffer[4] = (byte)(baData.Length);
                ApduBuffer[5 + baData.Length] = 255;
            }
        }
        ApduBuffer[0] = bClass;
        ApduBuffer[1] = bIns;
        ApduBuffer[2] = bP1;
        ApduBuffer[3] = bP2;

        m_nLastError = SCardTransmit(scard.m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, ref ioRequest, ApduResponse, ref RecvLength);

        textBox2.Text = "";
        byte[] caReadersData = new byte[RecvLength];
        if (m_nLastError == 0)
        {
            ApduResponse = Marshal.AllocHGlobal((int)RecvLength);

            if (m_nLastError == 0)
            {
                m_nLastError = SCardTransmit(scard.m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, ref ioRequest, ApduResponse, ref RecvLength);
                if (RecvLength > 2)
                {
                    for (int nI = 0; nI < RecvLength - 2; nI++)
                    {
                        caReadersData[nI] = Marshal.ReadByte(ApduResponse, nI);
                        //kl[nI] = Marshal.ReadByte(ApduResponse, nI);
                        //result = string.Format("{0:X02}", caReadersData[nI]);
                        //Status.Text += string.Format("{0:X02}", caReadersData[nI]) + " ";
                        textBox2.Text += string.Format("{0:X02}", caReadersData[nI]) + " ";
                        //result = Status.Text;
                    }

                }
                else
                {
                    for (int nI = 0; nI < RecvLength; nI++)
                    {
                        caReadersData[nI] = Marshal.ReadByte(ApduResponse, nI);
                        Status.Text += string.Format("{0:X02}", caReadersData[nI]) + " ";

                    }
                }
            }
        }

        Marshal.FreeHGlobal(ApduResponse);
}      

Edit:

READ COMMAND is working fine. see the screen shot

enter image description here

Was it helpful?

Solution

It seems that you use an undefined coding of P2 with the odd instruction UPDATE RECORD command. Also, you have to specify the record number in P1. For the three least significant bits use

  • 100-Replace
  • 101-Logical AND
  • 110-Logical OR
  • 111-Logical XOR

If you aim for writing / updating complete records of small length, you might consider using the commands with even instruction. Then you can drop the offset DO (0x54) and only transmit the complete record (value of the discretionary data DO (0x53)).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top