Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 9 additions & 12 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ android {

resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
excludes += 'google/protobuf/descriptor.proto'
}
}

Expand Down Expand Up @@ -86,9 +87,11 @@ android {
String sharedTestDir = 'src/sharedTest/java'
test {
java.srcDirs += sharedTestDir
kotlin.srcDirs += sharedTestDir
}
androidTest {
java.srcDirs += sharedTestDir
kotlin.srcDirs += sharedTestDir
assets.srcDirs += files("$projectDir/schemas".toString())
}
}
Expand Down Expand Up @@ -240,7 +243,6 @@ dependencies {
}
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:${desugarJdkLibsVersion}"
implementation platform("com.google.firebase:firebase-bom:${firebaseBomVersion}")
implementation("com.google.firebase:firebase-perf")
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation "androidx.fragment:fragment-ktx:${fragmentVersion}"
implementation("androidx.activity:activity-ktx:$activity_version")
Expand Down Expand Up @@ -349,12 +351,10 @@ dependencies {
implementation "com.google.firebase:firebase-messaging"
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-crashlytics'

implementation("com.google.protobuf:protobuf-javalite") {
version {
strictly '3.11.0'
}
implementation('com.google.firebase:firebase-perf') {
exclude group: 'com.google.firebase', module: 'protolite-well-known-types'
}
implementation "com.google.protobuf:protobuf-javalite:4.29.3"

implementation "com.android.billingclient:billing-ktx:${billingKtxVersion}"
implementation "com.google.mlkit:barcode-scanning:${mlkitBarcodeVersion}"
Expand Down Expand Up @@ -465,6 +465,7 @@ dependencies {
androidTestImplementation("androidx.test.espresso:espresso-contrib:${espressoVersion}", {
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'org.checkerframework', module: 'checker'
exclude group: 'com.google.protobuf', module: 'protobuf-lite'
})
androidTestImplementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion"
androidTestImplementation "androidx.test.ext:junit:${androidxJunitVersion}"
Expand All @@ -479,11 +480,8 @@ dependencies {
// ML Kit
implementation 'com.google.mlkit:entity-extraction:16.0.0-beta6'

testImplementation("com.google.protobuf:protobuf-javalite") {
version {
strictly '3.11.0'
}
}
testImplementation "com.google.protobuf:protobuf-javalite:4.29.3"
androidTestImplementation "com.google.protobuf:protobuf-javalite:4.29.3"

// SumSub
implementation("com.sumsub.sns:idensic-mobile-sdk:$sumsubVersion") {
Expand Down Expand Up @@ -552,4 +550,3 @@ task syncStrings {
}
}
}

39 changes: 20 additions & 19 deletions app/src/androidTest/java/one/mixin/android/crypto/TipTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,19 @@ import kotlin.time.Duration.Companion.days
class TipTest {
@Test
fun testTipGuard() {
val suite = Tip.newSuiteBn256()
val signer = suite.scalar()
signer.setBytes("0da58ccc3b323d92af281367333f4c120418ed2700de803046947f59707b3479".hexStringToByteArray())
val user = suite.scalar()
assert(signer.publicKey().publicKeyString() == "5HSsddpV8HiKbu9vL3ZB69dtDjaZdQAn8RuL2aK1d1yZknUhBAXNhJLkZfCc2RwTxcaxKonNsXnQJFGcM8jgBztGTHzCA26LgKZWCe74Bw8VJ51FyqCGTysSLnNvkKPT3gh1RhjbyKPEoq3d3DXhJEQJt7GhVgZC82VeMfME9LnYECn9Pui1ta")
val signer =
Tip.newPrivateKeyFromBytes(
"0da58ccc3b323d92af281367333f4c120418ed2700de803046947f59707b3479".hexStringToByteArray(),
)
val signerPublic = Tip.publicKeyFromBytes(signer)
val signerIdentity = Tip.pointPublicKeyString(signerPublic)

val user = Tip.newPrivateKeyFromBytes("p8ogX1BMb-IsRisEBS2kOchXEqjbqxtsXR8J9Bf0AGI".base64RawURLDecode())
val userPublic = Tip.publicKeyFromBytes(user)
val userIdentity = Tip.pointPublicKeyString(userPublic)

user.setBytes("p8ogX1BMb-IsRisEBS2kOchXEqjbqxtsXR8J9Bf0AGI".base64RawURLDecode())
val ephemeral = suite.scalar()
ephemeral.setBytes("-e7M3ZD5k-rW6KQ7GVfV9V9bpmfbUY5y8HiqqBGv8-r46YMRRSlyc-ZKGU3s92gsC9GVuIhgn33I".base64RawURLDecode())
val eBytes = ephemeral.privateKeyBytes()
val ephemeral = Tip.newPrivateKeyFromBytes("-e7M3ZD5k-rW6KQ7GVfV9V9bpmfbUY5y8HiqqBGv8-r46YMRRSlyc-ZKGU3s92gsC9GVuIhgn33I".base64RawURLDecode())
val eBytes = ephemeral

val nonce = 1024L
val nonceBytes = nonce.toBeByteArray()
Expand All @@ -36,21 +39,19 @@ class TipTest {
val graceBytes = grace.toBeByteArray()
println("grace: ${graceBytes.toHex()}")

val sPk = signer.publicKey()
println("sPK: ${sPk.publicKeyString()}")
val uPk = user.publicKey()
val pKeyBytes = uPk.publicKeyBytes()
println("uSk: ${user.privateKeyBytes().toHex()}")
println("uPk: ${uPk.publicKeyString()}")
println("sPK: $signerIdentity")
val pKeyBytes = userPublic
println("uSk: ${user.toHex()}")
println("uPk: $userIdentity")
val msg = pKeyBytes + eBytes + nonceBytes + graceBytes
println("msg: ${msg.toHex()}")

val sig = user.sign(msg)
val sig = Tip.signFromBytes(user, msg)
println("sig: ${sig.toHex()}")

val data =
TipSignData(
identity = uPk.publicKeyString(),
identity = userIdentity,
ephemeral = eBytes.toHex(),
nonce = nonce,
grace = grace,
Expand All @@ -60,10 +61,10 @@ class TipTest {
val json = Gson().toJson(data).toByteArray()
println("json: ${json.toHex()}")

val cipher = Tip.encrypt(sPk, user, json)
val cipher = Tip.encrypt(signerIdentity, user.toHex(), json)
println("cipher: ${cipher.toHex()}")

val plain = Tip.decrypt(uPk, signer, cipher)
val plain = Tip.decrypt(userIdentity, signer.toHex(), cipher)
assert(json.contentEquals(plain))
}

Expand Down
139 changes: 138 additions & 1 deletion app/src/androidTest/java/one/mixin/android/db/BaseMigrationTest.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,65 @@
package one.mixin.android.db

import androidx.room.migration.Migration
import androidx.room.testing.MigrationTestHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import androidx.test.platform.app.InstrumentationRegistry
import one.mixin.android.Constants
import one.mixin.android.Constants.DataBase.CURRENT_VERSION
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_15_16
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_16_17
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_17_18
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_18_19
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_19_20
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_20_21
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_21_22
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_22_23
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_23_24
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_24_25
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_25_26
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_26_27
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_27_28
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_28_29
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_29_30
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_30_31
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_31_32
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_32_33
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_33_34
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_34_35
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_35_36
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_36_37
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_37_38
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_38_39
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_39_40
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_40_41
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_41_42
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_42_43
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_43_44
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_44_45
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_45_46
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_46_47
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_47_48
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_48_49
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_49_50
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_50_51
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_51_52
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_52_53
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_53_54
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_54_55
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_55_56
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_56_57
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_57_58
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_58_59
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_59_60
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_60_61
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_61_62
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_62_63
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_63_64
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_64_65
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_65_66
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_66_67
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_67_68
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_68_69
import org.junit.After
import org.junit.Before
import org.junit.Rule
Expand All @@ -14,10 +70,68 @@ open class BaseMigrationTest {
val migrationTestHelper =
MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
MixinDatabase::class.java.canonicalName,
requireNotNull(MixinDatabase::class.java.canonicalName),
FrameworkSQLiteOpenHelperFactory(),
)

protected val allMixinMigrations =
arrayOf<Migration>(
MIGRATION_15_16,
MIGRATION_16_17,
MIGRATION_17_18,
MIGRATION_18_19,
MIGRATION_19_20,
MIGRATION_20_21,
MIGRATION_21_22,
MIGRATION_22_23,
MIGRATION_23_24,
MIGRATION_24_25,
MIGRATION_25_26,
MIGRATION_26_27,
MIGRATION_27_28,
MIGRATION_28_29,
MIGRATION_29_30,
MIGRATION_30_31,
MIGRATION_31_32,
MIGRATION_32_33,
MIGRATION_33_34,
MIGRATION_34_35,
MIGRATION_35_36,
MIGRATION_36_37,
MIGRATION_37_38,
MIGRATION_38_39,
MIGRATION_39_40,
MIGRATION_40_41,
MIGRATION_41_42,
MIGRATION_42_43,
MIGRATION_43_44,
MIGRATION_44_45,
MIGRATION_45_46,
MIGRATION_46_47,
MIGRATION_47_48,
MIGRATION_48_49,
MIGRATION_49_50,
MIGRATION_50_51,
MIGRATION_51_52,
MIGRATION_52_53,
MIGRATION_53_54,
MIGRATION_54_55,
MIGRATION_55_56,
MIGRATION_56_57,
MIGRATION_57_58,
MIGRATION_58_59,
MIGRATION_59_60,
MIGRATION_60_61,
MIGRATION_61_62,
MIGRATION_62_63,
MIGRATION_63_64,
MIGRATION_64_65,
MIGRATION_65_66,
MIGRATION_66_67,
MIGRATION_67_68,
MIGRATION_68_69,
)

@Before
fun setUp() {
}
Expand All @@ -31,6 +145,29 @@ open class BaseMigrationTest {
db.close()
}

protected fun createDatabase(version: Int, dbName: String = Constants.DataBase.DB_NAME) {
val db = migrationTestHelper.createDatabase(dbName, version)
db.close()
}

protected fun runMixinMigrationsAndValidate(
fromVersion: Int,
toVersion: Int = CURRENT_VERSION,
) {
val migrations =
allMixinMigrations
.filter { it.startVersion >= fromVersion && it.endVersion <= toVersion }
.sortedBy { it.startVersion }
.toTypedArray()

migrationTestHelper.runMigrationsAndValidate(
Constants.DataBase.DB_NAME,
toVersion,
true,
*migrations,
)
}

fun create16() {
val db = migrationTestHelper.createDatabase(Constants.DataBase.DB_NAME, 16)
db.close()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package one.mixin.android.db

import one.mixin.android.Constants.DataBase.CURRENT_VERSION
import one.mixin.android.Constants.DataBase.MINI_VERSION
import org.junit.Test

class MigrationCurrentVersionTest : BaseMigrationTest() {
@Test
fun migrate_all_historical_versions_to_current() {
for (fromVersion in MINI_VERSION until CURRENT_VERSION) {
try {
createDatabase(fromVersion)
runMixinMigrationsAndValidate(fromVersion)
} catch (t: Throwable) {
throw AssertionError("Failed to migrate MixinDatabase from $fromVersion to $CURRENT_VERSION", t)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package one.mixin.android.db

import androidx.room.testing.MigrationTestHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import androidx.test.platform.app.InstrumentationRegistry
import one.mixin.android.Constants.DataBase.PERPS_DB_NAME
import org.junit.Rule
import org.junit.Test

class PerpsMigrationTest {
@Suppress("DEPRECATION")
@get:Rule
val migrationTestHelper =
MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
requireNotNull(PerpsDatabase::class.java.canonicalName),
FrameworkSQLiteOpenHelperFactory(),
)

@Test
fun migrate_1_2() {
val db = migrationTestHelper.createDatabase(PERPS_DB_NAME, 1)
db.close()

migrationTestHelper.runMigrationsAndValidate(
PERPS_DB_NAME,
2,
true,
PerpsDatabase.MIGRATION_1_2,
)
}
}
Loading
Loading