private uint GetCardId(string reader)
        {
            _native.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);
            var getUid   = new byte[] { 0xFF, (byte)Command.GetData, 0x00, 0x00, 0x00 };
            var response = new APDUResponse(_native.TransmitRaw(getUid, 0xFF));

            _native.Disconnect(DISCONNECT.Unpower);
            response.ThrowError();
            var id = BitConverter.ToUInt32(response.Data, 0);

            return(id);
        }
Example #2
0
 public void Disconnect(DISCONNECT disposition)
 {
     try
     {
         card.Disconnect(disposition);
     }
     catch (SmartCardException scEx)
     {
         SmartcardFault scFault = new SmartcardFault(scEx);
         throw new FaultException <SmartcardFault>(scFault);
     }
     catch (Exception ex)
     {
         GeneralFault genFault = new GeneralFault(ex);
         throw new FaultException <GeneralFault>(genFault);
     }
 }
Example #3
0
        /// <summary>
        /// This program tests the API with a SIM card.
        /// If your PIN is activated be carefull when presenting the PIN to your card!
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            try
            {
                APDUResponse apduResp;

                CardNative iCard = new CardNative();

                string[] readers = iCard.ListReaders();

                iCard.Connect(readers[0], SHARE.Shared, PROTOCOL.T0orT1);
                Console.WriteLine("Connects card on reader: " + readers[0]);

                // Verify the PIN (if necessary)
                byte[]    pin       = new byte[] { 0x31, 0x32, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF };
                APDUParam apduParam = new APDUParam();
                apduParam.Data = pin;
                apduVerifyCHV.Update(apduParam);
                //apduResp = iCard.Transmit(apduVerifyCHV);

                // Select the MF (3F00)
                apduParam.Data = new byte[] { 0x3F, 0x00 };
                apduSelectFile.Update(apduParam);
                apduResp = iCard.Transmit(apduSelectFile);
                if (apduResp.Status != SC_OK && apduResp.SW1 != SC_PENDING)
                {
                    throw new Exception("Select command failed: " + apduResp.ToString());
                }
                Console.WriteLine("MF selected");

                // Select the EFtelecom (7F10)
                apduParam.Data = new byte[] { 0x7F, 0x10 };
                apduSelectFile.Update(apduParam);
                apduResp = iCard.Transmit(apduSelectFile);
                if (apduResp.Status != SC_OK && apduResp.SW1 != SC_PENDING)
                {
                    throw new Exception("Select command failed: " + apduResp.ToString());
                }
                Console.WriteLine("DFtelecom selected");

                // Select the EFadn (6F3A)
                apduParam.Data = new byte[] { 0x6F, 0x3A };
                apduSelectFile.Update(apduParam);
                apduResp = iCard.Transmit(apduSelectFile);
                if (apduResp.Status != SC_OK && apduResp.SW1 != SC_PENDING)
                {
                    throw new Exception("Select command failed: " + apduResp.ToString());
                }
                Console.WriteLine("EFadn (Phone numbers) selected");

                // Read the response
                if (apduResp.SW1 == SC_PENDING)
                {
                    apduParam.Reset();
                    apduParam.Le   = apduResp.SW2;
                    apduParam.Data = null;
                    apduGetResponse.Update(apduParam);
                    apduResp = iCard.Transmit(apduGetResponse);
                    if (apduResp.Status != SC_OK)
                    {
                        throw new Exception("Select command failed: " + apduResp.ToString());
                    }
                }

                // Get the length of the record
                int recordLength = apduResp.Data[14];

                Console.WriteLine("Reading the Phone number 10 first entries");
                // Read the 10 first record of the file
                for (int nI = 0; nI < 10; nI++)
                {
                    apduParam.Reset();
                    apduParam.Le = (byte)recordLength;
                    apduParam.P1 = (byte)(nI + 1);
                    apduReadRecord.Update(apduParam);
                    apduResp = iCard.Transmit(apduReadRecord);

                    if (apduResp.Status != SC_OK)
                    {
                        throw new Exception("ReadRecord command failed: " + apduResp.ToString());
                    }

                    Console.WriteLine("Record #" + ((int)(nI + 1)).ToString());
                    Console.WriteLine(apduResp.ToString());
                }

                iCard.Disconnect(DISCONNECT.Unpower);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Example #4
0
        /// <summary>
        /// Reads personal records from the currently inserted ID-card into the <tt>records</tt> array.
        /// </summary>
        private static void readRecords()
        {
            CardNative   iCard     = new CardNative();
            APDUParam    apduParam = new APDUParam();
            APDUResponse apduResp;

            string[] readers = iCard.ListReaders();

            /* Change this index to the one where your card is inserted. This is usually 0,
             * unless you have multiple readers. */
            string reader = readers[0];

            iCard.Connect(reader, SHARE.Shared, PROTOCOL.T0);
            Console.Write("Reading personal data from " + reader + "...");

            try
            {
                /* Select the Master File */
                apduResp = iCard.Transmit(apduSelectMF);
                if (apduResp.Status != SC_OK)
                {
                    throw new Exception("Select MF failed: " + apduResp.ToString());
                }

                /* Select EEEE */
                apduResp = iCard.Transmit(apduSelectEEEE);
                if (apduResp.Status != SC_OK)
                {
                    throw new Exception("Select EEEE failed: " + apduResp.ToString());
                }

                /* Select 5044 */
                apduResp = iCard.Transmit(apduSelect5044);
                if (apduResp.Status != SC_OK)
                {
                    throw new Exception("Select 5044 failed: " + apduResp.ToString());
                }

                /* Read the records */
                for (byte i = 1; i <= NUM_RECORDS; i++)
                {
                    /* Send the read command */
                    apduParam.Reset();
                    apduParam.P1 = i;
                    apduReadRecord.Update(apduParam);
                    apduResp = iCard.Transmit(apduReadRecord);
                    if (apduResp.SW1 != SC_PENDING)
                    {
                        throw new Exception("Read record failed: " + apduResp.ToString());
                    }

                    /* Read the response */
                    apduParam.Reset();
                    apduParam.Le = apduResp.SW2;
                    apduGetResponse.Update(apduParam);
                    apduResp = iCard.Transmit(apduGetResponse);
                    if (apduResp.Status != SC_OK)
                    {
                        throw new Exception("Get response failed: " + apduResp.ToString());
                    }
                    records[i - 1] = Encoding.UTF7.GetString(apduResp.Data).Trim();
                }
            }
            finally
            {
                iCard.Disconnect(DISCONNECT.Leave);
            }
        }