Index: chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java |
index 6d9fcf3fdd05b7a5f97c76d6d9b90ca950ab4214..b26ed6119273cd5a9c18a2cf718aac922a2f4b0a 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java |
@@ -21,12 +21,10 @@ import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.chrome.R; |
-import org.chromium.chrome.browser.smartcard.PKCS11AuthenticationManager; |
-import org.chromium.net.AndroidPrivateKey; |
-import org.chromium.net.DefaultAndroidKeyStore; |
import org.chromium.ui.base.WindowAndroid; |
import java.security.Principal; |
+import java.security.PrivateKey; |
import java.security.cert.CertificateEncodingException; |
import java.security.cert.X509Certificate; |
@@ -45,39 +43,37 @@ import javax.security.auth.x500.X500Principal; |
public class SSLClientCertificateRequest { |
static final String TAG = "SSLClientCertificateRequest"; |
- private static final DefaultAndroidKeyStore sLocalKeyStore = |
- new DefaultAndroidKeyStore(); |
- |
/** |
- * Common implementation for anynchronous task of handling the certificate request. This |
- * AsyncTask uses the abstract methods to retrieve the authentication material from a |
- * generalized key store. The key store is accessed in background, as the APIs being exercised |
+ * Implementation for anynchronous task of handling the certificate request. This |
+ * AsyncTask retrieves the authentication material from the system key store. |
+ * The key store is accessed in background, as the APIs being exercised |
* may be blocking. The results are posted back to native on the UI thread. |
*/ |
- abstract static class CertAsyncTask extends AsyncTask<Void, Void, Void> { |
+ private static class CertAsyncTaskKeyChain extends AsyncTask<Void, Void, Void> { |
// These fields will store the results computed in doInBackground so that they can be posted |
// back in onPostExecute. |
private byte[][] mEncodedChain; |
- private AndroidPrivateKey mAndroidPrivateKey; |
+ private PrivateKey mPrivateKey; |
// Pointer to the native certificate request needed to return the results. |
private final long mNativePtr; |
- CertAsyncTask(long nativePtr) { |
+ final Context mContext; |
+ final String mAlias; |
+ |
+ CertAsyncTaskKeyChain(Context context, long nativePtr, String alias) { |
mNativePtr = nativePtr; |
+ mContext = context; |
+ assert alias != null; |
+ mAlias = alias; |
} |
- // These overriden methods will be used to access the key store. |
- abstract String getAlias(); |
- abstract AndroidPrivateKey getPrivateKey(String alias); |
- abstract X509Certificate[] getCertificateChain(String alias); |
- |
@Override |
protected Void doInBackground(Void... params) { |
String alias = getAlias(); |
if (alias == null) return null; |
- AndroidPrivateKey key = getPrivateKey(alias); |
+ PrivateKey key = getPrivateKey(alias); |
X509Certificate[] chain = getCertificateChain(alias); |
if (key == null || chain == null || chain.length == 0) { |
@@ -97,38 +93,23 @@ public class SSLClientCertificateRequest { |
} |
mEncodedChain = encodedChain; |
- mAndroidPrivateKey = key; |
+ mPrivateKey = key; |
return null; |
} |
@Override |
protected void onPostExecute(Void result) { |
ThreadUtils.assertOnUiThread(); |
- nativeOnSystemRequestCompletion(mNativePtr, mEncodedChain, mAndroidPrivateKey); |
- } |
- } |
- |
- /** Implementation of CertAsyncTask for the system KeyChain API. */ |
- private static class CertAsyncTaskKeyChain extends CertAsyncTask { |
- final Context mContext; |
- final String mAlias; |
- |
- CertAsyncTaskKeyChain(Context context, long nativePtr, String alias) { |
- super(nativePtr); |
- mContext = context; |
- assert alias != null; |
- mAlias = alias; |
+ nativeOnSystemRequestCompletion(mNativePtr, mEncodedChain, mPrivateKey); |
} |
- @Override |
- String getAlias() { |
+ private String getAlias() { |
return mAlias; |
} |
- @Override |
- AndroidPrivateKey getPrivateKey(String alias) { |
+ private PrivateKey getPrivateKey(String alias) { |
try { |
- return sLocalKeyStore.createKey(KeyChain.getPrivateKey(mContext, alias)); |
+ return KeyChain.getPrivateKey(mContext, alias); |
} catch (KeyChainException e) { |
Log.w(TAG, "KeyChainException when looking for '" + alias + "' certificate"); |
return null; |
@@ -138,8 +119,7 @@ public class SSLClientCertificateRequest { |
} |
} |
- @Override |
- X509Certificate[] getCertificateChain(String alias) { |
+ private X509Certificate[] getCertificateChain(String alias) { |
try { |
return KeyChain.getCertificateChain(mContext, alias); |
} catch (KeyChainException e) { |
@@ -152,36 +132,6 @@ public class SSLClientCertificateRequest { |
} |
} |
- /** Implementation of CertAsyncTask for use with a PKCS11-backed KeyStore. */ |
- private static class CertAsyncTaskPKCS11 extends CertAsyncTask { |
- private final PKCS11AuthenticationManager mPKCS11AuthManager; |
- private final String mHostName; |
- private final int mPort; |
- |
- CertAsyncTaskPKCS11(long nativePtr, String hostName, int port, |
- PKCS11AuthenticationManager pkcs11CardAuthManager) { |
- super(nativePtr); |
- mHostName = hostName; |
- mPort = port; |
- mPKCS11AuthManager = pkcs11CardAuthManager; |
- } |
- |
- @Override |
- String getAlias() { |
- return mPKCS11AuthManager.getClientCertificateAlias(mHostName, mPort); |
- } |
- |
- @Override |
- AndroidPrivateKey getPrivateKey(String alias) { |
- return mPKCS11AuthManager.getPrivateKey(alias); |
- } |
- |
- @Override |
- X509Certificate[] getCertificateChain(String alias) { |
- return mPKCS11AuthManager.getCertificateChain(alias); |
- } |
- } |
- |
/** |
* The system KeyChain API will call us back on the alias() method, passing the alias of the |
* certificate selected by the user. |
@@ -275,6 +225,7 @@ public class SSLClientCertificateRequest { |
.setMessage(R.string.client_cert_unsupported_message) |
.setNegativeButton(R.string.close, |
new OnClickListener() { |
+ @Override |
public void onClick(DialogInterface dialog, int which) { |
// Do nothing |
} |
@@ -321,50 +272,13 @@ public class SSLClientCertificateRequest { |
} |
} |
- final Principal[] principalsForCallback = principals; |
- // Certificate for client authentication can be obtained either from the system store of |
- // from a smart card (if available). |
- Runnable useSystemStore = new Runnable() { |
- @Override |
- public void run() { |
- KeyChainCertSelectionCallback callback = |
- new KeyChainCertSelectionCallback(activity.getApplicationContext(), |
- nativePtr); |
- KeyChainCertSelectionWrapper keyChain = new KeyChainCertSelectionWrapper(activity, |
- callback, keyTypes, principalsForCallback, hostName, port, null); |
- maybeShowCertSelection(keyChain, callback, |
- new CertSelectionFailureDialog(activity)); |
- } |
- }; |
- |
- final Context appContext = activity.getApplicationContext(); |
- final PKCS11AuthenticationManager smartCardAuthManager = |
- ((ChromeApplication) appContext).getPKCS11AuthenticationManager(); |
- if (smartCardAuthManager.isPKCS11AuthEnabled()) { |
- // Smart card support is available, prompt the user whether to use it or Android system |
- // store. |
- Runnable useSmartCard = new Runnable() { |
- @Override |
- public void run() { |
- new CertAsyncTaskPKCS11(nativePtr, hostName, port, |
- smartCardAuthManager).execute(); |
- } |
- }; |
- Runnable cancelRunnable = new Runnable() { |
- @Override |
- public void run() { |
- // We took ownership of the request, need to delete it. |
- nativeOnSystemRequestCompletion(nativePtr, null, null); |
- } |
- }; |
- |
- KeyStoreSelectionDialog selectionDialog = new KeyStoreSelectionDialog( |
- useSystemStore, useSmartCard, cancelRunnable); |
- selectionDialog.show(activity.getFragmentManager(), null); |
- } else { |
- // Smart card support is not available, use the system store unconditionally. |
- useSystemStore.run(); |
- } |
+ KeyChainCertSelectionCallback callback = |
+ new KeyChainCertSelectionCallback(activity.getApplicationContext(), |
+ nativePtr); |
+ KeyChainCertSelectionWrapper keyChain = new KeyChainCertSelectionWrapper(activity, |
+ callback, keyTypes, principals, hostName, port, null); |
+ maybeShowCertSelection(keyChain, callback, |
+ new CertSelectionFailureDialog(activity)); |
// We've taken ownership of the native ssl request object. |
return true; |
@@ -399,5 +313,5 @@ public class SSLClientCertificateRequest { |
// Called to pass request results to native side. |
private static native void nativeOnSystemRequestCompletion( |
- long requestPtr, byte[][] certChain, AndroidPrivateKey androidKey); |
+ long requestPtr, byte[][] certChain, PrivateKey privateKey); |
} |