diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java index 380169a0f..a34029bac 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java @@ -103,28 +103,33 @@ public class SecurityTokenConnection { */ @VisibleForTesting void connectToDevice(Context context) throws IOException { - // Connect on transport layer - transport.connect(); + try { + // Connect on transport layer + transport.connect(); - // dummy instance for initial communicate() calls - cardCapabilities = new CardCapabilities(); + // dummy instance for initial communicate() calls + cardCapabilities = new CardCapabilities(); - determineTokenType(); + determineTokenType(); - CommandApdu select = commandFactory.createSelectFileOpenPgpCommand(); - ResponseApdu response = communicate(select); // activate connection + CommandApdu select = commandFactory.createSelectFileOpenPgpCommand(); + ResponseApdu response = communicate(select); // activate connection - if (!response.isSuccess()) { - throw new CardException("Initialization failed!", response.getSw()); + if (!response.isSuccess()) { + throw new CardException("Initialization failed!", response.getSw()); + } + + refreshConnectionCapabilities(); + + isPw1ValidatedForSignature = false; + isPw1ValidatedForOther = false; + isPw3Validated = false; + + smEstablishIfAvailable(context); + } catch (IOException e) { + transport.release(); + throw e; } - - refreshConnectionCapabilities(); - - isPw1ValidatedForSignature = false; - isPw1ValidatedForOther = false; - isPw3Validated = false; - - smEstablishIfAvailable(context); } @VisibleForTesting