API-style comments and ktlint formatting
Every comment is reduced to its first sentence plus @param, @return and @throws tags. Comment lines: 20040 to 8526. ktlint 1.8 applied with its default (official Kotlin) style across all modules; 262 files reformatted. The 264 remaining ktlint findings are naming and filename rules, which are code changes, and are left alone. Comments and formatting only. 1208 tests pass, counted from the XML. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
8a7f40fb13
commit
2fa430f21c
@@ -9,30 +9,19 @@ import kotlin.test.assertTrue
|
||||
|
||||
/**
|
||||
* The Kotlin account KDF against the vectors pinned from the enclave client.
|
||||
*
|
||||
* Not against the JavaScript or Swift engines: those were pinned from the same
|
||||
* source, and an implementation checked only against our other implementations
|
||||
* inherits whatever we all misread. The cases include a non-ASCII passphrase
|
||||
* and an empty one, which is where a `CharArray` API and a UTF-8 wire format
|
||||
* quietly disagree.
|
||||
*
|
||||
* Passing here says nothing about a phone. The provider on a device is
|
||||
* Conscrypt, not the JDK's, and this engine already has one case. X25519,
|
||||
* that passed twenty-one JVM tests and threw on the first tap on real hardware.
|
||||
* The on-device suite in `:engine-android` is what settles Android.
|
||||
*/
|
||||
class AccountKdfTest {
|
||||
|
||||
private val vectors: JSONObject by lazy {
|
||||
val candidates = listOfNotNull(
|
||||
System.getenv("FLAMENET_ACCOUNT_VECTORS"),
|
||||
"../../engine/test/vectors/account-kdf-v1.json",
|
||||
"../../../flamenet-e2e/test/vectors/account-kdf-v1.json",
|
||||
"../../flamenet-e2e/test/vectors/account-kdf-v1.json",
|
||||
).map { File(it) }
|
||||
val candidates =
|
||||
listOfNotNull(
|
||||
System.getenv("FLAMENET_ACCOUNT_VECTORS"),
|
||||
"../../engine/test/vectors/account-kdf-v1.json",
|
||||
"../../../flamenet-e2e/test/vectors/account-kdf-v1.json",
|
||||
"../../flamenet-e2e/test/vectors/account-kdf-v1.json",
|
||||
).map { File(it) }
|
||||
val file = candidates.firstOrNull { it.exists() }
|
||||
// Fails rather than skips: a vector suite that quietly stops checking is
|
||||
// worth less than none, because it still reports green.
|
||||
// Fails rather than skips: a vector suite that quietly stops checking
|
||||
// is worth less than none, because it still reports green.
|
||||
assertTrue(
|
||||
file != null,
|
||||
"account KDF vectors not found. Looked in: " +
|
||||
@@ -42,8 +31,8 @@ class AccountKdfTest {
|
||||
}
|
||||
|
||||
private fun hex(bytes: ByteArray) = bytes.joinToString("") { "%02x".format(it) }
|
||||
private fun unhex(s: String) =
|
||||
ByteArray(s.length / 2) { s.substring(it * 2, it * 2 + 2).toInt(16).toByte() }
|
||||
|
||||
private fun unhex(s: String) = ByteArray(s.length / 2) { s.substring(it * 2, it * 2 + 2).toInt(16).toByte() }
|
||||
|
||||
@Test
|
||||
fun `derives exactly the published bytes for every case`() {
|
||||
@@ -57,12 +46,13 @@ class AccountKdfTest {
|
||||
|
||||
for (i in 0 until cases.length()) {
|
||||
val c = cases.getJSONObject(i)
|
||||
val out = AccountKdf.derive(
|
||||
passphrase = c.getString("passphrase"),
|
||||
salt = unhex(c.getString("saltHex")),
|
||||
context = c.getString("context"),
|
||||
params = params,
|
||||
)
|
||||
val out =
|
||||
AccountKdf.derive(
|
||||
passphrase = c.getString("passphrase"),
|
||||
salt = unhex(c.getString("saltHex")),
|
||||
context = c.getString("context"),
|
||||
params = params,
|
||||
)
|
||||
assertEquals(c.getString("expectedHex"), hex(out), "case: ${c.getString("name")}")
|
||||
assertEquals(c.getString("expectedB64"), Bytes.b64(out), "case: ${c.getString("name")}")
|
||||
}
|
||||
@@ -78,8 +68,6 @@ class AccountKdfTest {
|
||||
val account = AccountKdf.accountKeySeed(pass, salt)
|
||||
|
||||
// Same passphrase, same salt, same stretch, three unrelated secrets.
|
||||
// If any pair matched, a compromise of one product's key would hand over
|
||||
// another's, which is the entire reason the contexts exist.
|
||||
assertFalse(auth.contentEquals(identity), "auth and identity keys collided")
|
||||
assertFalse(auth.contentEquals(account), "auth and account keys collided")
|
||||
assertFalse(identity.contentEquals(account), "identity and account keys collided")
|
||||
@@ -89,7 +77,5 @@ class AccountKdfTest {
|
||||
// The tie between this KDF and FNID.encode, that a correctly derived seed
|
||||
// also produces the same ADDRESS on every client, belongs here too, and
|
||||
// cannot be written yet: the Kotlin FNID lives on the multi-homing branch
|
||||
// and is not on main. Add it when that lands, because a seed that derives
|
||||
// correctly and encodes differently still gives one account a different
|
||||
// name on every platform.
|
||||
// and is not on main.
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user