// 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 long getOpenSSLHandleForPrivateKey(AndroidPrivateKey privateKey) {
        // This should not be called as it's only for older versions of Android.
        assert false;
        return 0;
    }

    @Override
    public Object getOpenSSLEngineForPrivateKey(AndroidPrivateKey privateKey) {
        // This should not be called as it's only for older versions of Android.
        assert false;
        return null;
    }

    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();
        }
    }
}
