/// <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); } }
/// <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; } }