async private void GetDevices()
        {
            try
            {
                DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(SmartCardReader.GetDeviceSelector(SmartCardReaderKind.Nfc));

                // There is a bug on some devices that were updated to WP8.1 where an NFC SmartCardReader is
                // enumerated despite that the device does not support it. As a workaround, we can do an additonal check
                // to ensure the device truly does support it.
                var workaroundDetect = await DeviceInformation.FindAllAsync("System.Devices.InterfaceClassGuid:=\"{50DD5230-BA8A-11D1-BF5D-0000F805F530}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True");

                if (workaroundDetect.Count == 0 || devices.Count == 0)
                {
                    PopupMessage("No Reader Found!");
                }

                CardReader = await SmartCardReader.FromIdAsync(devices.First().Id);

                MifareCard = new MifareCard(new MifareClassic());

                CardReader.CardAdded   += CardAdded;
                CardReader.CardRemoved += CardRemoved;
            }
            catch (Exception e)
            {
                PopupMessage("Exception: " + e.Message);
            }
        }
        private byte[] ReadBlockRange(byte msb, byte blockFrom, byte blockTo)
        {
            isoReaderInit();
            card = new MifareCard(isoReader);

            byte i;
            var  nBlock = 0;
            var  count  = 0;

            for (i = blockFrom; i <= blockTo; i++)
            {
                if ((i + 1) % 4 == 0)
                {
                    continue;
                }

                nBlock++;
            }

            var dataOut = new byte[nBlock * 16];

            for (i = blockFrom; i <= blockTo; i++)
            {
                if ((i + 1) % 4 == 0)
                {
                    continue;
                }

                Array.Copy(ReadBlock(msb, i), 0, dataOut, count * 16, 16);
                count++;
            }

            return(dataOut);
        }
        private bool WriteBlockRange(byte msb, byte blockFrom, byte blockTo, byte[] data)
        {
            isoReaderInit();
            card = new MifareCard(isoReader);

            byte i;
            var  count     = 0;
            var  blockData = new byte[16];

            for (i = blockFrom; i <= blockTo; i++)
            {
                if ((i + 1) % 4 == 0)
                {
                    continue;
                }

                Array.Copy(data, count * 16, blockData, 0, 16);

                if (WriteBlock(msb, i, blockData))
                {
                    count++;
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
        public string ReadCardSerialNumber()
        {
            var card = new MifareCard(MifareCardTypes.Mifare4k);

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        if (reader.RequestCardSerial(card))
                        {
                            SetCardSerialNumber(card.GetCardSerial());
                            reader.Disconnect();
                            return(GetCardSerialNumber());
                        }

                        throw new Exception("Card not found");
                    }

                    throw new Exception("Device not found");
                }

                throw new Exception("Device not found");
            }
            catch (Exception)
            {
                reader.Disconnect();
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
예제 #5
0
        public bool ReadAllData_MifareClassic_ZXPSeries9(ref string data)
        {
            try
            {
                Debug.WriteLine("starting ReadAllData_MifareClassic_ZXPSeries9...");

                // get list blocks will be read/write
                List <MifareCard_Block> lstBlocks = GetAll_Blocks_MifareClassic(EnumSmartCardTypes.MifareClassic4K);

                if (lstBlocks == null || lstBlocks.Count() == 0)
                {
                    throw new Exception("Can not get card blocks");
                }

                // MSB
                byte MSB = 0x60;

                // Create card
                MifareCard card = CreateMifareCardInstance(MSB);

                if (card == null)
                {
                    throw new Exception("Can not create card instance with keys: " + BitConverter.ToString(_authenticationKeys));
                }

                // loop all blocks read/write to read binary data
                StringBuilder sbData = new StringBuilder();
                foreach (var block in lstBlocks)
                {
                    // authentication
                    // typeB
                    bool authSuccessful = card.Authenticate(MSB, block.Block_Index_Hex, KeyType.KeyA, 0x00);
                    if (!authSuccessful)
                    {
                        throw new Exception("AUTHENTICATE failed at block " + block.Block_Index_Dec + " with key " + BitConverter.ToString(_authenticationKeys));
                        //Debug.WriteLine("AUTHENTICATE failed at block " + block.Block_Index_Sector_Dec + " with key " + BitConverter.ToString(authenticationKeys));
                        //continue;
                    }

                    // get data
                    byte[] result = card.ReadBinary(MSB, block.Block_Index_Hex, 16);

                    // display data writen
                    string datastring = (result != null) ? Encoding.UTF8.GetString(result) : string.Empty;
                    string dateBit    = (result != null) ? BitConverter.ToString(result) : string.Empty;
                    sbData.AppendLine($"Block {block.Block_Index_Hex}: " + dateBit);
                }

                // return value
                data = sbData.ToString();
                return(true);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("ReadAllData_MifareClassic exception: " + ex.ToString());
                return(false);
            }
        }
        public StatusCode WriteBlock(int sector, int block, string data, string key, byte authentication_mode)
        {
            var  MifareCard  = new MifareCard(MifareCardTypes.Mifare4k);
            bool WriteStatus = true;

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        if (authentication_mode == AuthenticationMode.KeyA)
                        {
                            MifareCard.SetKeyA(key, sector);
                            MifareCard.SetAuthenticationMode(0);
                        }
                        else
                        {
                            MifareCard.SetKeyB(key, sector);
                            MifareCard.SetAuthenticationMode(1);
                        }

                        reader.RequestCardSerial(MifareCard);
                        string SecuredData = AddSecurityBytes(MifareCard.GetCardSerial(), data);

                        WriteStatus = reader.WriteBlock(MifareCard, AddTrailingBits(ConvertStringToHex(SecuredData)), sector, block);

                        if (!WriteStatus)
                        {
                            reader.Disconnect();
                            return(StatusCode.ErrIncorrectKey);
                        }
                        reader.Disconnect();
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }
                return(StatusCode.Success);
            }
            catch (Exception)
            {
                reader.Disconnect();
                throw;
            }
        }
        public StatusCode EraseBlock(string data, int sector, int block, string key, byte authentication_mode)
        {
            var  card        = new MifareCard(MifareCardTypes.Mifare4k);
            bool WriteStatus = true;

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        if (authentication_mode == AuthenticationMode.KeyA)
                        {
                            card.SetKeyA(key, sector);
                            card.SetAuthenticationMode(0);
                        }
                        else
                        {
                            card.SetKeyB(key, sector);
                            card.SetAuthenticationMode(1);
                        }

                        WriteStatus = reader.WriteBlock(card, data, sector, block);
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }

                if (WriteStatus)
                {
                    return(StatusCode.Success);
                }

                return(StatusCode.ErrIncorrectKey);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
