// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.net; import android.os.RemoteException; import android.util.Log; /** * Provides a remoted implementation of AndroidKeyStore where all calls are forwarded via * binder to an external process. */ public class RemoteAndroidKeyStore implements AndroidKeyStore { private static final String TAG = "AndroidKeyStoreRemoteImpl"; private static class RemotePrivateKey implements AndroidPrivateKey { // Reference to the key on a remote store. final int mHandle; // Key store handling this key. final RemoteAndroidKeyStore mStore; RemotePrivateKey(int handle, RemoteAndroidKeyStore store) { mHandle = handle; mStore = store; } public int getHandle() { return mHandle; } @Override public AndroidKeyStore getKeyStore() { return mStore; } } private final IRemoteAndroidKeyStore mRemoteManager; public RemoteAndroidKeyStore(IRemoteAndroidKeyStore manager) { mRemoteManager = manager; } @Override public byte[] getRSAKeyModulus(AndroidPrivateKey key) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "getRSAKeyModulus"); return mRemoteManager.getRSAKeyModulus(remoteKey.getHandle()); } catch (RemoteException e) { e.printStackTrace(); return null; } } @Override public byte[] getDSAKeyParamQ(AndroidPrivateKey key) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "getDSAKeyParamQ"); return mRemoteManager.getDSAKeyParamQ(remoteKey.getHandle()); } catch (RemoteException e) { e.printStackTrace(); return null; } } @Override public byte[] getECKeyOrder(AndroidPrivateKey key) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "getECKeyOrder"); return mRemoteManager.getECKeyOrder(remoteKey.getHandle()); } catch (RemoteException e) { e.printStackTrace(); return null; } } @Override public byte[] rawSignDigestWithPrivateKey(AndroidPrivateKey key, byte[] message) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "rawSignDigestWithPrivateKey"); return mRemoteManager.rawSignDigestWithPrivateKey(remoteKey.getHandle(), message); } catch (RemoteException e) { e.printStackTrace(); return null; } } @Override public int getPrivateKeyType(AndroidPrivateKey key) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "getPrivateKeyType"); return mRemoteManager.getPrivateKeyType(remoteKey.getHandle()); } catch (RemoteException e) { e.printStackTrace(); return 0; } } @Override public byte[] getPrivateKeyEncodedBytes(AndroidPrivateKey key) { // This should not be called as it's only for older versions of Android. assert false; return null; } @Override public int getOpenSSLHandleForPrivateKey(AndroidPrivateKey privateKey) { // This should not be called as it's only for older versions of Android. assert false; return 0; } public AndroidPrivateKey createKey(String alias) { try { int handle = mRemoteManager.getPrivateKeyHandle(alias); return new RemotePrivateKey(handle, this); } catch (RemoteException e) { e.printStackTrace(); return null; } } @Override public void releaseKey(AndroidPrivateKey key) { RemotePrivateKey remoteKey = (RemotePrivateKey) key; try { Log.d(TAG, "releaseKey"); mRemoteManager.releaseKey(remoteKey.getHandle()); } catch (RemoteException e) { e.printStackTrace(); } } }