| /* |
| * Copyright (C) 2012 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 android.security; |
| |
| import android.os.Binder; |
| import android.os.IBinder; |
| import android.os.IInterface; |
| import android.os.Parcel; |
| import android.os.RemoteException; |
| |
| /** |
| * This must be kept manually in sync with system/security/keystore until AIDL |
| * can generate both Java and C++ bindings. |
| * |
| * @hide |
| */ |
| public interface IKeystoreService extends IInterface { |
| public static abstract class Stub extends Binder implements IKeystoreService { |
| private static class Proxy implements IKeystoreService { |
| private final IBinder mRemote; |
| |
| Proxy(IBinder remote) { |
| mRemote = remote; |
| } |
| |
| public IBinder asBinder() { |
| return mRemote; |
| } |
| |
| public String getInterfaceDescriptor() { |
| return DESCRIPTOR; |
| } |
| |
| public int test() throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public byte[] get(String name) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| byte[] _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| mRemote.transact(Stub.TRANSACTION_get, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.createByteArray(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int insert(String name, byte[] item, int uid, int flags) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeByteArray(item); |
| _data.writeInt(uid); |
| _data.writeInt(flags); |
| mRemote.transact(Stub.TRANSACTION_insert, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int del(String name, int uid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(uid); |
| mRemote.transact(Stub.TRANSACTION_del, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int exist(String name, int uid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(uid); |
| mRemote.transact(Stub.TRANSACTION_exist, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public String[] saw(String name, int uid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| String[] _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(uid); |
| mRemote.transact(Stub.TRANSACTION_saw, _data, _reply, 0); |
| _reply.readException(); |
| int size = _reply.readInt(); |
| _result = new String[size]; |
| for (int i = 0; i < size; i++) { |
| _result[i] = _reply.readString(); |
| } |
| int _ret = _reply.readInt(); |
| if (_ret != 1) { |
| return null; |
| } |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public int reset() throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| mRemote.transact(Stub.TRANSACTION_reset, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int password(String password) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(password); |
| mRemote.transact(Stub.TRANSACTION_password, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int lock() throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| mRemote.transact(Stub.TRANSACTION_lock, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int unlock(String password) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(password); |
| mRemote.transact(Stub.TRANSACTION_unlock, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public int zero() throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| mRemote.transact(Stub.TRANSACTION_zero, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int generate(String name, int uid, int keyType, int keySize, int flags, |
| byte[][] args) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(uid); |
| _data.writeInt(keyType); |
| _data.writeInt(keySize); |
| _data.writeInt(flags); |
| if (args == null) { |
| _data.writeInt(0); |
| } else { |
| _data.writeInt(args.length); |
| for (int i = 0; i < args.length; i++) { |
| _data.writeByteArray(args[i]); |
| } |
| } |
| mRemote.transact(Stub.TRANSACTION_generate, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int import_key(String name, byte[] data, int uid, int flags) |
| throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeByteArray(data); |
| _data.writeInt(uid); |
| _data.writeInt(flags); |
| mRemote.transact(Stub.TRANSACTION_import, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public byte[] sign(String name, byte[] data) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| byte[] _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeByteArray(data); |
| mRemote.transact(Stub.TRANSACTION_sign, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.createByteArray(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int verify(String name, byte[] data, byte[] signature) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeByteArray(data); |
| _data.writeByteArray(signature); |
| mRemote.transact(Stub.TRANSACTION_verify, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public byte[] get_pubkey(String name) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| byte[] _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| mRemote.transact(Stub.TRANSACTION_get_pubkey, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.createByteArray(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int del_key(String name, int uid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(uid); |
| mRemote.transact(Stub.TRANSACTION_del_key, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int grant(String name, int granteeUid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(granteeUid); |
| mRemote.transact(Stub.TRANSACTION_grant, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| public int ungrant(String name, int granteeUid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| _data.writeInt(granteeUid); |
| mRemote.transact(Stub.TRANSACTION_ungrant, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public long getmtime(String name) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| long _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(name); |
| mRemote.transact(Stub.TRANSACTION_getmtime, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readLong(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public int duplicate(String srcKey, int srcUid, String destKey, int destUid) |
| throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(srcKey); |
| _data.writeInt(srcUid); |
| _data.writeString(destKey); |
| _data.writeInt(destUid); |
| mRemote.transact(Stub.TRANSACTION_duplicate, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public int is_hardware_backed(String keyType) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeString(keyType); |
| mRemote.transact(Stub.TRANSACTION_is_hardware_backed, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| |
| @Override |
| public int clear_uid(long uid) throws RemoteException { |
| Parcel _data = Parcel.obtain(); |
| Parcel _reply = Parcel.obtain(); |
| int _result; |
| try { |
| _data.writeInterfaceToken(DESCRIPTOR); |
| _data.writeLong(uid); |
| mRemote.transact(Stub.TRANSACTION_clear_uid, _data, _reply, 0); |
| _reply.readException(); |
| _result = _reply.readInt(); |
| } finally { |
| _reply.recycle(); |
| _data.recycle(); |
| } |
| return _result; |
| } |
| } |
| |
| private static final String DESCRIPTOR = "android.security.keystore"; |
| |
| static final int TRANSACTION_test = IBinder.FIRST_CALL_TRANSACTION + 0; |
| static final int TRANSACTION_get = IBinder.FIRST_CALL_TRANSACTION + 1; |
| static final int TRANSACTION_insert = IBinder.FIRST_CALL_TRANSACTION + 2; |
| static final int TRANSACTION_del = IBinder.FIRST_CALL_TRANSACTION + 3; |
| static final int TRANSACTION_exist = IBinder.FIRST_CALL_TRANSACTION + 4; |
| static final int TRANSACTION_saw = IBinder.FIRST_CALL_TRANSACTION + 5; |
| static final int TRANSACTION_reset = IBinder.FIRST_CALL_TRANSACTION + 6; |
| static final int TRANSACTION_password = IBinder.FIRST_CALL_TRANSACTION + 7; |
| static final int TRANSACTION_lock = IBinder.FIRST_CALL_TRANSACTION + 8; |
| static final int TRANSACTION_unlock = IBinder.FIRST_CALL_TRANSACTION + 9; |
| static final int TRANSACTION_zero = IBinder.FIRST_CALL_TRANSACTION + 10; |
| static final int TRANSACTION_generate = IBinder.FIRST_CALL_TRANSACTION + 11; |
| static final int TRANSACTION_import = IBinder.FIRST_CALL_TRANSACTION + 12; |
| static final int TRANSACTION_sign = IBinder.FIRST_CALL_TRANSACTION + 13; |
| static final int TRANSACTION_verify = IBinder.FIRST_CALL_TRANSACTION + 14; |
| static final int TRANSACTION_get_pubkey = IBinder.FIRST_CALL_TRANSACTION + 15; |
| static final int TRANSACTION_del_key = IBinder.FIRST_CALL_TRANSACTION + 16; |
| static final int TRANSACTION_grant = IBinder.FIRST_CALL_TRANSACTION + 17; |
| static final int TRANSACTION_ungrant = IBinder.FIRST_CALL_TRANSACTION + 18; |
| static final int TRANSACTION_getmtime = IBinder.FIRST_CALL_TRANSACTION + 19; |
| static final int TRANSACTION_duplicate = IBinder.FIRST_CALL_TRANSACTION + 20; |
| static final int TRANSACTION_is_hardware_backed = IBinder.FIRST_CALL_TRANSACTION + 21; |
| static final int TRANSACTION_clear_uid = IBinder.FIRST_CALL_TRANSACTION + 22; |
| |
| /** |
| * Cast an IBinder object into an IKeystoreService interface, generating |
| * a proxy if needed. |
| */ |
| public static IKeystoreService asInterface(IBinder obj) { |
| if (obj == null) { |
| return null; |
| } |
| IInterface iin = obj.queryLocalInterface(DESCRIPTOR); |
| if (iin != null && iin instanceof IKeystoreService) { |
| return (IKeystoreService) iin; |
| } |
| return new IKeystoreService.Stub.Proxy(obj); |
| } |
| |
| /** Construct the stub at attach it to the interface. */ |
| public Stub() { |
| attachInterface(this, DESCRIPTOR); |
| } |
| |
| public IBinder asBinder() { |
| return this; |
| } |
| |
| @Override |
| public boolean onTransact(int code, Parcel data, Parcel reply, int flags) |
| throws RemoteException { |
| switch (code) { |
| case INTERFACE_TRANSACTION: { |
| reply.writeString(DESCRIPTOR); |
| return true; |
| } |
| case TRANSACTION_test: { |
| data.enforceInterface(DESCRIPTOR); |
| int resultCode = test(); |
| reply.writeNoException(); |
| reply.writeInt(resultCode); |
| return true; |
| } |
| } |
| return super.onTransact(code, data, reply, flags); |
| } |
| } |
| |
| public int test() throws RemoteException; |
| |
| public byte[] get(String name) throws RemoteException; |
| |
| public int insert(String name, byte[] item, int uid, int flags) throws RemoteException; |
| |
| public int del(String name, int uid) throws RemoteException; |
| |
| public int exist(String name, int uid) throws RemoteException; |
| |
| public String[] saw(String name, int uid) throws RemoteException; |
| |
| public int reset() throws RemoteException; |
| |
| public int password(String password) throws RemoteException; |
| |
| public int lock() throws RemoteException; |
| |
| public int unlock(String password) throws RemoteException; |
| |
| public int zero() throws RemoteException; |
| |
| public int generate(String name, int uid, int keyType, int keySize, int flags, byte[][] args) |
| throws RemoteException; |
| |
| public int import_key(String name, byte[] data, int uid, int flags) throws RemoteException; |
| |
| public byte[] sign(String name, byte[] data) throws RemoteException; |
| |
| public int verify(String name, byte[] data, byte[] signature) throws RemoteException; |
| |
| public byte[] get_pubkey(String name) throws RemoteException; |
| |
| public int del_key(String name, int uid) throws RemoteException; |
| |
| public int grant(String name, int granteeUid) throws RemoteException; |
| |
| public int ungrant(String name, int granteeUid) throws RemoteException; |
| |
| public long getmtime(String name) throws RemoteException; |
| |
| public int duplicate(String srcKey, int srcUid, String destKey, int destUid) |
| throws RemoteException; |
| |
| public int is_hardware_backed(String string) throws RemoteException; |
| |
| public int clear_uid(long uid) throws RemoteException; |
| } |