diff options
Diffstat (limited to 'app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt')
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt b/app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt index 3d59476..33240f9 100644 --- a/app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt +++ b/app/src/main/java/org/pacien/tincapp/utils/PemUtils.kt | |||
@@ -17,46 +17,46 @@ import java.io.Writer | |||
17 | */ | 17 | */ |
18 | object PemUtils { | 18 | object PemUtils { |
19 | 19 | ||
20 | private val PROVIDER = org.bouncycastle.jce.provider.BouncyCastleProvider() | 20 | private val PROVIDER = org.bouncycastle.jce.provider.BouncyCastleProvider() |
21 | private val ENCRYPTED_PROC_TYPE_HEADER = PemHeader("Proc-Type", "4,ENCRYPTED") | 21 | private val ENCRYPTED_PROC_TYPE_HEADER = PemHeader("Proc-Type", "4,ENCRYPTED") |
22 | private val DEK_INFO_HEADER_KEY = "DEK-Info" | 22 | private val DEK_INFO_HEADER_KEY = "DEK-Info" |
23 | private val ALGO = "AES-256-CBC" | 23 | private val ALGO = "AES-256-CBC" |
24 | 24 | ||
25 | private class DekInfo(val algName: String, val iv: ByteArray) | 25 | private class DekInfo(val algName: String, val iv: ByteArray) |
26 | 26 | ||
27 | private fun dekInfoHeader(iv: ByteArray) = PemHeader(DEK_INFO_HEADER_KEY, "$ALGO,${Hex.toHexString(iv)}") | 27 | private fun dekInfoHeader(iv: ByteArray) = PemHeader(DEK_INFO_HEADER_KEY, "$ALGO,${Hex.toHexString(iv)}") |
28 | private fun PemObject.getPemHeaders() = headers.map { it as PemHeader } | 28 | private fun PemObject.getPemHeaders() = headers.map { it as PemHeader } |
29 | 29 | ||
30 | fun read(f: File): PemObject = PEMParser(FileReader(f)).readPemObject() | 30 | fun read(f: File): PemObject = PEMParser(FileReader(f)).readPemObject() |
31 | fun write(obj: PemObject, out: Writer) = JcaPEMWriter(out).apply { writeObject(obj) }.apply { close() } | 31 | fun write(obj: PemObject, out: Writer) = JcaPEMWriter(out).apply { writeObject(obj) }.apply { close() } |
32 | fun isEncrypted(obj: PemObject) = obj.headers.contains(ENCRYPTED_PROC_TYPE_HEADER) | 32 | fun isEncrypted(obj: PemObject) = obj.headers.contains(ENCRYPTED_PROC_TYPE_HEADER) |
33 | 33 | ||
34 | fun encrypt(obj: PemObject, passPhrase: String) = | 34 | fun encrypt(obj: PemObject, passPhrase: String) = |
35 | JcePEMEncryptorBuilder(ALGO) | 35 | JcePEMEncryptorBuilder(ALGO) |
36 | .setProvider(PROVIDER) | 36 | .setProvider(PROVIDER) |
37 | .build(passPhrase.toCharArray()) | 37 | .build(passPhrase.toCharArray()) |
38 | .let { PemObject(obj.type, listOf(ENCRYPTED_PROC_TYPE_HEADER, dekInfoHeader(it.iv)), it.encrypt(obj.content)) } | 38 | .let { PemObject(obj.type, listOf(ENCRYPTED_PROC_TYPE_HEADER, dekInfoHeader(it.iv)), it.encrypt(obj.content)) } |
39 | 39 | ||
40 | fun decrypt(obj: PemObject, passPhrase: String?) = | 40 | fun decrypt(obj: PemObject, passPhrase: String?) = |
41 | if (isEncrypted(obj)) { | 41 | if (isEncrypted(obj)) { |
42 | val dekInfo = try { | 42 | val dekInfo = try { |
43 | obj.getPemHeaders() | 43 | obj.getPemHeaders() |
44 | .find { it.name == DEK_INFO_HEADER_KEY }!! | 44 | .find { it.name == DEK_INFO_HEADER_KEY }!! |
45 | .value!! | 45 | .value!! |
46 | .split(',') | 46 | .split(',') |
47 | .let { DekInfo(it[0], Hex.decode(it[1])) } | 47 | .let { DekInfo(it[0], Hex.decode(it[1])) } |
48 | } catch (e: Exception) { | 48 | } catch (e: Exception) { |
49 | throw PEMException("Malformed DEK-Info header.", e) | 49 | throw PEMException("Malformed DEK-Info header.", e) |
50 | } | 50 | } |
51 | 51 | ||
52 | JcePEMDecryptorProviderBuilder() | 52 | JcePEMDecryptorProviderBuilder() |
53 | .setProvider(PROVIDER) | 53 | .setProvider(PROVIDER) |
54 | .build(passPhrase?.toCharArray()) | 54 | .build(passPhrase?.toCharArray()) |
55 | .get(dekInfo.algName) | 55 | .get(dekInfo.algName) |
56 | .decrypt(obj.content, dekInfo.iv) | 56 | .decrypt(obj.content, dekInfo.iv) |
57 | .let { PemObject(obj.type, it) } | 57 | .let { PemObject(obj.type, it) } |
58 | } else { | 58 | } else { |
59 | obj | 59 | obj |
60 | } | 60 | } |
61 | 61 | ||
62 | } | 62 | } |