/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.keychain.tests.support; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.security.KeyChain; import android.security.KeyStore; import android.util.Log; public class KeyChainServiceTestSupport extends Service { private static final String TAG = "KeyChainServiceTest"; private final KeyStore mKeyStore = KeyStore.getInstance(); private final IKeyChainServiceTestSupport.Stub mIKeyChainServiceTestSupport = new IKeyChainServiceTestSupport.Stub() { @Override public boolean keystoreReset() { Log.d(TAG, "keystoreReset"); return mKeyStore.reset(); } @Override public boolean keystorePassword(String password) { Log.d(TAG, "keystorePassword"); return mKeyStore.password(password); } @Override public boolean keystorePut(String key, byte[] value) { Log.d(TAG, "keystorePut"); return mKeyStore.put(key, value); } @Override public void revokeAppPermission(final int uid, final String alias) throws RemoteException { Log.d(TAG, "revokeAppPermission"); blockingSetGrantPermission(uid, alias, false); } @Override public void grantAppPermission(final int uid, final String alias) throws RemoteException { Log.d(TAG, "grantAppPermission"); blockingSetGrantPermission(uid, alias, true); } /** * Binds to the KeyChainService and requests that permission for the sender to * access the specified alias is granted/revoked. * This method blocks so it must not be called from the UI thread. * @param senderUid * @param alias */ private void blockingSetGrantPermission(int senderUid, String alias, boolean value) throws RemoteException { KeyChain.KeyChainConnection connection = null; try { connection = KeyChain.bind(KeyChainServiceTestSupport.this); connection.getService().setGrant(senderUid, alias, value); } catch (InterruptedException e) { // should never happen. if it does we will not grant the requested permission Log.e(TAG, "interrupted while granting access"); Thread.currentThread().interrupt(); } finally { if (connection != null) { connection.close(); } } } }; @Override public IBinder onBind(Intent intent) { if (IKeyChainServiceTestSupport.class.getName().equals(intent.getAction())) { return mIKeyChainServiceTestSupport; } return null; } }