StorageSecureStore.java 11 KB

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