Beispiel #1
0
        /// <summary>
        /// Main parser method that extract information about the ATR byte array
        /// </summary>
        /// <returns>
        /// returns AtrInfo object if ATR is valid, null otherwise
        /// </returns>
        public static AtrInfo Parse(byte[] atrBytes)
        {
            AtrInfo atrInfo = new AtrInfo();
            byte    initialChar = 0, formatByte = 0;
            int     supportedProtocols = 0;

            using (DataReader reader = DataReader.FromBuffer(atrBytes.AsBuffer()))
            {
                initialChar = reader.ReadByte();

                if (initialChar != (byte)AtrHeader.InitialHeader)
                {
                    return(null);
                }

                formatByte = reader.ReadByte();
                var interfacePresence = (byte)(formatByte.HiNibble() << 4);

                for (int i = 0; i < AtrInfo.MAXIMUM_ATR_CODES; i++)
                {
                    if ((interfacePresence & 0x10) != 0)
                    {
                        atrInfo.ProtocolInterfaceA[i] = reader.ReadByte();
                    }

                    if ((interfacePresence & 0x20) != 0)
                    {
                        atrInfo.ProtocolInterfaceB[i] = reader.ReadByte();
                    }

                    if ((interfacePresence & 0x40) != 0)
                    {
                        atrInfo.ProtocolInterfaceC[i] = reader.ReadByte();
                    }

                    if ((interfacePresence & 0x80) != 0)
                    {
                        atrInfo.ProtocolInterfaceD[i] = reader.ReadByte();
                    }
                    else
                    {
                        break;
                    }

                    interfacePresence   = atrInfo.ProtocolInterfaceD[i];
                    supportedProtocols |= (1 << interfacePresence.LowNibble());
                }

                atrInfo.HistoricalBytes = reader.ReadBuffer(formatByte.LowNibble());

                if ((supportedProtocols & ~1) != 0)
                {
                    atrInfo.TckValid = ValidateTCK(atrBytes);
                }

                return(atrInfo);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Main parser method that extract information about the ATR byte array
        /// </summary>
        /// <returns>
        /// returns AtrInfo object if ATR is valid, null otherwise
        /// </returns>
        public static AtrInfo Parse(byte[] atrBytes)
        {
            AtrInfo atrInfo = new AtrInfo();
            byte initialChar = 0, formatByte = 0;
            int supportedProtocols = 0;

            using (DataReader reader = DataReader.FromBuffer(atrBytes.AsBuffer()))
            {
                initialChar = reader.ReadByte();

                if (initialChar != (byte)AtrHeader.InitialHeader)
                {
                    return null;
                }

                formatByte = reader.ReadByte();
                var interfacePresence = (byte)(formatByte.HiNibble() << 4);

                for (int i = 0; i < AtrInfo.MAXIMUM_ATR_CODES; i++)
                {
                    if ((interfacePresence & 0x10) != 0)
                        atrInfo.ProtocolInterfaceA[i] = reader.ReadByte();

                    if ((interfacePresence & 0x20) != 0)
                        atrInfo.ProtocolInterfaceB[i] = reader.ReadByte();

                    if ((interfacePresence & 0x40) != 0)
                        atrInfo.ProtocolInterfaceC[i] = reader.ReadByte();

                    if ((interfacePresence & 0x80) != 0)
                        atrInfo.ProtocolInterfaceD[i] = reader.ReadByte();
                    else
                        break;

                    interfacePresence = atrInfo.ProtocolInterfaceD[i];
                    supportedProtocols |= (1 << interfacePresence.LowNibble());
                }

                atrInfo.HistoricalBytes = reader.ReadBuffer(formatByte.LowNibble());

                if ((supportedProtocols & ~1) != 0)
                {
                    atrInfo.TckValid = ValidateTCK(atrBytes);
                }

                return atrInfo;
            }
        }