16b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root/* 26b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * Copyright (C) 2012 The Android Open Source Project 36b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * 46b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 56b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * you may not use this file except in compliance with the License. 66b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * You may obtain a copy of the License at 76b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * 86b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 96b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * 106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * Unless required by applicable law or agreed to in writing, software 116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * See the License for the specific language governing permissions and 146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * limitations under the License. 156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root */ 166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootpackage android.security; 186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.Binder; 206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.IBinder; 216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.IInterface; 226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.Parcel; 236b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.RemoteException; 246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 256b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root/** 266b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * This must be kept manually in sync with system/security/keystore until AIDL 276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * can generate both Java and C++ bindings. 286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * 296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * @hide 306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root */ 316b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootpublic interface IKeystoreService extends IInterface { 326b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public static abstract class Stub extends Binder implements IKeystoreService { 336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root private static class Proxy implements IKeystoreService { 346b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root private final IBinder mRemote; 356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Proxy(IBinder remote) { 376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote = remote; 386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public IBinder asBinder() { 416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return mRemote; 426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public String getInterfaceDescriptor() { 456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return DESCRIPTOR; 466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int test() throws RemoteException { 496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 526b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 536b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 546b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0); 556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 586b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 596b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 606b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 616b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 636b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] get(String name) throws RemoteException { 656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root byte[] _result; 686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_get, _data, _reply, 0); 726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.createByteArray(); 746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 776b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 786b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 796b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 81a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root public int insert(String name, byte[] item, int uid, int flags) throws RemoteException { 826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 876b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 886b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeByteArray(item); 89e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 90a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root _data.writeInt(flags); 916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_insert, _data, _reply, 0); 926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 976b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 986b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 101e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int del(String name, int uid) throws RemoteException { 1026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1036b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 1046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 1056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 1066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 1076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 108e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 1096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_del, _data, _reply, 0); 1106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 1116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 1126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 1136b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 1146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 1156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 1176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 119e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int exist(String name, int uid) throws RemoteException { 1206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 1226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 1236b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 1246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 1256b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 126e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 1276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_exist, _data, _reply, 0); 1286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 1296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 1306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 1316b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 1326b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 1336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1346b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 1356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 137e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public String[] saw(String name, int uid) throws RemoteException { 1386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 1406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root String[] _result; 1416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 1426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 1436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 144e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 1456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_saw, _data, _reply, 0); 1466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 1476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int size = _reply.readInt(); 1486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = new String[size]; 1496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root for (int i = 0; i < size; i++) { 1506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result[i] = _reply.readString(); 1516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 15278ad849163a7b01073b46fbd7d818392720005d1Kenny Root int _ret = _reply.readInt(); 15378ad849163a7b01073b46fbd7d818392720005d1Kenny Root if (_ret != 1) { 15478ad849163a7b01073b46fbd7d818392720005d1Kenny Root return null; 15578ad849163a7b01073b46fbd7d818392720005d1Kenny Root } 1566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 1576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 1586b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 1596b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1606b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 1616b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 1636b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root @Override 1646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int reset() throws RemoteException { 1656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 1676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 1686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 1696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 1706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_reset, _data, _reply, 0); 1716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 1726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 1736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 1746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 1756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 1766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1776b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 1786b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1796b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 1806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int password(String password) throws RemoteException { 1816b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 1836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 1846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 1856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 1866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(password); 1876b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_password, _data, _reply, 0); 1886b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 1896b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 1906b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 1916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 1926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 1936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 1956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 1966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 1976b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int lock() throws RemoteException { 1986b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 1996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 2006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 2016b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 2026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 2036b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_lock, _data, _reply, 0); 2046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 2056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 2066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 2076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 2086b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 2096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 2116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 2136b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int unlock(String password) throws RemoteException { 2146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 2156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 2166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 2176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 2186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 2196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(password); 2206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_unlock, _data, _reply, 0); 2216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 2226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 2236b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 2246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 2256b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 2266b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 2286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 2306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root @Override 2316b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int zero() throws RemoteException { 2326b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 2336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 2346b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 2356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 2366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 2376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_zero, _data, _reply, 0); 2386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 2396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 2406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 2416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 2426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 2436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 2456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 247a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root public int generate(String name, int uid, int keyType, int keySize, int flags, 248a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root byte[][] args) throws RemoteException { 2496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 2506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 2516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 2526b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 2536b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 2546b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 255e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 256a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root _data.writeInt(keyType); 257a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root _data.writeInt(keySize); 258a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root _data.writeInt(flags); 259a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root if (args == null) { 260a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root _data.writeInt(0); 261a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root } else { 262a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root _data.writeInt(args.length); 263a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root for (int i = 0; i < args.length; i++) { 264a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root _data.writeByteArray(args[i]); 265a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root } 266a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root } 2676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_generate, _data, _reply, 0); 2686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 2696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 2706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 2716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 2726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 2736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 2756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 277a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root public int import_key(String name, byte[] data, int uid, int flags) 278a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root throws RemoteException { 2796b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 2806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 2816b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 2826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 2836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 2846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 2856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeByteArray(data); 286e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 287a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root _data.writeInt(flags); 2886b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_import, _data, _reply, 0); 2896b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 2906b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 2916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 2926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 2936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 2946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 2966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 2976b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 2986b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] sign(String name, byte[] data) throws RemoteException { 2996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3016b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root byte[] _result; 3026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3036b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 3056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeByteArray(data); 3066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_sign, _data, _reply, 0); 3076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3086b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.createByteArray(); 3096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 3106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 3116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 3126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3136b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 3146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 3166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int verify(String name, byte[] data, byte[] signature) throws RemoteException { 3176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 3206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 3236b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeByteArray(data); 3246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeByteArray(signature); 3256b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_verify, _data, _reply, 0); 3266b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 3286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 3296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 3306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 3316b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3326b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 3336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3346b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 3356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] get_pubkey(String name) throws RemoteException { 3366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root byte[] _result; 3396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 3426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_get_pubkey, _data, _reply, 0); 3436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.createByteArray(); 3456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 3466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 3476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 3486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 3506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 352e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int del_key(String name, int uid) throws RemoteException { 3536b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3546b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 3566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3586b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 359e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root _data.writeInt(uid); 3606b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_del_key, _data, _reply, 0); 3616b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 3636b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 3646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 3656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 3666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 3686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 3706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int grant(String name, int granteeUid) throws RemoteException { 3716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 3746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 3776b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInt(granteeUid); 3786b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_grant, _data, _reply, 0); 3796b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 3816b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 3826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 3836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 3846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 3866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 3876b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 3886b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int ungrant(String name, int granteeUid) throws RemoteException { 3896b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 3906b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 3916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int _result; 3926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 3936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 3946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 3956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInt(granteeUid); 3966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_ungrant, _data, _reply, 0); 3976b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 3986b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readInt(); 3996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 4006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 4016b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 4026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 4036b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 4046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 4056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 4066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root @Override 4076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public long getmtime(String name) throws RemoteException { 4086b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _data = Parcel.obtain(); 4096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root Parcel _reply = Parcel.obtain(); 4106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root long _result; 4116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root try { 4126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 4136b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.writeString(name); 4146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root mRemote.transact(Stub.TRANSACTION_getmtime, _data, _reply, 0); 4156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.readException(); 4166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _result = _reply.readLong(); 4176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } finally { 4186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _reply.recycle(); 4196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root _data.recycle(); 4206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 4216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return _result; 4226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 423bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root 424bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root @Override 4255f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root public int duplicate(String srcKey, int srcUid, String destKey, int destUid) 4265f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root throws RemoteException { 427bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root Parcel _data = Parcel.obtain(); 428bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root Parcel _reply = Parcel.obtain(); 429bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root int _result; 430bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root try { 431bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 4325f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root _data.writeString(srcKey); 4335f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root _data.writeInt(srcUid); 4345f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root _data.writeString(destKey); 4355f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root _data.writeInt(destUid); 4365f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root mRemote.transact(Stub.TRANSACTION_duplicate, _data, _reply, 0); 437bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root _reply.readException(); 438bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root _result = _reply.readInt(); 439bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root } finally { 440bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root _reply.recycle(); 441bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root _data.recycle(); 442bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root } 443bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root return _result; 444bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root } 4455cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root 4465cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root @Override 447b91773bce1126d28a93f73fbef18f3a79245f24eKenny Root public int is_hardware_backed(String keyType) throws RemoteException { 4485cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root Parcel _data = Parcel.obtain(); 4495cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root Parcel _reply = Parcel.obtain(); 4505cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root int _result; 4515cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root try { 4525cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 453b91773bce1126d28a93f73fbef18f3a79245f24eKenny Root _data.writeString(keyType); 4545cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root mRemote.transact(Stub.TRANSACTION_is_hardware_backed, _data, _reply, 0); 4555cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root _reply.readException(); 4565cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root _result = _reply.readInt(); 4575cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root } finally { 4585cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root _reply.recycle(); 4595cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root _data.recycle(); 4605cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root } 4615cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root return _result; 4625cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root } 463d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root 464d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root @Override 465d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root public int clear_uid(long uid) throws RemoteException { 466d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root Parcel _data = Parcel.obtain(); 467d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root Parcel _reply = Parcel.obtain(); 468d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root int _result; 469d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root try { 470d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _data.writeInterfaceToken(DESCRIPTOR); 471d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _data.writeLong(uid); 472d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root mRemote.transact(Stub.TRANSACTION_clear_uid, _data, _reply, 0); 473d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _reply.readException(); 474d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _result = _reply.readInt(); 475d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root } finally { 476d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _reply.recycle(); 477d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root _data.recycle(); 478d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root } 479d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root return _result; 480d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root } 481f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 482f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int reset_uid(int uid) throws RemoteException { 483f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _data = Parcel.obtain(); 484f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _reply = Parcel.obtain(); 485f0246a8a14d69680d1776620e75a485cf963e574Robin Lee int _result; 486f0246a8a14d69680d1776620e75a485cf963e574Robin Lee try { 487f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInterfaceToken(DESCRIPTOR); 488f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInt(uid); 489f0246a8a14d69680d1776620e75a485cf963e574Robin Lee mRemote.transact(Stub.TRANSACTION_reset_uid, _data, _reply, 0); 490f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.readException(); 491f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _result = _reply.readInt(); 492f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } finally { 493f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.recycle(); 494f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.recycle(); 495f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 496f0246a8a14d69680d1776620e75a485cf963e574Robin Lee return _result; 497f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 498f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 499f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int sync_uid(int srcUid, int dstUid) throws RemoteException { 500f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _data = Parcel.obtain(); 501f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _reply = Parcel.obtain(); 502f0246a8a14d69680d1776620e75a485cf963e574Robin Lee int _result; 503f0246a8a14d69680d1776620e75a485cf963e574Robin Lee try { 504f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInterfaceToken(DESCRIPTOR); 505f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInt(srcUid); 506f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInt(dstUid); 507f0246a8a14d69680d1776620e75a485cf963e574Robin Lee mRemote.transact(Stub.TRANSACTION_sync_uid, _data, _reply, 0); 508f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.readException(); 509f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _result = _reply.readInt(); 510f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } finally { 511f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.recycle(); 512f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.recycle(); 513f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 514f0246a8a14d69680d1776620e75a485cf963e574Robin Lee return _result; 515f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 516f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 517f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int password_uid(String password, int uid) throws RemoteException { 518f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _data = Parcel.obtain(); 519f0246a8a14d69680d1776620e75a485cf963e574Robin Lee Parcel _reply = Parcel.obtain(); 520f0246a8a14d69680d1776620e75a485cf963e574Robin Lee int _result; 521f0246a8a14d69680d1776620e75a485cf963e574Robin Lee try { 522f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInterfaceToken(DESCRIPTOR); 523f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeString(password); 524f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.writeInt(uid); 525f0246a8a14d69680d1776620e75a485cf963e574Robin Lee mRemote.transact(Stub.TRANSACTION_password_uid, _data, _reply, 0); 526f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.readException(); 527f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _result = _reply.readInt(); 528f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } finally { 529f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _reply.recycle(); 530f0246a8a14d69680d1776620e75a485cf963e574Robin Lee _data.recycle(); 531f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 532f0246a8a14d69680d1776620e75a485cf963e574Robin Lee return _result; 533f0246a8a14d69680d1776620e75a485cf963e574Robin Lee } 5346b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root private static final String DESCRIPTOR = "android.security.keystore"; 5376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_test = IBinder.FIRST_CALL_TRANSACTION + 0; 5396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_get = IBinder.FIRST_CALL_TRANSACTION + 1; 5406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_insert = IBinder.FIRST_CALL_TRANSACTION + 2; 5416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_del = IBinder.FIRST_CALL_TRANSACTION + 3; 5426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_exist = IBinder.FIRST_CALL_TRANSACTION + 4; 5436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_saw = IBinder.FIRST_CALL_TRANSACTION + 5; 5446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_reset = IBinder.FIRST_CALL_TRANSACTION + 6; 5456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_password = IBinder.FIRST_CALL_TRANSACTION + 7; 5466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_lock = IBinder.FIRST_CALL_TRANSACTION + 8; 5476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_unlock = IBinder.FIRST_CALL_TRANSACTION + 9; 5486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_zero = IBinder.FIRST_CALL_TRANSACTION + 10; 5496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_generate = IBinder.FIRST_CALL_TRANSACTION + 11; 5506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_import = IBinder.FIRST_CALL_TRANSACTION + 12; 5516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_sign = IBinder.FIRST_CALL_TRANSACTION + 13; 5526b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_verify = IBinder.FIRST_CALL_TRANSACTION + 14; 5536b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_get_pubkey = IBinder.FIRST_CALL_TRANSACTION + 15; 5546b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_del_key = IBinder.FIRST_CALL_TRANSACTION + 16; 5556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_grant = IBinder.FIRST_CALL_TRANSACTION + 17; 5566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_ungrant = IBinder.FIRST_CALL_TRANSACTION + 18; 5576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root static final int TRANSACTION_getmtime = IBinder.FIRST_CALL_TRANSACTION + 19; 5585f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root static final int TRANSACTION_duplicate = IBinder.FIRST_CALL_TRANSACTION + 20; 5595cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root static final int TRANSACTION_is_hardware_backed = IBinder.FIRST_CALL_TRANSACTION + 21; 560d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root static final int TRANSACTION_clear_uid = IBinder.FIRST_CALL_TRANSACTION + 22; 561f0246a8a14d69680d1776620e75a485cf963e574Robin Lee static final int TRANSACTION_reset_uid = IBinder.FIRST_CALL_TRANSACTION + 23; 562f0246a8a14d69680d1776620e75a485cf963e574Robin Lee static final int TRANSACTION_sync_uid = IBinder.FIRST_CALL_TRANSACTION + 24; 563f0246a8a14d69680d1776620e75a485cf963e574Robin Lee static final int TRANSACTION_password_uid = IBinder.FIRST_CALL_TRANSACTION + 25; 5646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root /** 5666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * Cast an IBinder object into an IKeystoreService interface, generating 5676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root * a proxy if needed. 5686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root */ 5696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public static IKeystoreService asInterface(IBinder obj) { 5706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root if (obj == null) { 5716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return null; 5726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root IInterface iin = obj.queryLocalInterface(DESCRIPTOR); 5746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root if (iin != null && iin instanceof IKeystoreService) { 5756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return (IKeystoreService) iin; 5766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5776b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return new IKeystoreService.Stub.Proxy(obj); 5786b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5796b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root /** Construct the stub at attach it to the interface. */ 5816b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public Stub() { 5826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root attachInterface(this, DESCRIPTOR); 5836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public IBinder asBinder() { 5866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return this; 5876b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5886b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 5896b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root @Override 5906b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 5916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root throws RemoteException { 5926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root switch (code) { 5936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root case INTERFACE_TRANSACTION: { 5946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root reply.writeString(DESCRIPTOR); 5956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return true; 5966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 5976b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root case TRANSACTION_test: { 5986b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root data.enforceInterface(DESCRIPTOR); 5996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root int resultCode = test(); 6006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root reply.writeNoException(); 6016b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root reply.writeInt(resultCode); 6026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return true; 6036b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 6046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 6056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root return super.onTransact(code, data, reply, flags); 6066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 6076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root } 6086b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int test() throws RemoteException; 6106b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6116b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] get(String name) throws RemoteException; 6126b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 613a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root public int insert(String name, byte[] item, int uid, int flags) throws RemoteException; 6146b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 615e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int del(String name, int uid) throws RemoteException; 6166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 617e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int exist(String name, int uid) throws RemoteException; 6186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 619e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public String[] saw(String name, int uid) throws RemoteException; 6206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int reset() throws RemoteException; 6226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6236b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int password(String password) throws RemoteException; 6246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6256b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int lock() throws RemoteException; 6266b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int unlock(String password) throws RemoteException; 6286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int zero() throws RemoteException; 6306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 631a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root public int generate(String name, int uid, int keyType, int keySize, int flags, byte[][] args) 632a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root throws RemoteException; 6336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 634a3788b00bb221e20abdd42f747d2af419e0a088cKenny Root public int import_key(String name, byte[] data, int uid, int flags) throws RemoteException; 6356b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6366b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] sign(String name, byte[] data) throws RemoteException; 6376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int verify(String name, byte[] data, byte[] signature) throws RemoteException; 6396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public byte[] get_pubkey(String name) throws RemoteException; 6416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 642e151f281d527f4bea5cbdf4219d5e0507a6668b0Kenny Root public int del_key(String name, int uid) throws RemoteException; 6436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int grant(String name, int granteeUid) throws RemoteException; 6456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public int ungrant(String name, int granteeUid) throws RemoteException; 6476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root 6486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root public long getmtime(String name) throws RemoteException; 649bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root 6505f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root public int duplicate(String srcKey, int srcUid, String destKey, int destUid) 6515f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root throws RemoteException; 6525cb5cec6a4a4d5432d4ce6468c12de9508db1633Kenny Root 653b91773bce1126d28a93f73fbef18f3a79245f24eKenny Root public int is_hardware_backed(String string) throws RemoteException; 654d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root 655d72317abd79ddf95d48c8f35bf1070900ff55b5eKenny Root public int clear_uid(long uid) throws RemoteException; 656f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 657f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int reset_uid(int uid) throws RemoteException; 658f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 659f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int sync_uid(int sourceUid, int targetUid) throws RemoteException; 660f0246a8a14d69680d1776620e75a485cf963e574Robin Lee 661f0246a8a14d69680d1776620e75a485cf963e574Robin Lee public int password_uid(String password, int uid) throws RemoteException; 6626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root} 663