예제 #8
0
        private void BtnInitialize_Click(object sender, EventArgs e)
        {
            byte[]    key     = HexString.FromHexString(this.AuthenKey.Text.Trim(), "-");
            M1KeyMode keyMode = (M1KeyMode)Enum.Parse(typeof(M1KeyMode), AuthenKeyType.Items[AuthenKeyType.SelectedIndex] as String, true);
            ICard     card    = new MifareCard(
                ContextManager.GetLogger(),
                //ConfigManager.GetKeyService(),
                null,
                ContextManager.GetCardReader(),
                keyMode,
                key);

            card.Initialize(ContextManager.GetCardTemplete().SegmentAddr);
        }
예제 #9
0
        public Pedestrian(Login home)
        {
            InitializeComponent();

            this.home       = home;
            this.restApi    = new RESTAPI();
            this.database   = new DBConnect();
            this.bni        = new BNI();
            this.mifareCard = new MifareCard(this);
            this.mifareCard.RunMain();

            InitData();
            InitializePedestrianType();
        }
예제 #10
0
 public void Initialize()
 {
     InitializeVehicleType();
     CameraHelper.StartIpCamera(liveCamera);
     this.webcamImage = webcam;
     if (Properties.Settings.Default.WebcamEnabled)
     {
         this.camera = new Webcam(this);
     }
     nonCash.Checked = true;
     this.restApi    = new RESTAPI();
     this.database   = new DBConnect();
     this.bni        = new BNI();
     this.mifareCard = new MifareCard(this);
     this.mifareCard.RunMain();
 }
