From 176d0ae8e4cbdea0c14a6b9d77e56786c1284666 Mon Sep 17 00:00:00 2001 From: mimi89999 Date: Mon, 23 Mar 2026 11:20:17 +0100 Subject: [PATCH] Simplify map key sorting in CBOR encoder --- app/src/main/java/pl/lebihan/authnkey/Cbor.kt | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/pl/lebihan/authnkey/Cbor.kt b/app/src/main/java/pl/lebihan/authnkey/Cbor.kt index 8c830bf..d9b7f51 100644 --- a/app/src/main/java/pl/lebihan/authnkey/Cbor.kt +++ b/app/src/main/java/pl/lebihan/authnkey/Cbor.kt @@ -13,7 +13,7 @@ class CborEncoder { val map = CborMapEncoder() map.block() writeHeader(5, map.entries.size) - sortCanonical(map.entries).forEach { out.addAll(it) } + sortCanonical(map.entries).forEach { (k, v) -> out.addAll(k); out.addAll(v) } } fun toByteArray(): ByteArray = out.toByteArray() @@ -24,14 +24,14 @@ class CborEncoder { } class CborMapEncoder { - internal val entries = mutableListOf>() + internal val entries = mutableListOf() infix fun Int.to(value: Any?) { - entries.add(encodeInt(this) + encodeValue(value)) + entries.add(encodeInt(this) to encodeValue(value)) } infix fun String.to(value: Any?) { - entries.add(encodeText(this) + encodeValue(value)) + entries.add(encodeText(this) to encodeValue(value)) } fun map(block: CborMapEncoder.() -> Unit): CborRaw { @@ -39,7 +39,7 @@ class CborMapEncoder { nested.block() val bytes = mutableListOf() bytes.addAll(encodeHeader(5, nested.entries.size)) - sortCanonical(nested.entries).forEach { bytes.addAll(it) } + sortCanonical(nested.entries).forEach { (k, v) -> bytes.addAll(k); bytes.addAll(v) } return CborRaw(bytes) } @@ -67,7 +67,7 @@ class CborArrayEncoder { nested.block() val bytes = mutableListOf() bytes.addAll(encodeHeader(5, nested.entries.size)) - sortCanonical(nested.entries).forEach { bytes.addAll(it) } + sortCanonical(nested.entries).forEach { (k, v) -> bytes.addAll(k); bytes.addAll(v) } items.add(bytes) } } @@ -75,13 +75,15 @@ class CborArrayEncoder { @JvmInline value class CborRaw(val bytes: List) -private fun sortCanonical(entries: List>): List> { +private typealias RawMapEntry = Pair, List> + +private fun sortCanonical(entries: List): List { return entries.sortedWith { a, b -> - val ka = CborDecoder.measureFirstValue(a.toByteArray()) - val kb = CborDecoder.measureFirstValue(b.toByteArray()) - if (ka != kb) ka - kb - else (0 until ka).map { - (a[it].toInt() and 0xFF) - (b[it].toInt() and 0xFF) + val ka = a.first + val kb = b.first + if (ka.size != kb.size) ka.size - kb.size + else ka.indices.map { + (ka[it].toInt() and 0xFF) - (kb[it].toInt() and 0xFF) }.firstOrNull { it != 0 } ?: 0 } }