private async Task <List <SecondaryAuthenticationFactorInfo> > getConnectedRegisteredDeviceList(IReadOnlyList <SecondaryAuthenticationFactorInfo> devicesToCheck) { //byte[] deviceConfigurationDataArray; string selector = SmartCardReader.GetDeviceSelector(); selector += " AND System.Devices.DeviceInstanceId:~~\"Ledger\""; byte[] response = { 0 }; string sw1sw2 = null; string NanosATR = "3b00"; byte[] deviceDlockState = new byte[1]; byte[] deviceIdArray = new byte[16]; List <SecondaryAuthenticationFactorInfo> outList = new List <SecondaryAuthenticationFactorInfo>(); DeviceInformationCollection readers = await DeviceInformation.FindAllAsync(selector); foreach (SecondaryAuthenticationFactorInfo device in devicesToCheck) { //CryptographicBuffer.CopyToByteArray(device.DeviceConfigurationData, out deviceConfigurationDataArray); foreach (DeviceInformation smartcardreader in readers) { SmartCardReader reader = await SmartCardReader.FromIdAsync(smartcardreader.Id); SmartCardReaderStatus readerstatus = await reader.GetStatusAsync(); IReadOnlyList <SmartCard> cards = await reader.FindAllCardsAsync(); foreach (SmartCard card in cards) { try { IBuffer ATR = await card.GetAnswerToResetAsync(); string ATR_str = CryptographicBuffer.EncodeToHexString(ATR); if (ATR_str.Equals(NanosATR)) { SmartCardConnection connection = await card.ConnectAsync(); response = await Apdu.TransmitApduAsync(connection, Apdu.getDeviceGuidCmdApdu); sw1sw2 = Apdu.ApduResponseParser(response, out response); deviceIdArray = response; string deviceId = BitConverter.ToString(response).Replace("-", ""); if (deviceId == device.DeviceId) //update config data with dLockState and increment counter { outList.Add(device); } connection.Dispose(); } } catch { } } } } return(outList); }
private async Task PerformAuthentication() { string NanosATR = "3b00"; bool showNotificationFlag = true; string selector = SmartCardReader.GetDeviceSelector(); selector += " AND System.Devices.DeviceInstanceId:~~\"Ledger\""; DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector); foreach (DeviceInformation device in devices) { SmartCardReader reader = await SmartCardReader.FromIdAsync(device.Id); SmartCardReaderStatus readerstatus = await reader.GetStatusAsync(); //System.Diagnostics.Debug.WriteLine("Reader : " + reader.Name + " status : " + readerstatus.ToString()); IReadOnlyList <SmartCard> cards = await reader.FindAllCardsAsync(); foreach (SmartCard card in cards) { try { IBuffer ATR = await card.GetAnswerToResetAsync(); string ATR_str = CryptographicBuffer.EncodeToHexString(ATR); if (ATR_str.Equals(NanosATR)) { Task t = AuthenticateWithSmartCardAsync(card); await t; } } catch (CompanionDeviceNotFoundException ex) { ex.DisplayError(); break; } catch (UnableTogetNonceFromDeviceException ex) { ex.DisplayError(); showNotificationFlag = false; break; } catch (UnauthorizedUserException ex) { ex.DisplayError(); await SecondaryAuthenticationFactorAuthentication.ShowNotificationMessageAsync( "", SecondaryAuthenticationFactorAuthenticationMessage.UnauthorizedUser); //ShowToastNotification("Wrong Response"); showNotificationFlag = false; break; } catch (LogInDeniedByUserException ex) { ex.DisplayError(); await SecondaryAuthenticationFactorAuthentication.ShowNotificationMessageAsync( "", SecondaryAuthenticationFactorAuthenticationMessage.TryAgain); showNotificationFlag = false; break; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("[PerformAuthentication] Unhandled Exception / " + ex.Message); showNotificationFlag = false; return; } finally { } } } if (showNotificationFlag) { var loader = new Windows.ApplicationModel.Resources.ResourceLoader(); var str = loader.GetString("LookingForDevice"); await SecondaryAuthenticationFactorAuthentication.ShowNotificationMessageAsync( str, SecondaryAuthenticationFactorAuthenticationMessage.LookingForDevicePluggedin); } showNotificationFlag = true; }
private async Task writeConnectedRegisteredDevices() { string NanosATR = "3b00"; string selector = SmartCardReader.GetDeviceSelector(); selector += " AND System.Devices.DeviceInstanceId:~~\"Ledger\""; byte[] response = { 0 }; string sw1sw2 = null; byte[] deviceDlockState = new byte[1]; byte[] deviceIdArray = new byte[16]; string txt = ""; DeviceInformationCollection readers = await DeviceInformation.FindAllAsync(selector); IReadOnlyList <SecondaryAuthenticationFactorInfo> RegisteredDeviceList_addEvent = await SecondaryAuthenticationFactorRegistration.FindAllRegisteredDeviceInfoAsync( SecondaryAuthenticationFactorDeviceFindScope.User); List <SecondaryAuthenticationFactorInfo> ConnectedRegisteredDeviceList = await getConnectedRegisteredDeviceList(RegisteredDeviceList_addEvent); foreach (SecondaryAuthenticationFactorInfo device in ConnectedRegisteredDeviceList) { foreach (DeviceInformation smartcardreader in readers) { SmartCardReader reader = await SmartCardReader.FromIdAsync(smartcardreader.Id); SmartCardReaderStatus readerstatus = await reader.GetStatusAsync(); IReadOnlyList <SmartCard> cards = await reader.FindAllCardsAsync(); foreach (SmartCard card in cards) { try { IBuffer ATR = await card.GetAnswerToResetAsync(); string ATR_str = CryptographicBuffer.EncodeToHexString(ATR); if (ATR_str.Equals(NanosATR)) { SmartCardConnection connection = await card.ConnectAsync(); response = await Apdu.TransmitApduAsync(connection, Apdu.getDeviceGuidCmdApdu); sw1sw2 = Apdu.ApduResponseParser(response, out response); deviceIdArray = response; string deviceId = BitConverter.ToString(response).Replace("-", ""); if (deviceId == device.DeviceId) //update config data with dLockState { if (device.PresenceMonitoringMode != SecondaryAuthenticationFactorDevicePresenceMonitoringMode.AppManaged) { // Skip the device which doesn't need to be monitored in the background task continue; } await device.UpdateDevicePresenceAsync(SecondaryAuthenticationFactorDevicePresence.Present); response = await Apdu.TransmitApduAsync(connection, Apdu.getDlockStateCmdApdu); sw1sw2 = Apdu.ApduResponseParser(response, out response); deviceDlockState = response; string deviceConfigString = CryptographicBuffer.ConvertBinaryToString(0, device.DeviceConfigurationData); char[] deviceConfigCharArray = new char[deviceConfigString.Count()]; deviceConfigCharArray = deviceConfigString.ToCharArray(); string deviceConfigStringNew = ""; int count = device.DeviceFriendlyName.Count(); if (deviceDlockState[0] == 0) { if (deviceConfigCharArray[35] == '0') // Indicates if device was used for last login { deviceConfigStringNew = device.DeviceId + "-0-0-" + device.DeviceFriendlyName + "-" + deviceConfigString.Substring(35 + 1 + count + 1 + 1); } else { deviceConfigStringNew = device.DeviceId + "-0-1-" + device.DeviceFriendlyName + "-" + deviceConfigString.Substring(35 + 1 + count + 1 + 1); } } else { if (deviceConfigCharArray[35] == '0') { deviceConfigStringNew = device.DeviceId + "-1-0-" + device.DeviceFriendlyName + "-" + deviceConfigString.Substring(35 + 1 + count + 1 + 1); } else { deviceConfigStringNew = device.DeviceId + "-1-1-" + device.DeviceFriendlyName + "-" + deviceConfigString.Substring(35 + 1 + count + 1 + 1); } } // Get a Ibuffer from combinedDataArray IBuffer deviceConfigData = CryptographicBuffer.ConvertStringToBinary(deviceConfigString, 0); await SecondaryAuthenticationFactorRegistration.UpdateDeviceConfigurationDataAsync(device.DeviceId, deviceConfigData); } connection.Dispose(); } } catch (Exception e) { } } } txt += CryptographicBuffer.ConvertBinaryToString(0, device.DeviceConfigurationData) + Environment.NewLine; } StorageFolder folder = ApplicationData.Current.LocalFolder; StorageFile ConnectedRegisteredDeviceListFile = await folder.CreateFileAsync("connectedRegisteredDeviceList.txt", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(ConnectedRegisteredDeviceListFile, txt); }