diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Base64.java b/app/src/main/java/org/thoughtcrime/securesms/util/Base64.java index 31baaa4bc0..99f545734a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Base64.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Base64.java @@ -22,6 +22,10 @@ public final class Base64 { 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) { try { return org.whispersystems.util.Base64.decode(s); diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt index 91e6a96aa5..f59efe82e4 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt @@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.database.GV2UpdateTransformer import org.thoughtcrime.securesms.database.IsStoryTransformer import org.thoughtcrime.securesms.database.JobDatabase import org.thoughtcrime.securesms.database.KeyValueDatabase +import org.thoughtcrime.securesms.database.KyberKeyTransformer import org.thoughtcrime.securesms.database.LocalMetricsDatabase import org.thoughtcrime.securesms.database.LogDatabase import org.thoughtcrime.securesms.database.MegaphoneDatabase @@ -51,7 +52,7 @@ class SpinnerApplicationContext : ApplicationContext() { linkedMapOf( "signal" to DatabaseConfig( 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 }), "keyvalue" to DatabaseConfig(db = { KeyValueDatabase.getInstance(this).sqlCipherDatabase }), diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/database/KyberKeyTransformer.kt b/app/src/spinner/java/org/thoughtcrime/securesms/database/KyberKeyTransformer.kt new file mode 100644 index 0000000000..ab877a7a90 --- /dev/null +++ b/app/src/spinner/java/org/thoughtcrime/securesms/database/KyberKeyTransformer.kt @@ -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)}" + } +} diff --git a/spinner/lib/src/main/assets/browse.hbs b/spinner/lib/src/main/assets/browse.hbs index 6bb54a3a24..532911df8f 100644 --- a/spinner/lib/src/main/assets/browse.hbs +++ b/spinner/lib/src/main/assets/browse.hbs @@ -47,7 +47,7 @@ {{#each queryResult.rows}}
{{#if (eq this null)}} null {{else}} {{{this}}} {{/if}}{{#if (eq this null)}}null{{else}}{{{this}}}{{/if}}{{#if (eq this null)}} null {{else}} {{{this}}} {{/if}}{{#if (eq this null)}}null{{else}}{{{this}}}{{/if}}