예제 #11
0
        private void Initialize()
        {
            this.webcamImage       = webcam;
            this.camera            = new Webcam(this);
            this.restApi           = new RESTAPI();
            this.parkingIn         = new ParkingIn();
            autoComplete           = new AutoCompleteStringCollection();
            this.ip_address_server = Properties.Settings.Default.IPAddressServer;

            StartLiveCamera();

            this.MifareCard = new MifareCard(this);
            this.MifareCard.RunMain();

            InitDataVehicleType();
        }
        public StatusCode WriteKeys(string[] keyA, string[] keyB)
        {
            var  card        = new MifareCard(MifareCardTypes.Mifare4k);
            bool WriteStatus = true;

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        for (int i = 1; i < keyA.Length; i++)
                        {
                            if (i != 15 && !reader.WriteKeys(card, keyA[i], keyB[i], i, AccessBits.KeyARead_KeyBWrite)) // Skip Cardax Sector
                            {
                                throw new Exception("Failed to write keys to sector " + i + ". Hint: Card may not be empty.");
                            }
                        }
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }

                if (WriteStatus)
                {
                    return(StatusCode.Success);
                }
                else
                {
                    return(StatusCode.ErrIncorrectKey);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
        private byte[] ReadBlock(byte msb, byte lsb)
        {
            isoReaderInit();
            card = new MifareCard(isoReader);

            var readBinary = new byte[16];

            if (card.LoadKey(KeyStructure.VolatileMemory, 0x00, key))
            {
                if (card.Authenticate(msb, lsb, KeyType.KeyA, 0x00))
                {
                    readBinary = card.ReadBinary(msb, lsb, 16);
                }
            }

            return(readBinary);
        }
예제 #14
0
        private void Initialize()
        {
            InitializeVehicleType();
            InitializeOutload();
            CameraHelper.StartIpCamera(liveCamera);
            nonCash.Checked = true;

            this.bni         = new BNI();
            this.webcamImage = webcam;
            if (Properties.Settings.Default.WebcamEnabled)
            {
                this.camera = new Webcam(this);
            }

            this.mifareCard = new MifareCard(this);
            this.mifareCard.RunMain();
        }
예제 #15
0
        static void TestMiFareAccess(Pn532 pn532)
        {
            Span <byte> blockScetor = stackalloc byte[16] {
                0x00,
                0x00,
                0x00,
                0x00,
                0x00,
                0x00,
                0xFF,
                0x07,
                0x80,
                0x40,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0xFF
            };
            var mifare = new MifareCard(pn532, 1);
            var access = mifare.SectorTailerAccess(7, blockScetor.ToArray());
            var block0 = mifare.BlockAccess(4, blockScetor.ToArray());
            var block1 = mifare.BlockAccess(5, blockScetor.ToArray());
            var block2 = mifare.BlockAccess(6, blockScetor.ToArray());

            Console.WriteLine($"Access: {access}");
            Console.WriteLine($"Block0: {block0}");
            Console.WriteLine($"Block1: {block1}");
            Console.WriteLine($"Block2: {block2}");
            //Encode the access
            var  encodedAccess = mifare.EncodeSectorTailer(access);
            var  encodedBlock0 = mifare.EncodeSectorTailer(4, block0);
            var  encodedBlock1 = mifare.EncodeSectorTailer(5, block1);
            var  encodedBlock2 = mifare.EncodeSectorTailer(6, block2);
            byte encoded6      = (byte)(encodedAccess.Item1 | encodedBlock0.Item1 | encodedBlock1.Item1 | encodedBlock2.Item1);
            byte encoded7      = (byte)(encodedAccess.Item2 | encodedBlock0.Item2 | encodedBlock1.Item2 | encodedBlock2.Item2);
            byte encoded8      = (byte)(encodedAccess.Item3 | encodedBlock0.Item3 | encodedBlock1.Item3 | encodedBlock2.Item3);
            // Full function
            var encodedFull = mifare.EncodeSectorAndClockTailer(access, new AccessType[] { block0, block1, block2 });

            Console.WriteLine($"Original: {blockScetor[6].ToString("X2")} vs encoded: {encoded6.ToString("X2")} vs full: {encodedFull.Item1.ToString("X2")}");
            Console.WriteLine($"Original: {blockScetor[7].ToString("X2")} vs encoded: {encoded7.ToString("X2")} vs full: {encodedFull.Item2.ToString("X2")}");
            Console.WriteLine($"Original: {blockScetor[8].ToString("X2")} vs encoded: {encoded8.ToString("X2")} vs full: {encodedFull.Item3.ToString("X2")}");
        }
        public StatusCode ResetDefaultKeys(string[] keyB)
        {
            var card = new MifareCard(MifareCardTypes.Mifare4k);

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        for (int i = 1; i < keyB.Length; i++)
                        {
                            if (i != 15) // Skip Cardax Sector
                            {
                                card.SetKeyB(keyB[i], i);
                                card.SetAuthenticationMode(1);
                                if (!reader.WriteKeys(card, MifareDefaultKey, MifareDefaultKey, i, AccessBits.Default))
                                {
                                    throw new Exception("Failed to reset keys to sector " + i + ". Hint: Card may not be SHC card.");
                                }
                            }
                        }
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }

                return(StatusCode.Success);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
예제 #17
0
        private void Initialize()
        {
            this.webcamImage = webcam;
            if (Properties.Settings.Default.WebcamEnabled)
            {
                this.camera = new Webcam(this);
            }
            this.restApi      = new RESTAPI();
            this.database     = new DBConnect();
            this.parkingIn    = new ParkingIn();
            autoComplete      = new AutoCompleteStringCollection();
            nonCash.Checked   = true;
            ip_address_server = Properties.Settings.Default.IPAddressServer;

            StartLiveCamera();

            this.bni = new BNI();

            this.mifareCard = new MifareCard(this);
            this.mifareCard.RunMain();

            // initialize vehicle type options
            try
            {
                comboBox1.Items.Add("- Pilih Tipe Kendaraan -");
                string masterDataFile = TKHelper.GetApplicationExecutableDirectoryName() + Constant.PATH_FILE_MASTER_DATA_PARKING_OUT;
                using (StreamReader reader = new StreamReader(masterDataFile))
                {
                    string  json         = reader.ReadToEnd();
                    dynamic vehicleTypes = JsonConvert.DeserializeObject(json);
                    foreach (var types in vehicleTypes["VehicleTypes"])
                    {
                        comboBox1.Items.Add(types);
                    }
                    comboBox1.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                notifyIcon.ShowBalloonTip(Constant.NOTIFICATION_TRAY_TIMEOUT, "Error", Constant.ERROR_MESSAGE_FAIL_TO_FETCH_VEHICLE_TYPE_DATA, ToolTipIcon.Error);
            }
        }
        private void isoReaderInit()
        {
            try
            {
                var ctx = contextFactory.Establish(SCardScope.System);
                isoReader = new IsoReader(
                    ctx,
                    nfcReader,
                    SCardShareMode.Shared,
                    SCardProtocol.Any,
                    false);

                card = new MifareCard(isoReader);
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message, "Info", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
        private bool WriteBlock(byte msb, byte lsb, byte[] data)
        {
            isoReaderInit();
            card = new MifareCard(isoReader);

            if (card.LoadKey(KeyStructure.VolatileMemory, 0x00, key))
            {
                if (card.Authenticate(msb, lsb, KeyType.KeyA, 0x00))
                {
                    if (card.UpdateBinary(msb, lsb, data))
                    {
                        return(true);
                    }
                }

                return(false);
            }

            return(false);
        }
        public StatusCode ResetDefaultKeys_Sector(string KeyB, int sector)
        {
            var  card        = new MifareCard(MifareCardTypes.Mifare4k);
            bool WriteStatus = true;

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        card.SetKeyB(KeyB, sector);
                        card.SetAuthenticationMode(1);
                        WriteStatus = reader.WriteKeys(card, MifareDefaultKey, MifareDefaultKey, sector, AccessBits.Default);
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }

                if (WriteStatus)
                {
                    return(StatusCode.Success);
                }

                return(StatusCode.ErrIncorrectKey);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
        public void ClearAllBlock()
        {
            var res = MessageBox.Show("Apakah anda yakin ingin menghapus data kartu? ", "Warning",
                                      MessageBoxButton.YesNo);

            if (res == MessageBoxResult.Yes)
            {
                isoReaderInit();
                card = new MifareCard(isoReader);

                var data = new byte[16];
                if (card.LoadKey(KeyStructure.VolatileMemory, 0x00, key))
                {
                    for (byte i = 1; i <= 63; i++)
                    {
                        if ((i + 1) % 4 == 0)
                        {
                        }
                        else
                        {
                            if (card.Authenticate(Msb, i, KeyType.KeyA, 0x00))
                            {
                                Array.Clear(data, 0, 16);
                                if (WriteBlock(Msb, i, data))
                                {
                                }
                                else
                                {
                                    MessageBox.Show("Data gagal dihapus");
                                    break;
                                }
                            }
                        }
                    }

                    MessageBox.Show("Data berhasil dihapus", "Informasi", MessageBoxButton.OK,
                                    MessageBoxImage.Information);
                }
            }
        }
        public MainWindow()
        {
            InitializeComponent();

            var contextFactory = ContextFactory.Instance;
            var context        = contextFactory.Establish(SCardScope.System);
            var readerNames    = context.GetReaders();

            if (NoReaderAvailable(readerNames))
            {
                MessageBox.Show("Tidak ada reader terdeteksi, periksa kembali koneksi reader anda...", "Error",
                                MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(0);
            }
            else
            {
                var reader = readerNames[0];
                if (reader == null)
                {
                    MessageBox.Show("Tidak ada reader terdeteksi, periksa kembali koneksi reader anda...", "Error",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                }

                try
                {
                    isoReader = new IsoReader(
                        context: context,
                        readerName: reader,
                        mode: SCardShareMode.Shared,
                        protocol: SCardProtocol.Any,
                        releaseContextOnDispose: false);
                    _card = new MifareCard(isoReader);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        public StatusCode WriteKeys_Sector(string KeyA, string KeyB, int sector)
        {
            var  card        = new MifareCard(MifareCardTypes.Mifare4k);
            bool WriteStatus = true;

            try
            {
                if (reader != null)
                {
                    if (reader.Connect())
                    {
                        WriteStatus = reader.WriteKeys(card, KeyA, KeyB, sector, AccessBits.KeyARead_KeyBWrite);
                    }
                    else
                    {
                        return(StatusCode.ErrDeviceNotFound);
                    }
                }
                else
                {
                    return(StatusCode.ErrDeviceNotFound);
                }

                if (WriteStatus)
                {
                    return(StatusCode.Success);
                }

                return(StatusCode.ErrIncorrectKey);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                reader.Disconnect();
            }
        }
예제 #24
0
        private MifareCard CreateMifareCardInstance(byte MSB, string readerName = null)
        {
            try
            {
                if (string.IsNullOrEmpty(readerName))
                {
                    readerName = _readerName;
                }

                // create card context
                var contextFactory = ContextFactory.Instance;
                var context        = contextFactory.Establish(SCardScope.System);

                // create IsoReader
                var isoReader = new IsoReader(context, readerName, SCardShareMode.Shared, SCardProtocol.Any, false);

                // create mifare card and load authentication keys
                MifareCard card = new MifareCard(isoReader);
                bool       loadKeySuccessful = card.LoadKey(
                    KeyStructure.VolatileMemory,
                    MSB,
                    _authenticationKeys // key
                    );

                // load authentication keys
                if (!loadKeySuccessful)
                {
                    throw new Exception("LOAD KEY failed: " + BitConverter.ToString(_authenticationKeys));
                }

                return(card);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("CreateMifareCardInstance_Printer" + ex.ToString());
                return(null);
            }
        }
예제 #25
0
        static void ChangePermissions(Pn532 pn532, MifareCard mifareCard)
        {
            // keep permsissions of sector 0-3 and change the one from sector 4-63
            // Change the key B to default FF FF FF FF FF FF
            var newKey = new byte[6] {
                0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
            };

            for (byte i = 7; i < 64; i += 4)
            {
                mifareCard.BlockNumber = i;
                mifareCard.Command     = MifareCardCommand.AuthenticationA;
                var ret = mifareCard.RunMifiCardCommand();
                if (ret >= 0)
                {
                    mifareCard.BlockNumber = i;
                    mifareCard.Command     = MifareCardCommand.Read16Bytes;
                    ret = mifareCard.RunMifiCardCommand();
                    if (ret >= 0)
                    {
                        //var access = AccessType.ReadKeyA | AccessType.ReadKeyB | AccessType.WriteKeyA | AccessType.WriteKeyB | AccessType.IncrementKeyA | AccessType.IncrementKeyB | AccessType.DecrementTransferRestoreKeyA | AccessType.DecrementTransferRestoreKeyB;
                        //var sector = AccessSector.KeyAWriteKeyA | AccessSector.AccessBitsReadKeyA | AccessSector.KeyBWriteKeyA | AccessSector.KeyBRead | AccessSector.KeyBReadKeyA;
                        //var accessNew = new AccessType[3] { access, access, access };
                        //var encoded = mifareCard.EncodeSectorAndClockTailer(sector, accessNew);
                        //Console.WriteLine($"{encoded.Item1}, {encoded.Item2}, {encoded.Item3}");
                        mifareCard.Data[6] = 0xFF; //encoded.Item1;
                        mifareCard.Data[7] = 0x07; //encoded.Item2;
                        mifareCard.Data[8] = 0x80; // encoded.Item3;
                        mifareCard.Command = MifareCardCommand.Write16Bytes;
                        ret = mifareCard.RunMifiCardCommand();
                        if (ret >= 0)
                        {
                            Console.WriteLine("permossion changed");
                        }
                    }
                }
            }
        }
        public bool VerifyCard(MifareCard Card)
        {
            string data     = ConvertHexToString(Card.GetDataFromLastBlockRead());
            string MifareID = Card.GetCardSerial();

            if (data.Length > 0)
            {
                string SecurityString = EncryptOrDecrypt(data.Substring(0, 4), "schc");

                if (SecurityString.Equals(MifareID.Substring(MifareID.Length - 4, 4)))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(true);
            }
        }
예제 #27
0
        private bool VerifyCardAuthentication(MifareCard card, byte MSB, List <MifareCard_Block> lstBlocks)
        {
            try
            {
                bool authSuccessful = true;
                foreach (var block in lstBlocks)
                {
                    // authentication, typeA for classic 4K
                    authSuccessful = card.Authenticate(MSB, block.Block_Index_Hex, KeyType.KeyB, 0x00);

                    if (!authSuccessful)
                    {
                        throw new Exception("AUTHENTICATE failed at block " + block.Block_Index_Dec + " with key " + BitConverter.ToString(_authenticationKeys));
                    }
                }
                return(authSuccessful);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("VerifyCardAuthentication exception: " + ex.ToString());
                return(false);
            }
        }
예제 #28
0
        public static void WriteCode()
        {
            // Creating the device class through serial: /dev/ttyS0
            try
            {
                string device    = "/dev/ttyS0";
                var    reader    = new Pn532(device);
                byte[] writeUser = null;
                writeUser = reader.ListPassiveTarget(MaxTarget.One, TargetBaudRate.B106kbpsTypeA);
                Thread.Sleep(200);

                do
                {
                    var decrypted = reader.TryDecode106kbpsTypeA(writeUser.AsSpan().Slice(1));
                    var uid       = BitConverter.ToString(decrypted.NfcId);

                    Console.WriteLine("Enter Username:");
                    var    userName  = Console.ReadLine();
                    byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(userName);
                    byte[] cardData  = null;
                    reader.Transceive(1, byteArray, cardData);


                    MifareCard mifareCard = new MifareCard(reader, decrypted.TargetNumber)
                    {
                        BlockNumber = 0, Command = MifareCardCommand.AuthenticationA
                    };
                    mifareCard.SetCapacity(decrypted.Atqa, decrypted.Sak);
                    mifareCard.SerialNumber = decrypted.NfcId;
                    mifareCard.KeyA         = new byte[6] {
                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                    };
                    mifareCard.KeyB = new byte[6] {
                        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                    };

                    for (byte block = 0; block < 1; block++)
                    {
                        mifareCard.BlockNumber = block;
                        mifareCard.Command     = MifareCardCommand.AuthenticationB;
                        var ret = mifareCard.RunMifiCardCommand();
                        if (ret < 0)
                        {
                            // Try another one
                            mifareCard.Command = MifareCardCommand.AuthenticationA;
                            ret = mifareCard.RunMifiCardCommand();
                        }

                        if (ret == 1)
                        {
                            mifareCard.BlockNumber = block;
                            mifareCard.Command     = MifareCardCommand.Write16Bytes;

                            ret = mifareCard.RunMifiCardCommand();
                            Console.WriteLine(BitConverter.ToString(cardData));
                            continue;
                        }
                    }

                    reader.ReleaseTarget(1);
                    break;
                }while(writeUser != null);
            }

            catch (System.Exception)
            {
                WriteCode();
            }
        }
예제 #29
0
        private static void ReadMiFare(Pn532 pn532)
        {
            byte[] retData = null;
            while ((!Console.KeyAvailable))
            {
                retData = pn532.ListPassiveTarget(MaxTarget.One, TargetBaudRate.B106kbpsTypeA);
                if (retData != null)
                {
                    break;
                }

                // Give time to PN532 to process
                Thread.Sleep(200);
            }

            if (retData == null)
            {
                return;
            }

            var decrypted = pn532.TryDecode106kbpsTypeA(retData.AsSpan().Slice(1));

            if (decrypted != null)
            {
                Console.WriteLine(
                    $"Tg: {decrypted.TargetNumber}, ATQA: {decrypted.Atqa} SAK: {decrypted.Sak}, NFCID: {BitConverter.ToString(decrypted.NfcId)}");
                if (decrypted.Ats != null)
                {
                    Console.WriteLine($", ATS: {BitConverter.ToString(decrypted.Ats)}");
                }

                MifareCard mifareCard = new MifareCard(pn532, decrypted.TargetNumber)
                {
                    BlockNumber = 0, Command = MifareCardCommand.AuthenticationA
                };
                mifareCard.SetCapacity(decrypted.Atqa, decrypted.Sak);
                mifareCard.SerialNumber = decrypted.NfcId;
                mifareCard.KeyA         = new byte[6] {
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                };
                mifareCard.KeyB = new byte[6] {
                    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                };
                for (byte block = 0; block < 64; block++)
                {
                    mifareCard.BlockNumber = block;
                    mifareCard.Command     = MifareCardCommand.AuthenticationB;
                    var ret = mifareCard.RunMifiCardCommand();
                    if (ret < 0)
                    {
                        // Try another one
                        mifareCard.Command = MifareCardCommand.AuthenticationA;
                        ret = mifareCard.RunMifiCardCommand();
                    }

                    if (ret >= 0)
                    {
                        mifareCard.BlockNumber = block;
                        mifareCard.Command     = MifareCardCommand.Read16Bytes;
                        ret = mifareCard.RunMifiCardCommand();
                        if (ret >= 0)
                        {
                            Console.WriteLine($"Bloc: {block}, Data: {BitConverter.ToString(mifareCard.Data)}");
                        }
                        else
                        {
                            Console.WriteLine(
                                $"Error reading bloc: {block}, Data: {BitConverter.ToString(mifareCard.Data)}");
                        }

                        if (block % 4 == 3)
                        {
                            // Check what are the permissions
                            for (byte j = 3; j > 0; j--)
                            {
                                var access = mifareCard.BlockAccess((byte)(block - j), mifareCard.Data);
                                Console.WriteLine($"Bloc: {block - j}, Access: {access}");
                            }

                            var sector = mifareCard.SectorTailerAccess(block, mifareCard.Data);
                            Console.WriteLine($"Bloc: {block}, Access: {sector}");
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Autentication error");
                    }
                }
            }
        }
예제 #30
0
        /// <summary>
        /// Override binary data of all blocks of mifare classic 1k
        /// </summary>
        /// <param name="jsonValue">data to write (json format), maximum 1024 chars for card 1k, 4048 chars for card 4k</param>
        /// <returns></returns>
        private bool WriteData_MifareClassic(byte[] data, string readerName = null)
        {
            try
            {
                if (string.IsNullOrEmpty(readerName))
                {
                    readerName = _readerName;
                }

                // get list blocks will be read/write
                List <MifareCard_Block> lstBlocks = GetAll_Blocks_MifareClassic(EnumSmartCardTypes.MifareClassic4K);
                lstBlocks = lstBlocks?.Where(block => block.BlockType == EnumBlockTypes.Data).ToList();

                if (lstBlocks == null || lstBlocks.Count() == 0)
                {
                    throw new Exception("Can not get card blocks");
                }

                // MSB, default for ACS ACR122 0
                byte MSB = 0x00;
                if (readerName.Equals(EnumDeviceNames.SmartCardPrinterContactlessReader))
                {
                    MSB = 0x60;
                }

                // create mifare card
                MifareCard card = CreateMifareCardInstance(MSB, readerName);

                if (card == null)
                {
                    throw new Exception("Can not create card instance with keys: " + BitConverter.ToString(_authenticationKeys));
                }

                // verify card
                //bool verifycationResult = VerifyCardAuthentication(card, MSB, lstBlocks);

                //if (!verifycationResult)
                //{
                //    throw new Exception("Authentication failed");
                //}

                // loop to write binary data to mifare card
                int writtenBlock  = 0;
                int currentSector = -1;
                foreach (var block in lstBlocks)
                {
                    if (currentSector != block.Sector_Index)
                    {
                        currentSector = block.Sector_Index;

                        // authentication
                        // typeB
                        bool authSuccessful = card.Authenticate(MSB, block.Block_Index_Hex, KeyType.KeyA, 0x00);
                        if (!authSuccessful)
                        {
                            throw new Exception("AUTHENTICATE failed at block " + block.Block_Index_Dec + " with key " + BitConverter.ToString(_authenticationKeys));
                        }
                    }

                    // starting write binary data
                    byte[] dataToWrite      = GetDataToWrite(data, writtenBlock);
                    var    updateSuccessful = card.UpdateBinary(MSB, block.Block_Index_Hex, dataToWrite);

                    if (!updateSuccessful)
                    {
                        throw new Exception("UPDATE BINARY failed at block " + block.Block_Index_Dec + " with value " + BitConverter.ToString(dataToWrite));
                    }

                    writtenBlock++;
                }

                return(true);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("WriteBinaryData_MifareClassic exception: " + ex.ToString());
                return(false);
            }
        }