Add Spinner support for kyber keys.
This commit is contained in:
parent
c359207f1f
commit
500ae0c72e
6 changed files with 34 additions and 6 deletions
|
@ -22,6 +22,10 @@ public final class Base64 {
|
||||||
return org.whispersystems.util.Base64.encodeBytes(source);
|
return org.whispersystems.util.Base64.encodeBytes(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static @NonNull String encodeBytesWithoutPadding(@NonNull byte[] source) {
|
||||||
|
return org.whispersystems.util.Base64.encodeBytesWithoutPadding(source);
|
||||||
|
}
|
||||||
|
|
||||||
public static @NonNull byte[] decodeOrThrow(@NonNull String s) {
|
public static @NonNull byte[] decodeOrThrow(@NonNull String s) {
|
||||||
try {
|
try {
|
||||||
return org.whispersystems.util.Base64.decode(s);
|
return org.whispersystems.util.Base64.decode(s);
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.database.GV2UpdateTransformer
|
||||||
import org.thoughtcrime.securesms.database.IsStoryTransformer
|
import org.thoughtcrime.securesms.database.IsStoryTransformer
|
||||||
import org.thoughtcrime.securesms.database.JobDatabase
|
import org.thoughtcrime.securesms.database.JobDatabase
|
||||||
import org.thoughtcrime.securesms.database.KeyValueDatabase
|
import org.thoughtcrime.securesms.database.KeyValueDatabase
|
||||||
|
import org.thoughtcrime.securesms.database.KyberKeyTransformer
|
||||||
import org.thoughtcrime.securesms.database.LocalMetricsDatabase
|
import org.thoughtcrime.securesms.database.LocalMetricsDatabase
|
||||||
import org.thoughtcrime.securesms.database.LogDatabase
|
import org.thoughtcrime.securesms.database.LogDatabase
|
||||||
import org.thoughtcrime.securesms.database.MegaphoneDatabase
|
import org.thoughtcrime.securesms.database.MegaphoneDatabase
|
||||||
|
@ -51,7 +52,7 @@ class SpinnerApplicationContext : ApplicationContext() {
|
||||||
linkedMapOf(
|
linkedMapOf(
|
||||||
"signal" to DatabaseConfig(
|
"signal" to DatabaseConfig(
|
||||||
db = { SignalDatabase.rawDatabase },
|
db = { SignalDatabase.rawDatabase },
|
||||||
columnTransformers = listOf(MessageBitmaskColumnTransformer, GV2Transformer, GV2UpdateTransformer, IsStoryTransformer, TimestampTransformer, ProfileKeyCredentialTransformer, MessageRangesTransformer)
|
columnTransformers = listOf(MessageBitmaskColumnTransformer, GV2Transformer, GV2UpdateTransformer, IsStoryTransformer, TimestampTransformer, ProfileKeyCredentialTransformer, MessageRangesTransformer, KyberKeyTransformer)
|
||||||
),
|
),
|
||||||
"jobmanager" to DatabaseConfig(db = { JobDatabase.getInstance(this).sqlCipherDatabase }),
|
"jobmanager" to DatabaseConfig(db = { JobDatabase.getInstance(this).sqlCipherDatabase }),
|
||||||
"keyvalue" to DatabaseConfig(db = { KeyValueDatabase.getInstance(this).sqlCipherDatabase }),
|
"keyvalue" to DatabaseConfig(db = { KeyValueDatabase.getInstance(this).sqlCipherDatabase }),
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023 Signal Messenger, LLC
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.thoughtcrime.securesms.database
|
||||||
|
|
||||||
|
import android.database.Cursor
|
||||||
|
import org.signal.core.util.requireBlob
|
||||||
|
import org.signal.libsignal.protocol.state.KyberPreKeyRecord
|
||||||
|
import org.signal.spinner.ColumnTransformer
|
||||||
|
import org.thoughtcrime.securesms.util.Base64
|
||||||
|
|
||||||
|
object KyberKeyTransformer : ColumnTransformer {
|
||||||
|
override fun matches(tableName: String?, columnName: String): Boolean {
|
||||||
|
return tableName == KyberPreKeyTable.TABLE_NAME && columnName == KyberPreKeyTable.SERIALIZED
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
|
||||||
|
val record = KyberPreKeyRecord(cursor.requireBlob(columnName))
|
||||||
|
return "ID: ${record.id}\nTimestamp: ${record.timestamp}\nPublicKey: ${Base64.encodeBytesWithoutPadding(record.keyPair.publicKey.serialize())}\nPrivateKey: ${Base64.encodeBytesWithoutPadding(record.keyPair.secretKey.serialize())}\nSignature: ${Base64.encodeBytesWithoutPadding(record.signature)}"
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,7 +47,7 @@
|
||||||
{{#each queryResult.rows}}
|
{{#each queryResult.rows}}
|
||||||
<tr>
|
<tr>
|
||||||
{{#each this}}
|
{{#each this}}
|
||||||
<td><pre>{{#if (eq this null)}} <em class="null">null</em> {{else}} {{{this}}} {{/if}}</pre></td>
|
<td><pre>{{#if (eq this null)}}<em class="null">null</em>{{else}}{{{this}}}{{/if}}</pre></td>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
{{#each queryResult.rows}}
|
{{#each queryResult.rows}}
|
||||||
<tr>
|
<tr>
|
||||||
{{#each this}}
|
{{#each this}}
|
||||||
<td><pre>{{#if (eq this null)}} <em class="null">null</em> {{else}} {{{this}}} {{/if}}</pre></td>
|
<td><pre>{{#if (eq this null)}}<em class="null">null</em>{{else}}{{{this}}}{{/if}}</pre></td>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
|
@ -144,7 +144,7 @@ internal class SpinnerServer(
|
||||||
}
|
}
|
||||||
|
|
||||||
val query = "select * from $table limit $pageSize offset ${pageSize * pageIndex}"
|
val query = "select * from $table limit $pageSize offset ${pageSize * pageIndex}"
|
||||||
val queryResult = dbConfig.db().query(query).use { it.toQueryResult(columnTransformers = dbConfig.columnTransformers) }
|
val queryResult = dbConfig.db().query(query).use { it.toQueryResult(columnTransformers = dbConfig.columnTransformers, table = table) }
|
||||||
|
|
||||||
return renderTemplate(
|
return renderTemplate(
|
||||||
"browse",
|
"browse",
|
||||||
|
@ -264,14 +264,14 @@ internal class SpinnerServer(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Cursor.toQueryResult(queryStartTimeNanos: Long = 0, columnTransformers: List<ColumnTransformer> = emptyList()): QueryResult {
|
private fun Cursor.toQueryResult(queryStartTimeNanos: Long = 0, columnTransformers: List<ColumnTransformer> = emptyList(), table: String? = null): QueryResult {
|
||||||
val numColumns = this.columnCount
|
val numColumns = this.columnCount
|
||||||
val columns = mutableListOf<String>()
|
val columns = mutableListOf<String>()
|
||||||
val transformers = mutableListOf<ColumnTransformer>()
|
val transformers = mutableListOf<ColumnTransformer>()
|
||||||
|
|
||||||
for (i in 0 until numColumns) {
|
for (i in 0 until numColumns) {
|
||||||
val columnName = getColumnName(i)
|
val columnName = getColumnName(i)
|
||||||
val customTransformer: ColumnTransformer? = columnTransformers.find { it.matches(null, columnName) }
|
val customTransformer: ColumnTransformer? = columnTransformers.find { it.matches(table, columnName) }
|
||||||
|
|
||||||
columns += if (customTransformer != null) {
|
columns += if (customTransformer != null) {
|
||||||
"$columnName *"
|
"$columnName *"
|
||||||
|
|
Loading…
Add table
Reference in a new issue