Skip to content

Commit 3e8f0d8

Browse files
committed
refactor: use string type for convenience
1 parent 7e860fa commit 3e8f0d8

6 files changed

Lines changed: 65 additions & 269 deletions

File tree

aegis/src/main/java/io/delightlabs/aegis/aegis/Aegis.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import io.delightlabs.aegis.protocol.unpack
1717

1818
typealias payload = ByteArray
1919
class Aegis {
20-
var payloads: List<payload> = emptyList()
20+
var payloads: List<String> = emptyList()
2121

2222
companion object {
2323
@RequiresApi(Build.VERSION_CODES.O)
@@ -54,7 +54,7 @@ class Aegis {
5454
return aegis
5555
}
5656
@RequiresApi(Build.VERSION_CODES.O)
57-
fun combineShares(payloads: List<payload>): Secret {
57+
fun combineShares(payloads: List<String>): Secret {
5858
// Pre-verification
5959
if (payloads.isEmpty() || payloads.size < NUM_MINIMUM_SHARE) {
6060
throw Exception("not enough shares")
@@ -87,7 +87,7 @@ class Aegis {
8787
}
8888

8989
@RequiresApi(Build.VERSION_CODES.O)
90-
fun encrypt(cVersion: CipherVersion, secret: Secret, password: ByteArray, salt: ByteArray): Packet {
90+
fun encrypt(cVersion: CipherVersion, secret: Secret, password: ByteArray, salt: ByteArray): String {
9191
val encrypted = cipherEncrypt(cVersion, secret, password, salt)
9292

9393
// Verify
@@ -101,6 +101,6 @@ fun encrypt(cVersion: CipherVersion, secret: Secret, password: ByteArray, salt:
101101
}
102102

103103
@RequiresApi(Build.VERSION_CODES.O)
104-
fun decrypt(secret: Packet, password: ByteArray, salt: ByteArray): Secret {
104+
fun decrypt(secret: String, password: ByteArray, salt: ByteArray): Secret {
105105
return cipherDecrypt(secret, password, salt)
106106
}

aegis/src/main/java/io/delightlabs/aegis/citadel/Citadel.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,15 @@ data class SecretResponse(val secret: String)
3131
class Citadel(private val token: String, private val urls: List<Url>) {
3232
private val forts: List<Fort> = urls.map { Fort(token, it) }
3333
@RequiresApi(Build.VERSION_CODES.O)
34-
suspend fun store(payloads: List<payload>, key: ByteArray) {
34+
suspend fun store(payloads: List<String>, key: ByteArray) {
3535
if (payloads.size != forts.size) {
3636
throw Exception("Payloads and Fort do not match")
3737
}
3838

39-
// val strKey = Base64.getEncoder().encodeToString(key)
40-
4139
val responses = mutableListOf<Deferred<Unit>>()
4240
for (i in payloads.indices) {
43-
// encode to base64
44-
val data = Base64.getEncoder().encodeToString(payloads[i])
45-
4641
val res = coroutineScope {
47-
async { putSecret(forts[i], data, true) }
42+
async { putSecret(forts[i], payloads[i], true) }
4843
}
4944
responses.add(res)
5045
}
@@ -54,7 +49,7 @@ class Citadel(private val token: String, private val urls: List<Url>) {
5449
}
5550

5651
@RequiresApi(Build.VERSION_CODES.O)
57-
suspend fun retrieve(key: ByteArray): List<payload> {
52+
suspend fun retrieve(key: ByteArray): List<String> {
5853
val strKey = Base64.getEncoder().encodeToString(key)
5954

6055
val responses = mutableListOf<Deferred<String>>()
@@ -68,12 +63,12 @@ class Citadel(private val token: String, private val urls: List<Url>) {
6863
}
6964
}
7065

71-
val res = mutableListOf<payload>()
66+
val res = mutableListOf<String>()
7267
responses.forEach { response ->
7368
try {
7469
val r = response.await()
7570
val secretResponse = Gson().fromJson(r, SecretResponse::class.java)
76-
res.add(Base64.getDecoder().decode(secretResponse.secret))
71+
res.add(secretResponse.secret)
7772
} catch (err: Exception) {
7873
println("Error: $err")
7974
}

aegis/src/main/java/io/delightlabs/aegis/crypt/cipher/Cipher.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.delightlabs.aegis.protocol.gson
88
import io.delightlabs.aegis.protocol.pack
99
import io.ktor.http.Url
1010
import java.lang.Exception
11+
import java.util.Base64
1112

1213
enum class Version {
1314
UNSPECIFIED,
@@ -20,7 +21,7 @@ data class CipherPacket (
2021
)
2122

2223
@RequiresApi(Build.VERSION_CODES.O)
23-
fun encrypt(version: Version, plainText: Secret, password: ByteArray, salt: ByteArray): Packet {
24+
fun encrypt(version: Version, plainText: Secret, password: ByteArray, salt: ByteArray): String {
2425
val packet: CipherPacket
2526

2627
when (version) {
@@ -31,14 +32,15 @@ fun encrypt(version: Version, plainText: Secret, password: ByteArray, salt: Byte
3132
else -> throw Exception("unsupported cipher version")
3233
}
3334

34-
35-
36-
return gson.toJson(packet).toByteArray()
35+
val packed = gson.toJson(packet).toByteArray()
36+
return Base64.getEncoder().encodeToString(packed)
3737
}
3838

3939
@RequiresApi(Build.VERSION_CODES.O)
40-
fun decrypt(packet: Packet, password: ByteArray, salt: ByteArray): Secret {
41-
val cipher = gson.fromJson(String(packet), CipherPacket::class.java)
40+
fun decrypt(packet: String, password: ByteArray, salt: ByteArray): Secret {
41+
val decoded = Base64.getDecoder().decode(packet)
42+
43+
val cipher = gson.fromJson(String(decoded), CipherPacket::class.java)
4244

4345
val decrypted: Secret
4446

aegis/src/main/java/io/delightlabs/aegis/protocol/Protocol.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,25 @@ data class Payload(
3232
var packet: Packet
3333
)
3434

35-
fun pack(version: Version, v: Any): ByteArray {
35+
@RequiresApi(Build.VERSION_CODES.O)
36+
fun pack(version: Version, v: Any): String {
3637
val p = Payload(version, ByteArray(0))
3738

3839
val pc = getProtocol(p.protocolVersion) ?: throw Exception("Unsupported protocol")
3940

4041
p.packet = pc.pack(v)
41-
return gson.toJson(p).toByteArray()
42+
43+
val data = gson.toJson(p).toByteArray()
44+
return Base64.getEncoder().encodeToString(data)
4245
}
4346

44-
fun unpack(data: ByteArray): Any {
47+
@RequiresApi(Build.VERSION_CODES.O)
48+
fun unpack(data: String): Any {
49+
val decoded = Base64.getDecoder().decode(data)
50+
4551
val p: Payload
4652
try {
47-
p = gson.fromJson(String(data), Payload::class.java)
53+
p = gson.fromJson(String(decoded), Payload::class.java)
4854
} catch (e: JsonSyntaxException) {
4955
throw Exception("Invalid data format")
5056
}

aegis/src/test/java/io/delightlabs/aegis/citadel/CitadelUnitTest.kt

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,53 @@ import io.delightlabs.aegis.Aegis
44
import io.delightlabs.aegis.crypt.Algorithm
55
import io.delightlabs.aegis.decrypt
66
import io.delightlabs.aegis.encrypt
7+
import io.delightlabs.aegis.protocol.gson
78
import io.delightlabs.aegis.protocol.Version as ProtocolVersion
89
import io.delightlabs.aegis.crypt.cipher.Version as CipherVersion
910
import io.ktor.http.Url
1011
import kotlinx.coroutines.runBlocking
1112
import org.junit.Test
1213

14+
data class TestAegisSecret (
15+
val wallet: List<TestWallet>
16+
)
17+
18+
data class TestWallet (
19+
val address: String,
20+
val name: String,
21+
val publicKey: String,
22+
val encrypted: String
23+
)
24+
1325
class CitadelUnitTest {
1426

1527
@Test
1628
fun `citadel 1`() {
17-
val secret = "MESSAGE_1".toByteArray()
1829
val password = "01234567890123456789012345678901".toByteArray()
30+
val data = "MESSAGE_1".toByteArray()
1931
val salt = "SALT_1".toByteArray()
2032

21-
val encryptedSecret = encrypt(CipherVersion.V1, secret, password, salt)
33+
val encryptedData = encrypt(CipherVersion.V1, data, password, salt)
34+
35+
val aegisSecretData = TestAegisSecret(
36+
listOf(
37+
TestWallet(
38+
"xpla1xxxx",
39+
"name1",
40+
"publicKey1",
41+
encryptedData
42+
)
43+
)
44+
)
45+
46+
val secret = gson.toJson(aegisSecretData).toByteArray()
2247

2348
val aegis = Aegis.dealShares(
2449
ProtocolVersion.V1,
2550
Algorithm.NO_CRYPT,
2651
3,
2752
3,
28-
encryptedSecret,
53+
secret,
2954
)
3055

3156
val token = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ5b3VuZ0BkZWxpZ2h0bGFicy5pbyIsImV4cCI6MTc0Njc4NDczMCwianRpIjoiOGJmYTVkMjgtZjkxZi00YmQ3LTgxYTMtZGM4NjllYWVkNmYyIiwic3NvX3Byb3ZpZGVyIjoiR29vZ2xlIn0.ukJ0gYQsZRE8gktRtzxA6cfPH97zWzwLTmU8DODX9sOSwnLPJ0dFFssTbQm0WE-Cfl95COAAl6WwuQ6NSVEIDg"
@@ -44,8 +69,10 @@ class CitadelUnitTest {
4469

4570
val encryptedRes = Aegis.combineShares(retrieved)
4671

47-
val decryptedRes = decrypt(encryptedRes, password, salt)
48-
assert(decryptedRes.contentEquals(secret))
72+
val resAegisSecret = gson.fromJson(String(encryptedRes), TestAegisSecret::class.java)
73+
74+
val decryptedRes = decrypt(resAegisSecret.wallet[0].encrypted, password, salt)
75+
assert(decryptedRes.contentEquals(data))
4976
}
5077
}
5178
}

0 commit comments

Comments
 (0)