From fc56825ed0b4808e407943cf87beeff5d2afa98b Mon Sep 17 00:00:00 2001 From: Henrik Lepson Date: Wed, 6 Oct 2021 21:02:33 +0300 Subject: [PATCH 1/4] MOB-35 started integrating the NFC class with the UI --- .../app/src/main/AndroidManifest.xml | 2 + .../mobileauthapp/AuthFragment.kt | 38 +++++++++++++++++-- .../mobileauthapp/MainActivity.kt | 2 + .../mobileauthapp/PinFragment.kt | 7 +++- .../mobileauthapp/UserFragment.kt | 4 +- .../app/src/main/res/values/strings.xml | 2 + 6 files changed, 47 insertions(+), 8 deletions(-) diff --git a/MobileAuthApp/app/src/main/AndroidManifest.xml b/MobileAuthApp/app/src/main/AndroidManifest.xml index be2c120..f592e7e 100644 --- a/MobileAuthApp/app/src/main/AndroidManifest.xml +++ b/MobileAuthApp/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + + timer.cancel() + requireActivity().runOnUiThread { + binding!!.timeCounter.text = getString(R.string.card_detected) + } + val card = IsoDep.get(tag) + card.timeout = 32768 + card.use { + val comms = Comms(it, viewModel.userCan) + val response = comms.readPersonalData(byteArrayOf(1, 2, 6)) + if (response != null) { + viewModel.setUserFirstName(response[1]) + viewModel.setUserLastName(response[0]) + viewModel.setUserIdentificationNumber(response[2]) + requireActivity().runOnUiThread{ + binding!!.timeCounter.text = getString(R.string.data_read) + } + } + it.close() + adapter.disableReaderMode(activity) + } + }, NfcAdapter.FLAG_READER_NFC_A, null) } private fun goToNextFragment() { - //Dummy data for now - viewModel.setUserFirstName("John") - viewModel.setUserLastName("Doe") - viewModel.setUserIdentificationNumber("012345678910") timer.cancel() findNavController().navigate(R.id.action_authFragment_to_userFragment) } diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/MainActivity.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/MainActivity.kt index bb85fbc..bc93c57 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/MainActivity.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/MainActivity.kt @@ -1,7 +1,9 @@ package com.tarkvaraprojekt.mobileauthapp +import android.nfc.NfcAdapter import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import com.tarkvaraprojekt.mobileauthapp.databinding.ActivityMainBinding diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt index ec3e69b..5e798b7 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt @@ -44,8 +44,11 @@ class PinFragment : Fragment() { ) findNavController().navigate(R.id.action_pinFragment_to_canFragment) } else { - Toast.makeText(requireContext(), getString(R.string.length_pin), Toast.LENGTH_SHORT) - .show() + // Currently it is not important to enter PIN1 so we will allow the user to leave this field empty + //Toast.makeText(requireContext(), getString(R.string.length_pin), Toast.LENGTH_SHORT) + // .show() + viewModel.setUserPin("1234") + findNavController().navigate(R.id.action_pinFragment_to_canFragment) } } diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/UserFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/UserFragment.kt index 5e7735a..632e1fa 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/UserFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/UserFragment.kt @@ -13,8 +13,8 @@ import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel /** * Fragment that is used to display the persons name and national identification number. - * Currently needed in order to test that the app is working because the results at the moment - * are not sent to some other website or app. + * Currently needed in order to test that the app is working and information is read + * from the ID card via NFC. */ class UserFragment : Fragment() { diff --git a/MobileAuthApp/app/src/main/res/values/strings.xml b/MobileAuthApp/app/src/main/res/values/strings.xml index b82e7fe..d4ef1e6 100644 --- a/MobileAuthApp/app/src/main/res/values/strings.xml +++ b/MobileAuthApp/app/src/main/res/values/strings.xml @@ -17,6 +17,8 @@ CAN Sisesta ID kaardi CAN (Card Access Number) CANi pikkus on vale + Kaart on tuvastatud. Hoia kaarti vastu telefoni. + Andmed loetud. ID kaardiga ühenduse loomiseks pane kaart vastu telefoni From cc35723c07ef2e1bd0ce6b9d9b92288b17e5b941 Mon Sep 17 00:00:00 2001 From: Henrik Lepson Date: Fri, 8 Oct 2021 20:09:36 +0300 Subject: [PATCH 2/4] MOB-14 improved the user experience --- .../mobileauthapp/AuthFragment.kt | 42 +++++++++++++------ .../mobileauthapp/PinFragment.kt | 3 ++ .../app/src/main/res/values/strings.xml | 9 ++-- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt index acde0b8..5276b19 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt @@ -15,6 +15,7 @@ import androidx.navigation.fragment.findNavController import com.tarkvaraprojekt.mobileauthapp.NFC.Comms import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentAuthBinding import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel +import java.lang.Exception import kotlin.concurrent.thread /** @@ -43,14 +44,19 @@ class AuthFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - timer = object : CountDownTimer(90000, 1000) { + timer = object : CountDownTimer((timeRemaining * 1000).toLong(), 1000) { override fun onTick(p0: Long) { - binding!!.timeCounter.text = getString(R.string.time_left, timeRemaining) timeRemaining-- + if (timeRemaining == 0) { + binding!!.timeCounter.text = getString(R.string.no_time) + } else { + binding!!.timeCounter.text = getString(R.string.time_left, timeRemaining) + } } override fun onFinish() { - binding!!.timeCounter.text = getString(R.string.no_time) + Thread.sleep(750) + goToTheStart() } }.start() binding!!.nextButton.setOnClickListener { goToNextFragment() } @@ -69,18 +75,28 @@ class AuthFragment : Fragment() { val card = IsoDep.get(tag) card.timeout = 32768 card.use { - val comms = Comms(it, viewModel.userCan) - val response = comms.readPersonalData(byteArrayOf(1, 2, 6)) - if (response != null) { - viewModel.setUserFirstName(response[1]) - viewModel.setUserLastName(response[0]) - viewModel.setUserIdentificationNumber(response[2]) - requireActivity().runOnUiThread{ - binding!!.timeCounter.text = getString(R.string.data_read) + try { + val comms = Comms(it, viewModel.userCan) + val response = comms.readPersonalData(byteArrayOf(1, 2, 6)) + if (response != null) { + viewModel.setUserFirstName(response[1]) + viewModel.setUserLastName(response[0]) + viewModel.setUserIdentificationNumber(response[2]) + requireActivity().runOnUiThread{ + binding!!.timeCounter.text = getString(R.string.data_read) + } } + } catch (e: Exception) { + requireActivity().runOnUiThread { + binding!!.timeCounter.text = getString(R.string.no_success) + } + // Gives user some time to read the error message + Thread.sleep(1000) + goToTheStart() + } finally { + it.close() + adapter.disableReaderMode(activity) } - it.close() - adapter.disableReaderMode(activity) } }, NfcAdapter.FLAG_READER_NFC_A, null) } diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt index 5e798b7..23ed504 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/PinFragment.kt @@ -34,6 +34,9 @@ class PinFragment : Fragment() { binding!!.nextButton.setOnClickListener { goToNextFragment() } binding!!.cancelButton.setOnClickListener { goToTheStart() } + // Currently PIN 1 is not required and thus this step is immediately skipped. + // In the future the UI flow will be changed in the nav_graph. + goToNextFragment() } private fun goToNextFragment() { diff --git a/MobileAuthApp/app/src/main/res/values/strings.xml b/MobileAuthApp/app/src/main/res/values/strings.xml index d4ef1e6..0274330 100644 --- a/MobileAuthApp/app/src/main/res/values/strings.xml +++ b/MobileAuthApp/app/src/main/res/values/strings.xml @@ -7,10 +7,10 @@ KATKESTA - Palun sisesta PIN1 - PIN1 + Palun sisesta PIN 1 + PIN 1 Näide. 1234 - PIN1 lubatud pikkus on 4-12 + PIN 1 lubatud pikkus on 4..12 Näide. 123456 @@ -18,12 +18,13 @@ Sisesta ID kaardi CAN (Card Access Number) CANi pikkus on vale Kaart on tuvastatud. Hoia kaarti vastu telefoni. - Andmed loetud. + Andmed loetud. Võid edasi minna. ID kaardiga ühenduse loomiseks pane kaart vastu telefoni Aega on jäänud %d sek Aeg on otsas + Vale CAN NIMI From 76fecd766feb4657b7b94db1a6f3490f96b54181 Mon Sep 17 00:00:00 2001 From: Henrik Lepson Date: Fri, 8 Oct 2021 21:24:21 +0300 Subject: [PATCH 3/4] MOB-14 two small fixes --- .../tarkvaraprojekt/mobileauthapp/AuthFragment.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt index 5276b19..e918c64 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt @@ -6,6 +6,7 @@ import android.nfc.NfcAdapter import android.nfc.tech.IsoDep import android.os.Bundle import android.os.CountDownTimer +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -78,13 +79,11 @@ class AuthFragment : Fragment() { try { val comms = Comms(it, viewModel.userCan) val response = comms.readPersonalData(byteArrayOf(1, 2, 6)) - if (response != null) { - viewModel.setUserFirstName(response[1]) - viewModel.setUserLastName(response[0]) - viewModel.setUserIdentificationNumber(response[2]) - requireActivity().runOnUiThread{ - binding!!.timeCounter.text = getString(R.string.data_read) - } + viewModel.setUserFirstName(response[1]) + viewModel.setUserLastName(response[0]) + viewModel.setUserIdentificationNumber(response[2]) + requireActivity().runOnUiThread{ + binding!!.timeCounter.text = getString(R.string.data_read) } } catch (e: Exception) { requireActivity().runOnUiThread { @@ -94,7 +93,6 @@ class AuthFragment : Fragment() { Thread.sleep(1000) goToTheStart() } finally { - it.close() adapter.disableReaderMode(activity) } } From e975a3e2629209dcb8562115f779704803d23db1 Mon Sep 17 00:00:00 2001 From: TanelOrumaa Date: Sat, 9 Oct 2021 18:06:13 +0300 Subject: [PATCH 4/4] Created the outline for token creation. --- .../mobileauthapp/NFC/Comms.java | 4 ++++ .../mobileauthapp/auth/Authenticator.kt | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/auth/Authenticator.kt diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/NFC/Comms.java b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/NFC/Comms.java index e9cce29..a4d184b 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/NFC/Comms.java +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/NFC/Comms.java @@ -95,6 +95,10 @@ public class Comms { keyMAC = keys[1]; } + public byte[] getAuthenticationCertificate() { + return new byte[0]; + } + /** * Calculates the message authentication code * diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/auth/Authenticator.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/auth/Authenticator.kt new file mode 100644 index 0000000..a92d716 --- /dev/null +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/auth/Authenticator.kt @@ -0,0 +1,22 @@ +package com.tarkvaraprojekt.mobileauthapp.auth + +import android.nfc.tech.IsoDep +import com.tarkvaraprojekt.mobileauthapp.NFC.Comms +import java.math.BigInteger + +class Authenticator(val comms : Comms) { + + public fun authenticate(nonce: BigInteger, challengeUrl: String, pin1: String) { + + // Ask PIN 1 from the user and get the authentication certificate from the ID card. + val authenticationCertificate : ByteArray = comms.getAuthenticationCertificate(); + + // Create the authentication token (OpenID X509) + + // Hash the authentication token. + + // Send the authentication token hash to the ID card for signing and get signed authentication token as response. + + // Return the signed authentication token. + } +} \ No newline at end of file