Add Spinner support for kyber keys.

This commit is contained in:
Greyson Parrelli 2023-07-08 11:21:12 -04:00 committed by Clark Chen
parent c359207f1f
commit 500ae0c72e
6 changed files with 34 additions and 6 deletions

View file

@ -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);

View file

@ -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 }),

View file

@ -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)}"
}
}

View file

@ -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}}

View file

@ -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}}

View file

@ -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 *"