瀏覽代碼

Handle APDU responses with stripped status code better

This is still pretty hacky. Ideally we should return structured data (at
least separate the status code from the payload, or better, just do
everything in binary) from ApduTransmitter / ApduChannel.
Peter Cai 3 年之前
父節點
當前提交
936444f162

+ 8 - 0
libs/lpad-sm-dp-plus-connector/src/main/java/com/truphone/lpa/impl/download/ApduTransmitter.kt

@@ -39,6 +39,10 @@ class ApduTransmitter(private val apduChannel: ApduChannel) {
             )
         }
 
+        if (apduResponse.length < 4) {
+            throw RuntimeException("APDU response should at least contain a status code")
+        }
+
         // Last 2 bytes are the status code (should be 0x9000)
         // TODO: Do this properly
         return apduResponse.substring(0, apduResponse.length - 4)
@@ -57,6 +61,10 @@ class ApduTransmitter(private val apduChannel: ApduChannel) {
             )
         }
 
+        if (apduResponse.length < 4) {
+            throw RuntimeException("APDU response should at least contain a status code")
+        }
+
         // Last 2 bytes are the status code (should be 0x9000)
         // TODO: Do this properly
         return apduResponse.substring(0, apduResponse.length - 4)

+ 9 - 28
libs/lpad-sm-dp-plus-connector/src/main/java/com/truphone/lpa/impl/download/InstallationPhaseWorker.java

@@ -98,10 +98,8 @@ public class InstallationPhaseWorker {
 
         String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
 
-        if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
+        if (StringUtils.isNotBlank(profileInstallationResult)) {
             checkProfileInstallationResult(profileInstallationResult);
-        } else {
-            throw new RuntimeException("Unexpected response on loadBoundProfilePackage");
         }
     }
 
@@ -112,12 +110,8 @@ public class InstallationPhaseWorker {
 
         String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
 
-        if (profileInstallationResult.compareTo("9000") != 0) {
-            if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
-                checkProfileInstallationResult(profileInstallationResult);
-            } else {
-                throw new RuntimeException("Unexpected response on loadStoreMetadata");
-            }
+        if (StringUtils.isNotBlank(profileInstallationResult)) {
+            checkProfileInstallationResult(profileInstallationResult);
         }
     }
 
@@ -128,12 +122,8 @@ public class InstallationPhaseWorker {
 
         String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
 
-        if (profileInstallationResult.compareTo("9000") != 0) {
-            if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
-                checkProfileInstallationResult(profileInstallationResult);
-            } else {
-                throw new RuntimeException("Unexpected response on loadConfigureIsdpa");
-            }
+        if (StringUtils.isNotBlank(profileInstallationResult)) {
+            checkProfileInstallationResult(profileInstallationResult);
         }
     }
 
@@ -144,12 +134,8 @@ public class InstallationPhaseWorker {
 
         String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
 
-        if (profileInstallationResult.compareTo("9000") != 0) {
-            if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
-                checkProfileInstallationResult(profileInstallationResult);
-            } else {
-                throw new RuntimeException("Unexpected response on loadInitialiseSecureChannel");
-            }
+        if (StringUtils.isNotBlank(profileInstallationResult)) {
+            checkProfileInstallationResult(profileInstallationResult);
         }
     }
 
@@ -237,13 +223,8 @@ public class InstallationPhaseWorker {
                 "loadReplaceSessionsKeys...");
 
         String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
-
-        if (profileInstallationResult.compareTo("9000") != 0) {
-            if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
-                checkProfileInstallationResult(profileInstallationResult);
-            } else {
-                throw new RuntimeException("Unexpected response on loadReplaceSessionsKeys");
-            }
+        if (StringUtils.isNotBlank(profileInstallationResult)) {
+            checkProfileInstallationResult(profileInstallationResult);
         }
     }
 }