From dbc758fb14c5d0e0729ee80c041dfe0b886e6406 Mon Sep 17 00:00:00 2001 From: stargateprovider Date: Sat, 4 Dec 2021 21:22:54 +0200 Subject: [PATCH] More specific errors and notifications --- .../mobileauthapp/AuthFragment.kt | 3 +++ .../tarkvaraprojekt/mobileauthapp/CanFragment.kt | 14 ++++++++++---- .../tarkvaraprojekt/mobileauthapp/NFC/Comms.java | 16 ++++++++-------- .../app/src/main/res/values-en/strings.xml | 3 +++ .../app/src/main/res/values-et/strings.xml | 3 +++ .../app/src/main/res/values/strings.xml | 3 +++ 6 files changed, 30 insertions(+), 12 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 2a395f8..5f5b1cb 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/AuthFragment.kt @@ -120,6 +120,9 @@ class AuthFragment : Fragment() { viewModel.deleteCan(requireContext()) } catch (e: AuthAppException) { msgCode = when (e.code) { + 400 -> R.string.err_parameter + 401 -> R.string.err_authentication + 446 -> R.string.err_card_locked 448 -> R.string.err_bad_data 500 -> R.string.err_internal else -> R.string.err_unknown diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/CanFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/CanFragment.kt index 1b281aa..e8ea7a7 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/CanFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/CanFragment.kt @@ -71,6 +71,14 @@ class CanFragment : Fragment() { findNavController().navigate(action) } + /** + * Saves the entered CAN and notifies the user about it + */ + private fun saveCan() { + viewModel.storeCan(requireContext()) + Toast.makeText(requireContext(), getString(R.string.can_status_saved), Toast.LENGTH_SHORT).show() + } + /** * Checks whether the user has entered a 6 digit can to the input field. * If yes then the user is allowed to continue otherwise the user is @@ -81,7 +89,7 @@ class CanFragment : Fragment() { if (enteredCan.length == 6) { viewModel.setUserCan(enteredCan) if (args.saving) { - viewModel.storeCan(requireContext()) + saveCan() goToTheStart() } else { val storeCanQuestion = getDialog() @@ -103,9 +111,7 @@ class CanFragment : Fragment() { builder.apply { // If response is positive then save the CAN on the device. setPositiveButton(R.string.save_text) { _, _ -> - viewModel.storeCan( - requireContext() - ) + saveCan() goToTheNextFragment() } setNegativeButton(R.string.deny_text) { _, _ -> 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 21ce9d7..8519c5c 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 @@ -159,7 +159,7 @@ public class Comms { private byte[] getResponse(byte[] APDU, String log) throws IOException { byte[] response = idCard.transceive(APDU); if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { - throw new RuntimeException(String.format("%s failed.", log)); + throw new AuthAppException(String.format("%s failed.", log), 500); } Log.i(log, Hex.toHexString(response)); return response; @@ -227,7 +227,7 @@ public class Comms { selectFile(FID, info); byte[] response = getResponse(new byte[0], readFile, "Read binary"); if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { - throw new RuntimeException(String.format("Could not read %s", info)); + throw new AuthAppException(String.format("Could not read %s", info), 500); } return encryptDecryptData(Arrays.copyOfRange(response, 3, 19), Cipher.DECRYPT_MODE); } @@ -296,7 +296,7 @@ public class Comms { private void selectFile(byte[] FID, String info) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, IOException { byte[] response = getResponse(FID, selectFile, String.format("Select %s", info)); if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { - throw new RuntimeException(String.format("Could not select %s", info)); + throw new AuthAppException(String.format("Could not select %s", info), 500); } } @@ -354,9 +354,9 @@ public class Comms { if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { if (response[response.length - 2] == 0x69 && response[response.length - 1] == (byte) 0x83) { - throw new RuntimeException("Invalid PIN. Authentication method blocked."); + throw new AuthAppException("Invalid PIN. Authentication method blocked.", 446); } else { - throw new RuntimeException(String.format("Invalid PIN. Attempts left: %d.", response[response.length - 1] + 64)); + throw new AuthAppException(String.format("Invalid PIN. Attempts left: %d.", response[response.length - 1] + 64), 401); } } } @@ -385,7 +385,7 @@ public class Comms { readCert[3] = (byte) (certificate.length % 256); byte[] response = getResponse(new byte[0], readCert, "Read the certificate"); if (response[response.length - 2] == 0x6b && response[response.length - 1] == 0x00) { - throw new RuntimeException("Wrong read parameters."); + throw new AuthAppException("Wrong read parameters.", 400); } // Set the range containing a portion of the certificate and decrypt it @@ -420,7 +420,7 @@ public class Comms { byte[] response = getResponse(Env, MSESetEnv, "Set environment"); if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { - throw new RuntimeException("Setting the environment failed."); + throw new AuthAppException("Setting the environment failed.", 500); } InternalAuthenticate[4] = (byte) (0x1d + 16 * (token.length / 16)); @@ -428,7 +428,7 @@ public class Comms { response = getResponse(token, InternalAuthenticate, "Internal Authenticate"); if (response[response.length - 2] != (byte) 0x90 || response[response.length - 1] != 0x00) { - throw new RuntimeException("Signing the token failed."); + throw new AuthAppException("Signing the token failed.", 500); } byte[] signature = encryptDecryptData(Arrays.copyOfRange(response, 3, 115), Cipher.DECRYPT_MODE); diff --git a/MobileAuthApp/app/src/main/res/values-en/strings.xml b/MobileAuthApp/app/src/main/res/values-en/strings.xml index 69af501..ef5b013 100644 --- a/MobileAuthApp/app/src/main/res/values-en/strings.xml +++ b/MobileAuthApp/app/src/main/res/values-en/strings.xml @@ -80,4 +80,7 @@ Failed to read data from the ID-card Internal error Read bad data from the ID-card, try using the card again + Required parameter is missing or invalid + Failed to authenticate + Card locked \ No newline at end of file diff --git a/MobileAuthApp/app/src/main/res/values-et/strings.xml b/MobileAuthApp/app/src/main/res/values-et/strings.xml index 1dedbd0..40ee21d 100644 --- a/MobileAuthApp/app/src/main/res/values-et/strings.xml +++ b/MobileAuthApp/app/src/main/res/values-et/strings.xml @@ -78,4 +78,7 @@ Ei saanud ID-kaardilt andmeid lugeda Rakendusesisene viga ID-kaardilt loeti vigased andmed, proovi uuesti kaarti kasutada + Vigane või puuduv parameeter + Autentimine ebaõnnestus + Kaart lukus \ No newline at end of file diff --git a/MobileAuthApp/app/src/main/res/values/strings.xml b/MobileAuthApp/app/src/main/res/values/strings.xml index ac0d78b..2a86337 100644 --- a/MobileAuthApp/app/src/main/res/values/strings.xml +++ b/MobileAuthApp/app/src/main/res/values/strings.xml @@ -78,4 +78,7 @@ Failed to read data from the ID-card Internal error Read bad data from the ID-card, try using the card again + Required parameter is missing or invalid + Failed to authenticate + Card locked \ No newline at end of file