· 8 years ago · Nov 22, 2017, 07:20 AM
1private val storage = Storage(context)
2
3fun createMasterKey(keyPassword: String? = null) {
4 if (SystemServices.hasMarshmallow()) {
5 createAndroidSymmetricKey()
6 } else {
7 createDefaultSymmetricKey()
8 }
9}
10
11private fun createAndroidSymmetricKey() {
12 keyStoreWrapper.createAndroidKeyStoreSymmetricKey(MASTER_KEY)
13}
14
15private fun createDefaultSymmetricKey() {
16 val symmetricKey = keyStoreWrapper.generateDefaultSymmetricKey()
17 val masterKey = keyStoreWrapper.createAndroidKeyStoreAsymmetricKey(MASTER_KEY)
18 val encryptedSymmetricKey = CipherWrapper(CipherWrapper.TRANSFORMATION_ASYMMETRIC).wrapKey(symmetricKey, masterKey.public)
19 storage.saveEncryptionKey(encryptedSymmetricKey)
20}
21
22// ---------
23
24fun encrypt(data: String, keyPassword: String? = null): String {
25 return if (SystemServices.hasMarshmallow()) {
26 encryptWithAndroidSymmetricKey(data)
27 } else {
28 encryptWithDefaultSymmetricKey(data)
29 }
30}
31
32fun decrypt(data: String, keyPassword: String? = null): String {
33 return if (SystemServices.hasMarshmallow()) {
34 decryptWithAndroidSymmetricKey(data)
35 } else {
36 decryptWithDefaultSymmetricKey(data)
37 }
38}
39
40private fun encryptWithAndroidSymmetricKey(data: String): String {
41 val masterKey = keyStoreWrapper.getAndroidKeyStoreSymmetricKey(MASTER_KEY)
42 return CipherWrapper(CipherWrapper.TRANSFORMATION_SYMMETRIC).encrypt(data, masterKey)
43}
44
45private fun decryptWithAndroidSymmetricKey(data: String): String {
46 val masterKey = keyStoreWrapper.getAndroidKeyStoreSymmetricKey(MASTER_KEY)
47 return CipherWrapper(CipherWrapper.TRANSFORMATION_SYMMETRIC).decrypt(data, masterKey)
48}
49
50private fun encryptWithDefaultSymmetricKey(data: String): String {
51 val masterKey = keyStoreWrapper.getAndroidKeyStoreAsymmetricKeyPair(MASTER_KEY)
52 val encryptionKey = storage.getEncryptionKey()
53 val symmetricKey = CipherWrapper(CipherWrapper.TRANSFORMATION_ASYMMETRIC).unWrapKey(encryptionKey, ALGORITHM_AES, Cipher.SECRET_KEY, masterKey?.private) as SecretKey
54 return CipherWrapper(CipherWrapper.TRANSFORMATION_SYMMETRIC).encrypt(data, symmetricKey)
55}
56
57private fun decryptWithDefaultSymmetricKey(data: String): String {
58 val masterKey = keyStoreWrapper.getAndroidKeyStoreAsymmetricKeyPair(MASTER_KEY)
59 val encryptionKey = storage.getEncryptionKey()
60 val symmetricKey = CipherWrapper(CipherWrapper.TRANSFORMATION_ASYMMETRIC).unWrapKey(encryptionKey, ALGORITHM_AES, Cipher.SECRET_KEY, masterKey?.private) as SecretKey
61 return CipherWrapper(CipherWrapper.TRANSFORMATION_SYMMETRIC).decrypt(data, symmetricKey)
62}