diff --git a/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/export/ScheduleComponents.kt b/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/export/ScheduleComponents.kt index 557a5a3c2..3201ff540 100644 --- a/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/export/ScheduleComponents.kt +++ b/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/export/ScheduleComponents.kt @@ -40,9 +40,9 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedToggleButton +import androidx.compose.material3.OutlinedToggleButtonDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.ToggleButtonDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect @@ -115,7 +115,7 @@ internal fun IntervalPicker( 0 -> ButtonGroupDefaults.connectedLeadingButtonShapes() else -> ButtonGroupDefaults.connectedTrailingButtonShapes() }, - colors = ToggleButtonDefaults.outlinedToggleButtonColors( + colors = OutlinedToggleButtonDefaults.outlinedToggleButtonColors( checkedContainerColor = MaterialTheme.colorScheme.primaryContainer, checkedContentColor = MaterialTheme.colorScheme.onPrimaryContainer, ) diff --git a/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/import/MapColumnsContent.kt b/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/import/MapColumnsContent.kt index c816cb200..99c1c1879 100644 --- a/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/import/MapColumnsContent.kt +++ b/feature/backup/src/main/kotlin/de/davis/keygo/feature/backup/presentation/import/MapColumnsContent.kt @@ -13,6 +13,7 @@ import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.TableChart import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenu import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults diff --git a/feature/item/core/src/main/kotlin/de/davis/keygo/feature/item/core/presentation/component/KeyGoFormSuggestionField.kt b/feature/item/core/src/main/kotlin/de/davis/keygo/feature/item/core/presentation/component/KeyGoFormSuggestionField.kt index 2496dd1a1..693d25a00 100644 --- a/feature/item/core/src/main/kotlin/de/davis/keygo/feature/item/core/presentation/component/KeyGoFormSuggestionField.kt +++ b/feature/item/core/src/main/kotlin/de/davis/keygo/feature/item/core/presentation/component/KeyGoFormSuggestionField.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.text.input.clearText import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.ExposedDropdownMenu import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults diff --git a/feature/item/create/src/main/kotlin/de/davis/keygo/feature/item/create/presentation/component/VaultDropDownMenu.kt b/feature/item/create/src/main/kotlin/de/davis/keygo/feature/item/create/presentation/component/VaultDropDownMenu.kt index 93fd097eb..93bb1c1e6 100644 --- a/feature/item/create/src/main/kotlin/de/davis/keygo/feature/item/create/presentation/component/VaultDropDownMenu.kt +++ b/feature/item/create/src/main/kotlin/de/davis/keygo/feature/item/create/presentation/component/VaultDropDownMenu.kt @@ -7,6 +7,7 @@ import androidx.compose.material.icons.filled.Check import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.ExposedDropdownMenu import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults diff --git a/feature/vault/src/main/kotlin/de/davis/keygo/feature/vault/presentation/components/MoveVaultDialog.kt b/feature/vault/src/main/kotlin/de/davis/keygo/feature/vault/presentation/components/MoveVaultDialog.kt index 616b988f8..adc6a0fa7 100644 --- a/feature/vault/src/main/kotlin/de/davis/keygo/feature/vault/presentation/components/MoveVaultDialog.kt +++ b/feature/vault/src/main/kotlin/de/davis/keygo/feature/vault/presentation/components/MoveVaultDialog.kt @@ -16,6 +16,7 @@ import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.ExposedDropdownMenu import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3410ef27..52a063036 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,44 +2,44 @@ compileSdk = "37" minSdk = "26" -agp = "9.2.1" +agp = "9.3.2" autofill = "1.3.0" accompanist = "0.37.3" camera = "1.6.1" credentials = "1.6.0" gmsMlkitBarcodeScanning = "18.3.1" -okhttp = "5.4.0" +okhttp = "5.5.0" zxingBarcodeScanning = "3.5.4" -kotlin = "2.3.20" +kotlin = "2.4.10" kotlinSerializationJson = "1.11.0" -collectionsImmutable = "0.5.0" +collectionsImmutable = "0.5.1" coreKtx = "1.19.0" junitVersion = "1.3.0" espressoCore = "3.7.0" -lifecycleRuntimeKtx = "2.10.0" +lifecycleRuntimeKtx = "2.11.0" activityCompose = "1.13.0" -composeBom = "2026.05.01" +composeBom = "2026.08.00" mockk = "1.14.11" semver = "0.2.5" -koinBOM = "4.2.1" -koin-plugin = "1.0.0" -room3 = "3.0.0" -sqlite = "2.6.2" -ksp = "2.3.6" +koinBOM = "4.2.2" +koin-plugin = "1.1.0" +room3 = "3.0.1" +sqlite = "2.7.0" +ksp = "2.3.11" datastore = "1.2.1" protobuf = "0.10.0" -protoc = "4.35.0" +protoc = "4.36.0" coroutines = "1.11.0" bcrypt = "0.10.2" biometric = "1.4.0-alpha07" navigation = "2.9.8" kotlinpoet = "2.3.0" -jna = "5.19.0" +jna = "5.19.1" nbvcxz = "1.5.1" passGen = "0.1.0-beta" robolectric = "4.16.1" emvnfccard = "3.1.0" -aboutlibraries = "14.2.1" +aboutlibraries = "15.1.1" work = "2.11.2" splashscreen = "1.2.0" @@ -67,7 +67,7 @@ androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -androidx-material3 = { group = "androidx.compose.material3", name = "material3", version = "1.5.0-alpha24" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3", version = "1.5.0-alpha26" } androidx-material3-adaptive-navigation = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation" } androidx-material3-adaptive-navigation-suite = { group = "androidx.compose.material3", name = "material3-adaptive-navigation-suite" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index b1b8ef56b..eddabd2ee 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9937dae91..c56b367ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index b9bb139f7..249efbb03 100755 --- a/gradlew +++ b/gradlew @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: diff --git a/gradlew.bat b/gradlew.bat index 24c62d56f..a51ec4f58 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,7 +19,7 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## @@ -72,7 +72,7 @@ echo location of your Java installation. 1>&2 -@rem Execute Gradle +@rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel diff --git a/rust/rust-code/Cargo.lock b/rust/rust-code/Cargo.lock index 90040b104..9719e585b 100644 --- a/rust/rust-code/Cargo.lock +++ b/rust/rust-code/Cargo.lock @@ -25,23 +25,23 @@ dependencies = [ [[package]] name = "aes-gcm-siv" -version = "0.12.0-rc.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d2f4cb729b8b58144551d208643a39915a039ca78659e7cec9c80789d1695b5" +checksum = "4c32325128cb24de2a2d14d92da7569dae7073f9e47334521d494747fa94d902" dependencies = [ "aead", "aes", "cipher", "ctr", + "ctutils", "polyval", - "subtle", ] [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -70,19 +70,6 @@ dependencies = [ "password-hash", ] -[[package]] -name = "askama" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" -dependencies = [ - "askama_derive 0.14.0", - "itoa", - "percent-encoding", - "serde", - "serde_json", -] - [[package]] name = "askama" version = "0.16.0" @@ -96,30 +83,13 @@ dependencies = [ "serde_json", ] -[[package]] -name = "askama_derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" -dependencies = [ - "askama_parser 0.14.0", - "basic-toml", - "memchr", - "proc-macro2", - "quote", - "rustc-hash", - "serde", - "serde_derive", - "syn 2.0.119", -] - [[package]] name = "askama_derive" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1c7065972a130eafa84215f21352ae15b4a7393da48c1f5e103904490736738" dependencies = [ - "askama_parser 0.16.0", + "askama_parser", "basic-toml", "glob", "memchr", @@ -137,19 +107,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e23b1d2c4bd39a41971f6124cef4cc6fd0540913ecb90919b69ab3bbe44ae1a" dependencies = [ - "askama_derive 0.16.0", -] - -[[package]] -name = "askama_parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" -dependencies = [ - "memchr", - "serde", - "serde_derive", - "winnow 0.7.15", + "askama_derive", ] [[package]] @@ -162,7 +120,7 @@ dependencies = [ "serde", "serde_derive", "unicode-ident", - "winnow 1.0.4", + "winnow", ] [[package]] @@ -180,13 +138,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.91" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -209,9 +167,9 @@ checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "base64ct" @@ -291,15 +249,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - [[package]] name = "cargo-platform" version = "0.3.3" @@ -310,20 +259,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform 0.1.9", - "semver", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "cargo_metadata" version = "0.23.1" @@ -331,7 +266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", - "cargo-platform 0.3.3", + "cargo-platform", "semver", "serde", "serde_json", @@ -395,9 +330,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.5" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301b56658598e48f3648647ac6fc887be7e7108eddfa4e9b63fcf3ec58c0cadf" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -405,9 +340,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.5" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a65403d1a1bd28f7dc68eb8506e8874808ee5eecb59298de588e2e1407a078" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstyle", "clap_lex", @@ -423,7 +358,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -444,11 +379,17 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "coset" @@ -592,9 +533,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] name = "der" @@ -602,7 +543,7 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] @@ -620,7 +561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", + "const-oid 0.9.6", "crypto-common 0.1.6", "subtle", ] @@ -632,7 +573,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.1", + "const-oid 0.10.2", "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -643,7 +586,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -692,9 +635,9 @@ dependencies = [ [[package]] name = "either" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "elliptic-curve" @@ -793,15 +736,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] - [[package]] name = "fs-err" version = "3.3.1" @@ -813,27 +747,27 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-io" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-task" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -930,11 +864,11 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hkdf" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" dependencies = [ - "hmac", + "hmac 0.13.0", ] [[package]] @@ -946,6 +880,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + [[package]] name = "hybrid-array" version = "0.4.14" @@ -957,9 +900,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", @@ -971,9 +914,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -984,9 +927,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -998,16 +941,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -1018,15 +962,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", @@ -1105,9 +1049,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -1122,8 +1066,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "uniffi 0.31.2", - "uniffi 0.32.0", + "uniffi", "uuid", ] @@ -1156,7 +1099,7 @@ dependencies = [ "rand 0.10.2", "serde", "serde_json", - "sha2 0.10.9", + "sha2 0.11.0", "thiserror", "totp-rs", "url", @@ -1178,15 +1121,15 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "memchr" @@ -1294,7 +1237,7 @@ dependencies = [ "mockall", "p256", "passkey-types", - "rand 0.8.7", + "rand 0.8.8", "tokio", ] @@ -1333,10 +1276,10 @@ dependencies = [ "coset", "data-encoding", "getrandom 0.2.17", - "hmac", + "hmac 0.12.1", "indexmap", "p256", - "rand 0.8.7", + "rand 0.8.8", "serde", "serde_json", "sha2 0.10.9", @@ -1406,9 +1349,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -1493,9 +1436,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", "rand_chacha", @@ -1552,9 +1495,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -1573,7 +1516,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -1689,7 +1632,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -1727,13 +1670,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -1880,9 +1823,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -1930,29 +1873,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -1967,21 +1910,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - [[package]] name = "toml" version = "1.1.4+spec-1.1.0" @@ -1991,19 +1919,10 @@ dependencies = [ "indexmap", "serde_core", "serde_spanned", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 1.0.4", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", + "winnow", ] [[package]] @@ -2021,7 +1940,7 @@ version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.4", + "winnow", ] [[package]] @@ -2032,18 +1951,19 @@ checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "totp-rs" -version = "5.7.2" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e69a15e21b2ff22c415446983978bded3244195f17d59cb113551c1e806f91" +checksum = "49d0f9b7aa5def86d3a8d8ba926fe8c1990924dd715d2b5fc54a4aa3788c11c1" dependencies = [ "base32", "constant_time_eq", - "hmac", + "hmac 0.13.0", + "percent-encoding", + "rand 0.10.2", "serde", "sha1", - "sha2 0.10.9", + "sha2 0.11.0", "url", - "urlencoding", "zeroize", ] @@ -2059,22 +1979,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "uniffi" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" -dependencies = [ - "anyhow", - "camino", - "cargo_metadata 0.19.2", - "clap", - "uniffi_bindgen 0.31.2", - "uniffi_core 0.31.2", - "uniffi_macros 0.31.2", - "uniffi_pipeline 0.31.2", -] - [[package]] name = "uniffi" version = "0.32.0" @@ -2082,38 +1986,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a782a48d72cfd7a2d65cfc7c691dbf5375c43104b3c195f7eccc716dcc3540c8" dependencies = [ "anyhow", - "cargo_metadata 0.23.1", - "uniffi_bindgen 0.32.0", - "uniffi_build", - "uniffi_core 0.32.0", - "uniffi_macros 0.32.0", - "uniffi_pipeline 0.32.0", -] - -[[package]] -name = "uniffi_bindgen" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" -dependencies = [ - "anyhow", - "askama 0.14.0", "camino", - "cargo_metadata 0.19.2", - "fs-err 2.11.0", - "glob", - "goblin", - "heck", - "indexmap", - "once_cell", - "serde", - "tempfile", - "textwrap", - "toml 0.9.12+spec-1.1.0", - "uniffi_internal_macros 0.31.2", - "uniffi_meta 0.31.2", - "uniffi_pipeline 0.31.2", - "uniffi_udl 0.31.2", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_build", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", ] [[package]] @@ -2123,10 +2003,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533b0312c73e3b54eb78a4b257ceae390962dd4767995778309a74644643f9ac" dependencies = [ "anyhow", - "askama 0.16.0", + "askama", "camino", - "cargo_metadata 0.23.1", - "fs-err 3.3.1", + "cargo_metadata", + "fs-err", "glob", "goblin", "heck", @@ -2135,11 +2015,11 @@ dependencies = [ "serde", "tempfile", "textwrap", - "toml 1.1.4+spec-1.1.0", - "uniffi_internal_macros 0.32.0", - "uniffi_meta 0.32.0", - "uniffi_pipeline 0.32.0", - "uniffi_udl 0.32.0", + "toml", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", ] [[package]] @@ -2150,20 +2030,7 @@ checksum = "763a19ad720fce8c9a98576e04c0ccc5d2d155aa6b953c864587073292c7ccfc" dependencies = [ "anyhow", "camino", - "uniffi_bindgen 0.32.0", -] - -[[package]] -name = "uniffi_core" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" -dependencies = [ - "anyhow", - "async-compat", - "bytes", - "once_cell", - "static_assertions", + "uniffi_bindgen", ] [[package]] @@ -2173,24 +2040,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e32e261c5b0dfaba6488f536e71957dddd6b1a498ac7eb791bee56b60a086be" dependencies = [ "anyhow", + "async-compat", "bytes", "once_cell", "static_assertions", ] -[[package]] -name = "uniffi_internal_macros" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" -dependencies = [ - "anyhow", - "indexmap", - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "uniffi_internal_macros" version = "0.32.0" @@ -2204,23 +2059,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "uniffi_macros" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" -dependencies = [ - "camino", - "fs-err 2.11.0", - "once_cell", - "proc-macro2", - "quote", - "serde", - "syn 2.0.119", - "toml 0.9.12+spec-1.1.0", - "uniffi_meta 0.31.2", -] - [[package]] name = "uniffi_macros" version = "0.32.0" @@ -2228,26 +2066,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330be6770532e86320df31f54c70bb0be67588594e8e77fa56e9083a3fed5d0d" dependencies = [ "camino", - "fs-err 3.3.1", + "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn 2.0.119", - "toml 1.1.4+spec-1.1.0", - "uniffi_meta 0.32.0", -] - -[[package]] -name = "uniffi_meta" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" -dependencies = [ - "anyhow", - "siphasher", - "uniffi_internal_macros 0.31.2", - "uniffi_pipeline 0.31.2", + "toml", + "uniffi_meta", ] [[package]] @@ -2258,21 +2084,8 @@ checksum = "78de021f5547e56ab16c665a49d67d4fd3d31e77422f7739a2e9359d328cd9e7" dependencies = [ "anyhow", "siphasher", - "uniffi_internal_macros 0.32.0", - "uniffi_pipeline 0.32.0", -] - -[[package]] -name = "uniffi_pipeline" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "tempfile", - "uniffi_internal_macros 0.31.2", + "uniffi_internal_macros", + "uniffi_pipeline", ] [[package]] @@ -2285,19 +2098,7 @@ dependencies = [ "heck", "indexmap", "tempfile", - "uniffi_internal_macros 0.32.0", -] - -[[package]] -name = "uniffi_udl" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" -dependencies = [ - "anyhow", - "textwrap", - "uniffi_meta 0.31.2", - "weedle2", + "uniffi_internal_macros", ] [[package]] @@ -2308,7 +2109,7 @@ checksum = "a6e57996bc58009cc29bf04845d627ae313c2547b87171c1c349d6c51a1656c0" dependencies = [ "anyhow", "textwrap", - "uniffi_meta 0.32.0", + "uniffi_meta", "weedle2", ] @@ -2335,12 +2136,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2349,9 +2144,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +checksum = "f053576934f05a761a402421fbbe3d425d9366f75f978806a037b3ca481abecc" dependencies = [ "getrandom 0.4.3", "js-sys", @@ -2373,9 +2168,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -2386,9 +2181,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2396,9 +2191,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", @@ -2409,9 +2204,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] @@ -2440,15 +2235,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "1.0.4" @@ -2460,9 +2246,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "yoke" @@ -2489,18 +2275,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.55" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.55" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", @@ -2550,9 +2336,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -2561,9 +2347,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -2572,13 +2358,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] diff --git a/rust/rust-code/bindings/Cargo.toml b/rust/rust-code/bindings/Cargo.toml index 3bf8429af..39105c0c1 100644 --- a/rust/rust-code/bindings/Cargo.toml +++ b/rust/rust-code/bindings/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib", "staticlib"] lib = { path = "../lib" } thiserror = "2.0.18" tokio = { version = "1.48.0", features = ["rt", "rt-multi-thread"] } -uniffi = { version = "0.31.1", features = ["tokio", "cli"] } +uniffi = { version = "0.32", features = ["tokio", "cli"] } uuid = "1.23.1" [build-dependencies] diff --git a/rust/rust-code/bindings/src/totp.rs b/rust/rust-code/bindings/src/totp.rs index c9f676e4b..ae6558464 100644 --- a/rust/rust-code/bindings/src/totp.rs +++ b/rust/rust-code/bindings/src/totp.rs @@ -23,12 +23,19 @@ impl From for lib::totp::Algorithm { } } -impl From for Algorithm { - fn from(value: lib::totp::Algorithm) -> Self { +impl TryFrom for Algorithm { + type Error = TotpError; + + /// `totp_rs::Algorithm` is `#[non_exhaustive]`, so a variant this binding + /// does not expose stays representable no matter what we match on. Reaching + /// one means the input named an algorithm we cannot hand to Kotlin, which + /// is an error to report, not a reason to unwind across the FFI boundary. + fn try_from(value: lib::totp::Algorithm) -> Result { match value { - lib::totp::Algorithm::SHA1 => Algorithm::Sha1, - lib::totp::Algorithm::SHA256 => Algorithm::Sha256, - lib::totp::Algorithm::SHA512 => Algorithm::Sha512, + lib::totp::Algorithm::SHA1 => Ok(Algorithm::Sha1), + lib::totp::Algorithm::SHA256 => Ok(Algorithm::Sha256), + lib::totp::Algorithm::SHA512 => Ok(Algorithm::Sha512), + _ => Err(TotpError::InvalidInput), } } } @@ -43,16 +50,18 @@ pub struct TotpInfo { pub period: i32, } -impl From for TotpInfo { - fn from(value: CoreTotpInfo) -> Self { - Self { +impl TryFrom for TotpInfo { + type Error = TotpError; + + fn try_from(value: CoreTotpInfo) -> Result { + Ok(Self { secret: value.secret, issuer: value.issuer, account_name: value.account_name, - algorithm: value.algorithm.into(), - digits: value.digits as i32, - period: value.period as i32, - } + algorithm: value.algorithm.try_into()?, + digits: i32::from(value.digits), + period: i32::try_from(value.period).map_err(|_| TotpError::InvalidInput)?, + }) } } @@ -88,7 +97,7 @@ impl TotpService { step: i32, secret: String, ) -> Result { - let digits = usize::try_from(digits).map_err(|_| TotpError::InvalidInput)?; + let digits = u8::try_from(digits).map_err(|_| TotpError::InvalidInput)?; let step = u64::try_from(step).map_err(|_| TotpError::InvalidInput)?; core_get_totp(algorithm.into(), digits, step, secret).map_err(Into::into) } @@ -102,7 +111,7 @@ impl TotpService { issuer: Option, account_name: String, ) -> Result { - let digits = usize::try_from(digits).map_err(|_| TotpError::InvalidInput)?; + let digits = u8::try_from(digits).map_err(|_| TotpError::InvalidInput)?; let step = u64::try_from(step).map_err(|_| TotpError::InvalidInput)?; core_get_totp_url(algorithm.into(), digits, step, secret, issuer, account_name) @@ -111,7 +120,7 @@ impl TotpService { pub fn get_info_from_uri(&self, uri: String) -> Result { core_get_totp_info_from_uri(uri) - .map(Into::into) - .map_err(Into::into) + .map_err(TotpError::from)? + .try_into() } } diff --git a/rust/rust-code/lib/Cargo.toml b/rust/rust-code/lib/Cargo.toml index 167bea334..21b4fc323 100644 --- a/rust/rust-code/lib/Cargo.toml +++ b/rust/rust-code/lib/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] aead = "0.6.0" -aes-gcm-siv = "0.12.0-rc.3" +aes-gcm-siv = "0.12.1" async-trait = "0.1.89" ciborium = "0.2.2" coset = "0.4.2" @@ -15,7 +15,7 @@ passkey-authenticator = { version = "0.5.0", features = ["tokio", "testable"] } # Needed so passkey JSON responses are serialized into base64 strings passkey-types = { version = "0.5.0", features = ["serialize_bytes_as_base64_string"] } -base64 = "0.22" +base64 = "0.23.1" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" thiserror = "2.0.18" @@ -25,9 +25,9 @@ uuid = { version = "1.23.0", features = ["serde", "v4"] } rand = { version = "0.10.0", features = ["sys_rng"] } bcs = "0.2.0" argon2 = "0.5.3" -hkdf = "0.12" -sha2 = "0.10" -totp-rs = { version = "5.7.1", features = ["otpauth", "zeroize", "serde_support"] } +hkdf = "0.13.0" +sha2 = "0.11.0" +totp-rs = { version = "6.0.0", features = ["otpauth", "zeroize"] } csv = "1.4.0" email_address = "0.2.9" base32 = "0.5.1" diff --git a/rust/rust-code/lib/src/totp.rs b/rust/rust-code/lib/src/totp.rs index b63fb4ad6..77675b595 100644 --- a/rust/rust-code/lib/src/totp.rs +++ b/rust/rust-code/lib/src/totp.rs @@ -1,58 +1,66 @@ -use std::ops::RangeInclusive; -use std::time::SystemTimeError; use thiserror::Error; pub use totp_rs::Algorithm; -use totp_rs::{Secret, SecretParseError, TOTP, TotpUrlError}; +use totp_rs::{Builder, Secret, SecretParseError, Totp, TotpError as TOTPError}; -/// Digit counts RFC 6238 permits. -const ALLOWED_DIGITS: RangeInclusive = 6..=8; +/// A secret long enough to clear `Builder::build`'s 128 bit floor, swapped in +/// for the real one while validating. Plenty of providers hand out 80 bit +/// secrets and refusing those would make the app useless for them, so that +/// floor is the one rule we drop. +const SECRET_FLOOR_STANDIN: [u8; 16] = [0; 16]; #[derive(Debug, Error)] pub enum TotpError { #[error("url error: {0}")] - Url(TotpUrlError), - #[error("time error: {0}")] - Time(SystemTimeError), + Url(TOTPError), #[error("secret parse error: {0}")] Secret(SecretParseError), } -/// The checks `TOTP::new` runs, minus its 128 bit secret floor. The unchecked -/// constructors skip all of them, so every caller runs this instead. -fn validate(totp: &TOTP) -> Result<(), TotpError> { - if totp.secret.is_empty() { - return Err(TotpError::Url(TotpUrlError::SecretSize(0))); +/// Every check `Builder::build` runs, with its 128 bit secret floor replaced by +/// "the secret must not be empty". +/// +/// The checks are deliberately not restated here. Copying them means the copy +/// silently rots whenever totp-rs adds one, which is exactly how the +/// step-of-zero check 6.0 introduced went missing: a `period=0` URI parsed +/// fine, and generating a code from it divided by zero. Building against a +/// stand-in secret keeps the rules the library's to define, including any it +/// adds later. +fn validate(totp: &Totp) -> Result<(), TotpError> { + if totp.secret().is_empty() { + return Err(TotpError::Url(TOTPError::SecretTooShort { bits: 0 })); } - if !ALLOWED_DIGITS.contains(&totp.digits) { - return Err(TotpError::Url(TotpUrlError::DigitsNumber(totp.digits))); - } - - if let Some(issuer) = totp.issuer.as_deref().filter(|it| it.contains(':')) { - return Err(TotpError::Url(TotpUrlError::Issuer(issuer.to_string()))); - } - - if totp.account_name.contains(':') { - return Err(TotpError::Url(TotpUrlError::AccountName( - totp.account_name.clone(), - ))); - } - - Ok(()) + Builder::new() + .with_algorithm(totp.algorithm()) + .with_digits(totp.digits()) + .with_skew(totp.skew()) + .with_step_duration(totp.step()) + .with_secret(SECRET_FLOOR_STANDIN) + .with_issuer(totp.issuer()) + .with_account_name(totp.account_name()) + .build() + .map(|_| ()) + .map_err(TotpError::Url) } fn build_totp( algorithm: Algorithm, - digits: usize, + digits: u8, step: u64, secret: String, issuer: Option, account_name: String, -) -> Result { - let secret = Secret::Encoded(secret) - .to_bytes() - .map_err(TotpError::Secret)?; - let totp = TOTP::new_unchecked(algorithm, digits, 1, step, secret, issuer, account_name); +) -> Result { + let secret = Secret::try_from_base32(secret).map_err(TotpError::Secret)?; + let totp = Builder::new() + .with_algorithm(algorithm) + .with_digits(digits) + .with_skew(1) + .with_step_duration(step) + .with_secret(secret) + .with_issuer(issuer) + .with_account_name(account_name) + .build_noncompliant(); validate(&totp)?; Ok(totp) @@ -60,12 +68,12 @@ fn build_totp( pub fn get_totp( algorithm: Algorithm, - digits: usize, + digits: u8, step: u64, secret: String, ) -> Result { let totp = build_totp(algorithm, digits, step, secret, None, "".to_string())?; - totp.generate_current().map_err(TotpError::Time) + Ok(totp.generate_current().to_string()) } pub struct TotpInfo { @@ -73,34 +81,34 @@ pub struct TotpInfo { pub issuer: Option, pub account_name: String, pub algorithm: Algorithm, - pub digits: usize, + pub digits: u8, pub period: u64, } pub fn get_totp_info_from_uri(uri: String) -> Result { - let totp = TOTP::from_url_unchecked(uri).map_err(TotpError::Url)?; + let totp = Totp::from_url_unchecked(uri).map_err(TotpError::Url)?; validate(&totp)?; Ok(TotpInfo { - secret: Secret::Raw(totp.secret.clone()).to_encoded().to_string(), - issuer: totp.issuer.clone(), - account_name: totp.account_name.clone(), - algorithm: totp.algorithm, - digits: totp.digits, - period: totp.step, + secret: totp.secret().to_base32(), + issuer: totp.issuer().map(String::from), + account_name: totp.account_name().to_string(), + algorithm: totp.algorithm(), + digits: totp.digits(), + period: totp.step(), }) } pub fn get_totp_url( algorithm: Algorithm, - digits: usize, + digits: u8, step: u64, secret: String, issuer: Option, account_name: String, ) -> Result { let totp = build_totp(algorithm, digits, step, secret, issuer, account_name)?; - Ok(totp.get_url()) + totp.to_url().map_err(TotpError::Url) } pub(crate) fn is_valid_totp_secret(s: &str) -> bool { @@ -177,4 +185,94 @@ mod tests { fn rejects_secret_that_is_not_base32() { assert!(get_totp(Algorithm::SHA1, 6, 30, "not base32!".to_string()).is_err()); } + + #[test] + fn rejects_step_of_zero() { + assert!(get_totp(Algorithm::SHA1, 6, 0, SHORT_SECRET.to_string()).is_err()); + } + + /// A step of zero used to reach `generate`, where dividing the timestamp by + /// it panicked. Anyone who can hand the app a URI picks the period, so this + /// has to fail as an error rather than take the process down. + #[test] + fn rejects_uri_with_period_of_zero() { + let uri = format!("otpauth://totp/GitHub:alice?secret={SHORT_SECRET}&period=0"); + + assert!(get_totp_info_from_uri(uri).is_err()); + } + + /// totp-rs 6.0 made an empty account name an error rather than emitting + /// `otpauth://totp/?secret=...` the way 5.x did. The label is required by + /// the otpauth format, so the caller has to supply one. + #[test] + fn requires_account_name_for_url() { + let url = get_totp_url( + Algorithm::SHA1, + 6, + 30, + SHORT_SECRET.to_string(), + Some("GitHub".to_string()), + "".to_string(), + ); + + assert!(url.is_err()); + } + + /// The RFC 6238 appendix B vectors, which pin the generated codes to known + /// answers across upgrades of the hashing crates underneath totp-rs. + #[test] + fn matches_rfc6238_test_vectors() { + const TIMES: [u64; 6] = [ + 59, + 1111111109, + 1111111111, + 1234567890, + 2000000000, + 20000000000, + ]; + + let cases = [ + ( + Algorithm::SHA1, + "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", + [ + "94287082", "07081804", "14050471", "89005924", "69279037", "65353130", + ], + ), + ( + Algorithm::SHA256, + "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZA", + [ + "46119246", "68084774", "67062674", "91819424", "90698825", "77737706", + ], + ), + ( + Algorithm::SHA512, + "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNA", + [ + "90693936", "25091201", "99943326", "93441116", "38618901", "47863826", + ], + ), + ]; + + for (algorithm, secret, expected) in cases { + let totp = build_totp( + algorithm, + 8, + 30, + secret.to_string(), + None, + "alice".to_string(), + ) + .unwrap(); + + for (time, expected) in TIMES.iter().zip(expected) { + assert_eq!( + expected, + totp.generate(*time).to_string(), + "{algorithm:?} at t={time}", + ); + } + } + } } diff --git a/rust/rust-code/rust-toolchain.toml b/rust/rust-code/rust-toolchain.toml new file mode 100644 index 000000000..2c1933add --- /dev/null +++ b/rust/rust-code/rust-toolchain.toml @@ -0,0 +1,11 @@ +[toolchain] +channel = "1.98.0" +components = [ + "rustfmt", + "clippy", +] +targets = [ + "aarch64-linux-android", + "armv7-linux-androideabi", + "x86_64-linux-android", +]