StorageSecureStore.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package com.epson.iprint.storage;
  2. import android.content.Context;
  3. import android.database.Cursor;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6. import com.box.androidsdk.content.requests.BoxRequestsMetadata;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import javax.crypto.Cipher;
  10. import javax.crypto.spec.SecretKeySpec;
  11. public class StorageSecureStore {
  12. static StorageSecureStore mInstance;
  13. final String COLUMN_KEY = "key";
  14. final String COLUMN_VALUE = BoxRequestsMetadata.UpdateItemMetadata.BoxMetadataUpdateTask.VALUE;
  15. final String CREATE_KEYVALUE = "CREATE TABLE IF NOT EXISTS keyvalue_tbl (key TEXT PRIMARY KEY, value BLOB);";
  16. final String DELETE_KEYVALUE = "key=?";
  17. final String DROP_KEYVALUE = "DROP TABLE IF EXISTS keyvalue_tbl;";
  18. final String ENCRYPT_ALGORITHM = "AES";
  19. final int ENCRYPT_KEY_BYTES = 16;
  20. final int INDEX_KEY = 0;
  21. final int INDEX_VALUE = 1;
  22. final String KEYVALUE_DBNAME = "storage.data";
  23. final String KEYVALUE_TBLNAME = "keyvalue_tbl";
  24. final int KEYVALUE_VERSION = 1;
  25. final String SELECT_KEYVALUE = "SELECT * FROM keyvalue_tbl;";
  26. Context mContext = null;
  27. Map<String, String> mKeyValueMap = null;
  28. public enum EXEC_MODE {
  29. NONE,
  30. OVERWRITE_IF_EXIST
  31. }
  32. public static StorageSecureStore getSharedSecureStore() {
  33. return mInstance;
  34. }
  35. public boolean put(String str, String str2) {
  36. KeyValueDatabase keyValueDatabase = new KeyValueDatabase(mContext);
  37. boolean insert = keyValueDatabase.insert(str, str2);
  38. keyValueDatabase.close();
  39. reloadCache();
  40. return insert;
  41. }
  42. public boolean put(String str, String str2, EXEC_MODE exec_mode) {
  43. if (exec_mode == EXEC_MODE.OVERWRITE_IF_EXIST && fetch(str) != null) {
  44. revoke(str);
  45. }
  46. return put(str, str2);
  47. }
  48. public String fetch(String str) {
  49. return mKeyValueMap.get(str);
  50. }
  51. public boolean revoke(String str) {
  52. KeyValueDatabase keyValueDatabase = new KeyValueDatabase(mContext);
  53. boolean delete = keyValueDatabase.delete(str);
  54. keyValueDatabase.close();
  55. reloadCache();
  56. return delete;
  57. }
  58. public static void initSharedSecureStore(Context context) {
  59. if (mInstance == null) {
  60. mInstance = new StorageSecureStore(context);
  61. }
  62. }
  63. private byte[] encodeAes(byte[] bArr, String str) {
  64. if (bArr == null || str == null) {
  65. return null;
  66. }
  67. try {
  68. byte[] makeKeyBytes = makeKeyBytes(16, str.getBytes());
  69. Cipher instance = Cipher.getInstance("AES");
  70. instance.init(1, new SecretKeySpec(makeKeyBytes, "AES"));
  71. return instance.doFinal(bArr);
  72. } catch (Exception unused) {
  73. return null;
  74. }
  75. }
  76. private byte[] decodeAes(byte[] bArr, String str) {
  77. if (bArr == null || str == null) {
  78. return null;
  79. }
  80. try {
  81. byte[] makeKeyBytes = makeKeyBytes(16, str.getBytes());
  82. Cipher instance = Cipher.getInstance("AES");
  83. instance.init(2, new SecretKeySpec(makeKeyBytes, "AES"));
  84. return instance.doFinal(bArr);
  85. } catch (Exception unused) {
  86. return null;
  87. }
  88. }
  89. private byte[] makeKeyBytes(int i, byte[] bArr) {
  90. byte[] bArr2 = new byte[i];
  91. for (int i2 = 0; i2 < bArr2.length; i2++) {
  92. if (i2 < bArr.length) {
  93. bArr2[i2] = bArr[i2];
  94. } else {
  95. bArr2[i2] = 0;
  96. }
  97. }
  98. return bArr2;
  99. }
  100. StorageSecureStore(Context context) {
  101. mContext = context;
  102. reloadCache();
  103. }
  104. StorageSecureStore() {
  105. reloadCache();
  106. }
  107. private void reloadCache() {
  108. KeyValueDatabase keyValueDatabase = new KeyValueDatabase(mContext);
  109. mKeyValueMap = keyValueDatabase.select();
  110. keyValueDatabase.close();
  111. }
  112. public static void invalidateCache() {
  113. mInstance = null;
  114. }
  115. class KeyValueDatabase {
  116. String mSecretText;
  117. SQLiteDatabase mSqlDB = null;
  118. DatabaseHelper mSqlHelper = null;
  119. KeyValueDatabase(Context context) {
  120. mSqlHelper = new DatabaseHelper(context, "storage.data", (SQLiteDatabase.CursorFactory) null, 1);
  121. mSqlDB = mSqlHelper.getWritableDatabase();
  122. mSecretText = getClass().getName();
  123. }
  124. /* access modifiers changed from: package-private */
  125. /* JADX WARNING: Exception block dominator not found, dom blocks: [] */
  126. /* Code decompiled incorrectly, please refer to instructions dump. */
  127. public synchronized boolean insert(java.lang.String r5, java.lang.String r6) {
  128. /*
  129. r4 = this;
  130. monitor-enter(r4)
  131. r0 = -1
  132. com.epson.iprint.storage.StorageSecureStore r2 = com.epson.iprint.storage.StorageSecureStore.this // Catch:{ Exception -> 0x0031, all -> 0x002c }
  133. byte[] r6 = r6.getBytes() // Catch:{ Exception -> 0x0031, all -> 0x002c }
  134. java.lang.String r3 = r4.mSecretText // Catch:{ Exception -> 0x0031, all -> 0x002c }
  135. byte[] r6 = r2.encodeAes(r6, r3) // Catch:{ Exception -> 0x0031, all -> 0x002c }
  136. if (r6 == 0) goto L_0x0031
  137. android.content.ContentValues r2 = new android.content.ContentValues // Catch:{ Exception -> 0x0031, all -> 0x002c }
  138. r2.<init>() // Catch:{ Exception -> 0x0031, all -> 0x002c }
  139. java.lang.String r3 = "key"
  140. r2.put(r3, r5) // Catch:{ Exception -> 0x0031, all -> 0x002c }
  141. java.lang.String r5 = "value"
  142. r2.put(r5, r6) // Catch:{ Exception -> 0x0031, all -> 0x002c }
  143. android.database.sqlite.SQLiteDatabase r5 = r4.mSqlDB // Catch:{ Exception -> 0x0031, all -> 0x002c }
  144. java.lang.String r6 = "keyvalue_tbl"
  145. java.lang.String r3 = ""
  146. long r5 = r5.insert(r6, r3, r2) // Catch:{ Exception -> 0x0031, all -> 0x002c }
  147. r0 = r5
  148. goto L_0x0031
  149. L_0x002c:
  150. r5 = move-exception
  151. throw r5 // Catch:{ all -> 0x002e }
  152. L_0x002e:
  153. r5 = move-exception
  154. monitor-exit(r4)
  155. throw r5
  156. L_0x0031:
  157. r5 = 0
  158. int r2 = (r0 > r5 ? 1 : (r0 == r5 ? 0 : -1))
  159. if (r2 < 0) goto L_0x0039
  160. r5 = 1
  161. goto L_0x003a
  162. L_0x0039:
  163. r5 = 0
  164. L_0x003a:
  165. monitor-exit(r4)
  166. return r5
  167. */
  168. throw new UnsupportedOperationException("Method not decompiled: com.epson.iprint.storage.StorageSecureStore.KeyValueDatabase.insert(java.lang.String, java.lang.String):boolean");
  169. }
  170. /* access modifiers changed from: package-private */
  171. /* JADX WARNING: Exception block dominator not found, dom blocks: [] */
  172. /* Code decompiled incorrectly, please refer to instructions dump. */
  173. public synchronized boolean delete(java.lang.String r7) {
  174. /*
  175. r6 = this;
  176. monitor-enter(r6)
  177. r0 = 0
  178. android.database.sqlite.SQLiteDatabase r1 = r6.mSqlDB // Catch:{ Exception -> 0x0018, all -> 0x0015 }
  179. java.lang.String r2 = "keyvalue_tbl"
  180. java.lang.String r3 = "key=?"
  181. r4 = 1
  182. java.lang.String[] r5 = new java.lang.String[r4] // Catch:{ Exception -> 0x0018, all -> 0x0015 }
  183. r5[r0] = r7 // Catch:{ Exception -> 0x0018, all -> 0x0015 }
  184. int r7 = r1.delete(r2, r3, r5) // Catch:{ Exception -> 0x0018, all -> 0x0015 }
  185. if (r7 <= 0) goto L_0x0018
  186. r0 = 1
  187. goto L_0x0018
  188. L_0x0015:
  189. r7 = move-exception
  190. monitor-exit(r6)
  191. throw r7
  192. L_0x0018:
  193. monitor-exit(r6)
  194. return r0
  195. */
  196. throw new UnsupportedOperationException("Method not decompiled: com.epson.iprint.storage.StorageSecureStore.KeyValueDatabase.delete(java.lang.String):boolean");
  197. }
  198. /* JADX WARNING: type inference failed for: r1v0, types: [java.lang.String[], android.database.Cursor] */
  199. private synchronized Map<String, String> select() {
  200. HashMap hashMap;
  201. hashMap = new HashMap();
  202. Cursor cursor = 0;
  203. try {
  204. cursor = mSqlDB.rawQuery("SELECT * FROM keyvalue_tbl;", cursor);
  205. for (int i = 0; i < cursor.getCount(); i++) {
  206. cursor.moveToPosition(i);
  207. String string = cursor.getString(0);
  208. byte[] decodeAes = decodeAes(cursor.getBlob(1), mSecretText);
  209. if (decodeAes != null) {
  210. hashMap.put(string, new String(decodeAes));
  211. }
  212. }
  213. } finally {
  214. if (cursor != 0) {
  215. cursor.close();
  216. }
  217. }
  218. return hashMap;
  219. }
  220. /* access modifiers changed from: package-private */
  221. /* JADX WARNING: Exception block dominator not found, dom blocks: [] */
  222. /* Code decompiled incorrectly, please refer to instructions dump. */
  223. public synchronized void close() {
  224. /*
  225. r1 = this;
  226. monitor-enter(r1)
  227. android.database.sqlite.SQLiteDatabase r0 = r1.mSqlDB // Catch:{ Exception -> 0x000f, all -> 0x000c }
  228. r0.close() // Catch:{ Exception -> 0x000f, all -> 0x000c }
  229. com.epson.iprint.storage.StorageSecureStore$KeyValueDatabase$DatabaseHelper r0 = r1.mSqlHelper // Catch:{ Exception -> 0x000f, all -> 0x000c }
  230. r0.close() // Catch:{ Exception -> 0x000f, all -> 0x000c }
  231. goto L_0x000f
  232. L_0x000c:
  233. r0 = move-exception
  234. monitor-exit(r1)
  235. throw r0
  236. L_0x000f:
  237. monitor-exit(r1)
  238. return
  239. */
  240. throw new UnsupportedOperationException("Method not decompiled: com.epson.iprint.storage.StorageSecureStore.KeyValueDatabase.close():void");
  241. }
  242. class DatabaseHelper extends SQLiteOpenHelper {
  243. DatabaseHelper(Context context, String str, SQLiteDatabase.CursorFactory cursorFactory, int i) {
  244. super(context, str, cursorFactory, i);
  245. }
  246. public void onCreate(SQLiteDatabase sQLiteDatabase) {
  247. try {
  248. sQLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS keyvalue_tbl (key TEXT PRIMARY KEY, value BLOB);");
  249. } catch (Exception unused) {
  250. }
  251. }
  252. public void onUpgrade(SQLiteDatabase sQLiteDatabase, int i, int i2) {
  253. try {
  254. sQLiteDatabase.execSQL("DROP TABLE IF EXISTS keyvalue_tbl;");
  255. } catch (Exception unused) {
  256. }
  257. onCreate(sQLiteDatabase);
  258. }
  259. }
  260. }
  261. }