diff --git a/Cargo.lock b/Cargo.lock index fbf5021..dad0f2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -475,7 +475,7 @@ dependencies = [ [[package]] name = "bitkitcore" -version = "0.1.50" +version = "0.1.51" dependencies = [ "android_logger", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index d5fdc38..1d6642f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitkitcore" -version = "0.1.50" +version = "0.1.51" edition = "2021" [lib] diff --git a/Package.swift b/Package.swift index 681bc92..ead8f28 100644 --- a/Package.swift +++ b/Package.swift @@ -3,8 +3,8 @@ import PackageDescription -let tag = "v0.1.50" -let checksum = "0ee18acb63393567a467422a8968ef22913226e62cac7e97b22a565995e33db0" +let tag = "v0.1.51" +let checksum = "fc2a9b3884dcd1b08d7112458621c589413339e84e52955e0ece4ff1c7596dda" let url = "https://github.com/synonymdev/bitkit-core/releases/download/\(tag)/BitkitCore.xcframework.zip" let package = Package( diff --git a/bindings/android/gradle.properties b/bindings/android/gradle.properties index 0d4a9d9..9d9cf09 100644 --- a/bindings/android/gradle.properties +++ b/bindings/android/gradle.properties @@ -3,4 +3,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official group=com.synonym -version=0.1.50 +version=0.1.51 diff --git a/bindings/android/lib/src/main/jniLibs/arm64-v8a/libbitkitcore.so b/bindings/android/lib/src/main/jniLibs/arm64-v8a/libbitkitcore.so index e194f09..a923a58 100755 Binary files a/bindings/android/lib/src/main/jniLibs/arm64-v8a/libbitkitcore.so and b/bindings/android/lib/src/main/jniLibs/arm64-v8a/libbitkitcore.so differ diff --git a/bindings/android/lib/src/main/jniLibs/arm64-v8a/libpubky_app_specs-90a3a8b6be1a7a22.so b/bindings/android/lib/src/main/jniLibs/arm64-v8a/libpubky_app_specs-90a3a8b6be1a7a22.so new file mode 100755 index 0000000..2856ba2 Binary files /dev/null and b/bindings/android/lib/src/main/jniLibs/arm64-v8a/libpubky_app_specs-90a3a8b6be1a7a22.so differ diff --git a/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libbitkitcore.so b/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libbitkitcore.so index 56b52d0..bc600dc 100755 Binary files a/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libbitkitcore.so and b/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libbitkitcore.so differ diff --git a/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libpubky_app_specs-a5b33175be180155.so b/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libpubky_app_specs-a5b33175be180155.so new file mode 100755 index 0000000..9df27c8 Binary files /dev/null and b/bindings/android/lib/src/main/jniLibs/armeabi-v7a/libpubky_app_specs-a5b33175be180155.so differ diff --git a/bindings/android/lib/src/main/jniLibs/x86/libbitkitcore.so b/bindings/android/lib/src/main/jniLibs/x86/libbitkitcore.so index a101852..64414c0 100755 Binary files a/bindings/android/lib/src/main/jniLibs/x86/libbitkitcore.so and b/bindings/android/lib/src/main/jniLibs/x86/libbitkitcore.so differ diff --git a/bindings/android/lib/src/main/jniLibs/x86/libpubky_app_specs-6691cf4f97b9d92f.so b/bindings/android/lib/src/main/jniLibs/x86/libpubky_app_specs-6691cf4f97b9d92f.so new file mode 100755 index 0000000..d08e98c Binary files /dev/null and b/bindings/android/lib/src/main/jniLibs/x86/libpubky_app_specs-6691cf4f97b9d92f.so differ diff --git a/bindings/android/lib/src/main/jniLibs/x86_64/libbitkitcore.so b/bindings/android/lib/src/main/jniLibs/x86_64/libbitkitcore.so index 0d027ce..f30f0e8 100755 Binary files a/bindings/android/lib/src/main/jniLibs/x86_64/libbitkitcore.so and b/bindings/android/lib/src/main/jniLibs/x86_64/libbitkitcore.so differ diff --git a/bindings/android/lib/src/main/jniLibs/x86_64/libpubky_app_specs-4ad86c877f377f40.so b/bindings/android/lib/src/main/jniLibs/x86_64/libpubky_app_specs-4ad86c877f377f40.so new file mode 100755 index 0000000..8f8f793 Binary files /dev/null and b/bindings/android/lib/src/main/jniLibs/x86_64/libpubky_app_specs-4ad86c877f377f40.so differ diff --git a/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.android.kt b/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.android.kt index d30a3e7..eb99f1d 100644 --- a/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.android.kt +++ b/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.android.kt @@ -1388,6 +1388,24 @@ internal typealias UniffiVTableCallbackInterfaceTrezorUiCallbackUniffiByValue = + + + + + + + + + + + + + + + + + + @@ -1515,6 +1533,9 @@ internal object IntegrityCheckingUniffiLib : Library { if (uniffi_bitkitcore_checksum_func_derive_private_key() != 25155.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (uniffi_bitkitcore_checksum_func_derive_pubky_secret_key() != 36989.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (uniffi_bitkitcore_checksum_func_entropy_to_mnemonic() != 26123.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -1530,6 +1551,9 @@ internal object IntegrityCheckingUniffiLib : Library { if (uniffi_bitkitcore_checksum_func_fetch_pubky_file() != 24890.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (uniffi_bitkitcore_checksum_func_fetch_pubky_file_string() != 47799.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (uniffi_bitkitcore_checksum_func_fetch_pubky_profile() != 19709.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -1659,6 +1683,27 @@ internal object IntegrityCheckingUniffiLib : Library { if (uniffi_bitkitcore_checksum_func_prepare_sweep_transaction() != 18273.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret() != 47481.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key() != 36562.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_session_delete() != 39070.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_session_list() != 7225.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_session_put() != 25203.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_sign_in() != 26706.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (uniffi_bitkitcore_checksum_func_pubky_sign_up() != 61692.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries() != 5324.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -1936,6 +1981,9 @@ internal object IntegrityCheckingUniffiLib : Library { external fun uniffi_bitkitcore_checksum_func_derive_private_key( ): Short @JvmStatic + external fun uniffi_bitkitcore_checksum_func_derive_pubky_secret_key( + ): Short + @JvmStatic external fun uniffi_bitkitcore_checksum_func_entropy_to_mnemonic( ): Short @JvmStatic @@ -1951,6 +1999,9 @@ internal object IntegrityCheckingUniffiLib : Library { external fun uniffi_bitkitcore_checksum_func_fetch_pubky_file( ): Short @JvmStatic + external fun uniffi_bitkitcore_checksum_func_fetch_pubky_file_string( + ): Short + @JvmStatic external fun uniffi_bitkitcore_checksum_func_fetch_pubky_profile( ): Short @JvmStatic @@ -2080,6 +2131,27 @@ internal object IntegrityCheckingUniffiLib : Library { external fun uniffi_bitkitcore_checksum_func_prepare_sweep_transaction( ): Short @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_session_delete( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_session_list( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_session_put( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_sign_in( + ): Short + @JvmStatic + external fun uniffi_bitkitcore_checksum_func_pubky_sign_up( + ): Short + @JvmStatic external fun uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries( ): Short @JvmStatic @@ -2546,6 +2618,11 @@ internal object UniffiLib : Library { uniffiCallStatus: UniffiRustCallStatus, ): RustBufferByValue @JvmStatic + external fun uniffi_bitkitcore_fn_func_derive_pubky_secret_key( + `seed`: RustBufferByValue, + uniffiCallStatus: UniffiRustCallStatus, + ): RustBufferByValue + @JvmStatic external fun uniffi_bitkitcore_fn_func_entropy_to_mnemonic( `entropy`: RustBufferByValue, uniffiCallStatus: UniffiRustCallStatus, @@ -2571,6 +2648,10 @@ internal object UniffiLib : Library { `uri`: RustBufferByValue, ): Long @JvmStatic + external fun uniffi_bitkitcore_fn_func_fetch_pubky_file_string( + `uri`: RustBufferByValue, + ): Long + @JvmStatic external fun uniffi_bitkitcore_fn_func_fetch_pubky_profile( `publicKey`: RustBufferByValue, ): Long @@ -2806,6 +2887,43 @@ internal object UniffiLib : Library { `feeRateSatsPerVbyte`: RustBufferByValue, ): Long @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_public_key_from_secret( + `secretKeyHex`: RustBufferByValue, + uniffiCallStatus: UniffiRustCallStatus, + ): RustBufferByValue + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_put_with_secret_key( + `secretKeyHex`: RustBufferByValue, + `path`: RustBufferByValue, + `content`: RustBufferByValue, + ): Long + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_session_delete( + `sessionSecret`: RustBufferByValue, + `path`: RustBufferByValue, + ): Long + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_session_list( + `sessionSecret`: RustBufferByValue, + `dirPath`: RustBufferByValue, + ): Long + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_session_put( + `sessionSecret`: RustBufferByValue, + `path`: RustBufferByValue, + `content`: RustBufferByValue, + ): Long + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_sign_in( + `secretKeyHex`: RustBufferByValue, + ): Long + @JvmStatic + external fun uniffi_bitkitcore_fn_func_pubky_sign_up( + `secretKeyHex`: RustBufferByValue, + `homeserverPublicKeyZ32`: RustBufferByValue, + `signupCode`: RustBufferByValue, + ): Long + @JvmStatic external fun uniffi_bitkitcore_fn_func_refresh_active_cjit_entries( ): Long @JvmStatic @@ -9072,6 +9190,12 @@ public object FfiConverterTypePubkyError : FfiConverterRustBuffer PubkyException.ProfileParseFailed( FfiConverterString.read(buf), ) + 8 -> PubkyException.KeyException( + FfiConverterString.read(buf), + ) + 9 -> PubkyException.WriteFailed( + FfiConverterString.read(buf), + ) else -> throw RuntimeException("invalid error enum value, something is very wrong!!") } } @@ -9111,6 +9235,16 @@ public object FfiConverterTypePubkyError : FfiConverterRustBuffer ( + // Add the size for the Int that specifies the variant plus the size needed for all fields + 4UL + + FfiConverterString.allocationSize(value.`reason`) + ) + is PubkyException.WriteFailed -> ( + // Add the size for the Int that specifies the variant plus the size needed for all fields + 4UL + + FfiConverterString.allocationSize(value.`reason`) + ) } } @@ -9149,6 +9283,16 @@ public object FfiConverterTypePubkyError : FfiConverterRustBuffer { + buf.putInt(8) + FfiConverterString.write(value.`reason`, buf) + Unit + } + is PubkyException.WriteFailed -> { + buf.putInt(9) + FfiConverterString.write(value.`reason`, buf) + Unit + } }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } } } @@ -12261,6 +12405,16 @@ public fun `derivePrivateKey`(`mnemonicPhrase`: kotlin.String, `derivationPathSt }) } +@Throws(PubkyException::class) +public fun `derivePubkySecretKey`(`seed`: kotlin.ByteArray): kotlin.String { + return FfiConverterString.lift(uniffiRustCallWithError(PubkyExceptionErrorHandler) { uniffiRustCallStatus -> + UniffiLib.uniffi_bitkitcore_fn_func_derive_pubky_secret_key( + FfiConverterByteArray.lower(`seed`), + uniffiRustCallStatus, + ) + }) +} + @Throws(AddressException::class) public fun `entropyToMnemonic`(`entropy`: kotlin.ByteArray): kotlin.String { return FfiConverterString.lift(uniffiRustCallWithError(AddressExceptionErrorHandler) { uniffiRustCallStatus -> @@ -12343,6 +12497,23 @@ public suspend fun `fetchPubkyFile`(`uri`: kotlin.String): kotlin.ByteArray { ) } +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `fetchPubkyFileString`(`uri`: kotlin.String): kotlin.String { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_file_string( + FfiConverterString.lower(`uri`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_rust_buffer(future) }, + // lift function + { FfiConverterString.lift(it) }, + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + @Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) public suspend fun `fetchPubkyProfile`(`publicKey`: kotlin.String): PubkyProfile { return uniffiRustCallAsync( @@ -12966,6 +13137,129 @@ public suspend fun `prepareSweepTransaction`(`mnemonicPhrase`: kotlin.String, `n ) } +@Throws(PubkyException::class) +public fun `pubkyPublicKeyFromSecret`(`secretKeyHex`: kotlin.String): kotlin.String { + return FfiConverterString.lift(uniffiRustCallWithError(PubkyExceptionErrorHandler) { uniffiRustCallStatus -> + UniffiLib.uniffi_bitkitcore_fn_func_pubky_public_key_from_secret( + FfiConverterString.lower(`secretKeyHex`), + uniffiRustCallStatus, + ) + }) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkyPutWithSecretKey`(`secretKeyHex`: kotlin.String, `path`: kotlin.String, `content`: kotlin.ByteArray) { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_put_with_secret_key( + FfiConverterString.lower(`secretKeyHex`), + FfiConverterString.lower(`path`), + FfiConverterByteArray.lower(`content`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_void(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_void(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_void(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkySessionDelete`(`sessionSecret`: kotlin.String, `path`: kotlin.String) { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_delete( + FfiConverterString.lower(`sessionSecret`), + FfiConverterString.lower(`path`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_void(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_void(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_void(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkySessionList`(`sessionSecret`: kotlin.String, `dirPath`: kotlin.String): List { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_list( + FfiConverterString.lower(`sessionSecret`), + FfiConverterString.lower(`dirPath`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_rust_buffer(future) }, + // lift function + { FfiConverterSequenceString.lift(it) }, + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkySessionPut`(`sessionSecret`: kotlin.String, `path`: kotlin.String, `content`: kotlin.ByteArray) { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_put( + FfiConverterString.lower(`sessionSecret`), + FfiConverterString.lower(`path`), + FfiConverterByteArray.lower(`content`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_void(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_void(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_void(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkySignIn`(`secretKeyHex`: kotlin.String): kotlin.String { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_in( + FfiConverterString.lower(`secretKeyHex`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_rust_buffer(future) }, + // lift function + { FfiConverterString.lift(it) }, + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + +@Throws(PubkyException::class, kotlin.coroutines.cancellation.CancellationException::class) +public suspend fun `pubkySignUp`(`secretKeyHex`: kotlin.String, `homeserverPublicKeyZ32`: kotlin.String, `signupCode`: kotlin.String?): kotlin.String { + return uniffiRustCallAsync( + UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_up( + FfiConverterString.lower(`secretKeyHex`), + FfiConverterString.lower(`homeserverPublicKeyZ32`), + FfiConverterOptionalString.lower(`signupCode`), + ), + { future, callback, continuation -> UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer(future) }, + { future -> UniffiLib.ffi_bitkitcore_rust_future_cancel_rust_buffer(future) }, + // lift function + { FfiConverterString.lift(it) }, + // Error FFI converter + PubkyExceptionErrorHandler, + ) +} + /** * Refresh all active CJIT entries in the database with latest data from the LSP */ diff --git a/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.common.kt b/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.common.kt index 4277e6e..b292599 100644 --- a/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.common.kt +++ b/bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.common.kt @@ -3426,6 +3426,20 @@ public sealed class PubkyException: kotlin.Exception() { get() = "reason=${ `reason` }" } + public class KeyException( + public val `reason`: kotlin.String, + ) : PubkyException() { + override val message: String + get() = "reason=${ `reason` }" + } + + public class WriteFailed( + public val `reason`: kotlin.String, + ) : PubkyException() { + override val message: String + get() = "reason=${ `reason` }" + } + } diff --git a/bindings/ios/BitkitCore.xcframework.zip b/bindings/ios/BitkitCore.xcframework.zip index 29f5172..3859e36 100644 Binary files a/bindings/ios/BitkitCore.xcframework.zip and b/bindings/ios/BitkitCore.xcframework.zip differ diff --git a/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/Headers/bitkitcoreFFI.h b/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/Headers/bitkitcoreFFI.h index 9d5af34..a6c1fba 100644 --- a/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/Headers/bitkitcoreFFI.h +++ b/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/Headers/bitkitcoreFFI.h @@ -585,6 +585,11 @@ RustBuffer uniffi_bitkitcore_fn_func_derive_bitcoin_addresses(RustBuffer mnemoni RustBuffer uniffi_bitkitcore_fn_func_derive_private_key(RustBuffer mnemonic_phrase, RustBuffer derivation_path_str, RustBuffer network, RustBuffer bip39_passphrase, RustCallStatus *_Nonnull out_status ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +RustBuffer uniffi_bitkitcore_fn_func_derive_pubky_secret_key(RustBuffer seed, RustCallStatus *_Nonnull out_status +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC RustBuffer uniffi_bitkitcore_fn_func_entropy_to_mnemonic(RustBuffer entropy, RustCallStatus *_Nonnull out_status @@ -610,6 +615,11 @@ uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_contacts(RustBuffer public_key uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file(RustBuffer uri ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file_string(RustBuffer uri +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_profile(RustBuffer public_key @@ -830,6 +840,41 @@ uint64_t uniffi_bitkitcore_fn_func_open_channel(RustBuffer order_id, RustBuffer uint64_t uniffi_bitkitcore_fn_func_prepare_sweep_transaction(RustBuffer mnemonic_phrase, RustBuffer network, RustBuffer bip39_passphrase, RustBuffer electrum_url, RustBuffer destination_address, RustBuffer fee_rate_sats_per_vbyte ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +RustBuffer uniffi_bitkitcore_fn_func_pubky_public_key_from_secret(RustBuffer secret_key_hex, RustCallStatus *_Nonnull out_status +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint64_t uniffi_bitkitcore_fn_func_pubky_put_with_secret_key(RustBuffer secret_key_hex, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +uint64_t uniffi_bitkitcore_fn_func_pubky_session_delete(RustBuffer session_secret, RustBuffer path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +uint64_t uniffi_bitkitcore_fn_func_pubky_session_list(RustBuffer session_secret, RustBuffer dir_path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +uint64_t uniffi_bitkitcore_fn_func_pubky_session_put(RustBuffer session_secret, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_in(RustBuffer secret_key_hex +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_up(RustBuffer secret_key_hex, RustBuffer homeserver_public_key_z32, RustBuffer signup_code +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES uint64_t uniffi_bitkitcore_fn_func_refresh_active_cjit_entries(void @@ -1535,6 +1580,12 @@ uint16_t uniffi_bitkitcore_checksum_func_derive_bitcoin_addresses(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PRIVATE_KEY uint16_t uniffi_bitkitcore_checksum_func_derive_private_key(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_derive_pubky_secret_key(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_ENTROPY_TO_MNEMONIC @@ -1565,6 +1616,12 @@ uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_contacts(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file_string(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_PROFILE @@ -1823,6 +1880,48 @@ uint16_t uniffi_bitkitcore_checksum_func_open_channel(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PREPARE_SWEEP_TRANSACTION uint16_t uniffi_bitkitcore_checksum_func_prepare_sweep_transaction(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +uint16_t uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_delete(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_list(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_put(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_in(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_up(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES diff --git a/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/libbitkitcore.a b/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/libbitkitcore.a index e013d4a..c8deaca 100644 Binary files a/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/libbitkitcore.a and b/bindings/ios/BitkitCore.xcframework/ios-arm64-simulator/libbitkitcore.a differ diff --git a/bindings/ios/BitkitCore.xcframework/ios-arm64/Headers/bitkitcoreFFI.h b/bindings/ios/BitkitCore.xcframework/ios-arm64/Headers/bitkitcoreFFI.h index 9d5af34..a6c1fba 100644 --- a/bindings/ios/BitkitCore.xcframework/ios-arm64/Headers/bitkitcoreFFI.h +++ b/bindings/ios/BitkitCore.xcframework/ios-arm64/Headers/bitkitcoreFFI.h @@ -585,6 +585,11 @@ RustBuffer uniffi_bitkitcore_fn_func_derive_bitcoin_addresses(RustBuffer mnemoni RustBuffer uniffi_bitkitcore_fn_func_derive_private_key(RustBuffer mnemonic_phrase, RustBuffer derivation_path_str, RustBuffer network, RustBuffer bip39_passphrase, RustCallStatus *_Nonnull out_status ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +RustBuffer uniffi_bitkitcore_fn_func_derive_pubky_secret_key(RustBuffer seed, RustCallStatus *_Nonnull out_status +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC RustBuffer uniffi_bitkitcore_fn_func_entropy_to_mnemonic(RustBuffer entropy, RustCallStatus *_Nonnull out_status @@ -610,6 +615,11 @@ uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_contacts(RustBuffer public_key uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file(RustBuffer uri ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file_string(RustBuffer uri +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_profile(RustBuffer public_key @@ -830,6 +840,41 @@ uint64_t uniffi_bitkitcore_fn_func_open_channel(RustBuffer order_id, RustBuffer uint64_t uniffi_bitkitcore_fn_func_prepare_sweep_transaction(RustBuffer mnemonic_phrase, RustBuffer network, RustBuffer bip39_passphrase, RustBuffer electrum_url, RustBuffer destination_address, RustBuffer fee_rate_sats_per_vbyte ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +RustBuffer uniffi_bitkitcore_fn_func_pubky_public_key_from_secret(RustBuffer secret_key_hex, RustCallStatus *_Nonnull out_status +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint64_t uniffi_bitkitcore_fn_func_pubky_put_with_secret_key(RustBuffer secret_key_hex, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +uint64_t uniffi_bitkitcore_fn_func_pubky_session_delete(RustBuffer session_secret, RustBuffer path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +uint64_t uniffi_bitkitcore_fn_func_pubky_session_list(RustBuffer session_secret, RustBuffer dir_path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +uint64_t uniffi_bitkitcore_fn_func_pubky_session_put(RustBuffer session_secret, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_in(RustBuffer secret_key_hex +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_up(RustBuffer secret_key_hex, RustBuffer homeserver_public_key_z32, RustBuffer signup_code +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES uint64_t uniffi_bitkitcore_fn_func_refresh_active_cjit_entries(void @@ -1535,6 +1580,12 @@ uint16_t uniffi_bitkitcore_checksum_func_derive_bitcoin_addresses(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PRIVATE_KEY uint16_t uniffi_bitkitcore_checksum_func_derive_private_key(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_derive_pubky_secret_key(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_ENTROPY_TO_MNEMONIC @@ -1565,6 +1616,12 @@ uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_contacts(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file_string(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_PROFILE @@ -1823,6 +1880,48 @@ uint16_t uniffi_bitkitcore_checksum_func_open_channel(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PREPARE_SWEEP_TRANSACTION uint16_t uniffi_bitkitcore_checksum_func_prepare_sweep_transaction(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +uint16_t uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_delete(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_list(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_put(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_in(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_up(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES diff --git a/bindings/ios/BitkitCore.xcframework/ios-arm64/libbitkitcore.a b/bindings/ios/BitkitCore.xcframework/ios-arm64/libbitkitcore.a index 26cb488..63ceb76 100644 Binary files a/bindings/ios/BitkitCore.xcframework/ios-arm64/libbitkitcore.a and b/bindings/ios/BitkitCore.xcframework/ios-arm64/libbitkitcore.a differ diff --git a/bindings/ios/bitkitcore.swift b/bindings/ios/bitkitcore.swift index 277633d..c1d8459 100644 --- a/bindings/ios/bitkitcore.swift +++ b/bindings/ios/bitkitcore.swift @@ -15570,6 +15570,10 @@ public enum PubkyError: Swift.Error { case ProfileNotFound case ProfileParseFailed(reason: String ) + case KeyError(reason: String + ) + case WriteFailed(reason: String + ) } @@ -15603,6 +15607,12 @@ public struct FfiConverterTypePubkyError: FfiConverterRustBuffer { case 7: return .ProfileParseFailed( reason: try FfiConverterString.read(from: &buf) ) + case 8: return .KeyError( + reason: try FfiConverterString.read(from: &buf) + ) + case 9: return .WriteFailed( + reason: try FfiConverterString.read(from: &buf) + ) default: throw UniffiInternalError.unexpectedEnumCase } @@ -15647,6 +15657,16 @@ public struct FfiConverterTypePubkyError: FfiConverterRustBuffer { writeInt(&buf, Int32(7)) FfiConverterString.write(reason, into: &buf) + + case let .KeyError(reason): + writeInt(&buf, Int32(8)) + FfiConverterString.write(reason, into: &buf) + + + case let .WriteFailed(reason): + writeInt(&buf, Int32(9)) + FfiConverterString.write(reason, into: &buf) + } } } @@ -19025,6 +19045,13 @@ public func derivePrivateKey(mnemonicPhrase: String, derivationPathStr: String?, ) }) } +public func derivePubkySecretKey(seed: Data)throws -> String { + return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypePubkyError_lift) { + uniffi_bitkitcore_fn_func_derive_pubky_secret_key( + FfiConverterData.lower(seed),$0 + ) +}) +} public func entropyToMnemonic(entropy: Data)throws -> String { return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeAddressError_lift) { uniffi_bitkitcore_fn_func_entropy_to_mnemonic( @@ -19088,6 +19115,20 @@ public func fetchPubkyFile(uri: String)async throws -> Data { errorHandler: FfiConverterTypePubkyError_lift ) } +public func fetchPubkyFileString(uri: String)async throws -> String { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_fetch_pubky_file_string(FfiConverterString.lower(uri) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_rust_buffer, + completeFunc: ffi_bitkitcore_rust_future_complete_rust_buffer, + freeFunc: ffi_bitkitcore_rust_future_free_rust_buffer, + liftFunc: FfiConverterString.lift, + errorHandler: FfiConverterTypePubkyError_lift + ) +} public func fetchPubkyProfile(publicKey: String)async throws -> PubkyProfile { return try await uniffiRustCallAsync( @@ -19555,6 +19596,97 @@ public func prepareSweepTransaction(mnemonicPhrase: String, network: Network?, b errorHandler: FfiConverterTypeSweepError_lift ) } +public func pubkyPublicKeyFromSecret(secretKeyHex: String)throws -> String { + return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypePubkyError_lift) { + uniffi_bitkitcore_fn_func_pubky_public_key_from_secret( + FfiConverterString.lower(secretKeyHex),$0 + ) +}) +} +public func pubkyPutWithSecretKey(secretKeyHex: String, path: String, content: Data)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_put_with_secret_key(FfiConverterString.lower(secretKeyHex),FfiConverterString.lower(path),FfiConverterData.lower(content) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_void, + completeFunc: ffi_bitkitcore_rust_future_complete_void, + freeFunc: ffi_bitkitcore_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypePubkyError_lift + ) +} +public func pubkySessionDelete(sessionSecret: String, path: String)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_session_delete(FfiConverterString.lower(sessionSecret),FfiConverterString.lower(path) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_void, + completeFunc: ffi_bitkitcore_rust_future_complete_void, + freeFunc: ffi_bitkitcore_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypePubkyError_lift + ) +} +public func pubkySessionList(sessionSecret: String, dirPath: String)async throws -> [String] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_session_list(FfiConverterString.lower(sessionSecret),FfiConverterString.lower(dirPath) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_rust_buffer, + completeFunc: ffi_bitkitcore_rust_future_complete_rust_buffer, + freeFunc: ffi_bitkitcore_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceString.lift, + errorHandler: FfiConverterTypePubkyError_lift + ) +} +public func pubkySessionPut(sessionSecret: String, path: String, content: Data)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_session_put(FfiConverterString.lower(sessionSecret),FfiConverterString.lower(path),FfiConverterData.lower(content) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_void, + completeFunc: ffi_bitkitcore_rust_future_complete_void, + freeFunc: ffi_bitkitcore_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypePubkyError_lift + ) +} +public func pubkySignIn(secretKeyHex: String)async throws -> String { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_sign_in(FfiConverterString.lower(secretKeyHex) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_rust_buffer, + completeFunc: ffi_bitkitcore_rust_future_complete_rust_buffer, + freeFunc: ffi_bitkitcore_rust_future_free_rust_buffer, + liftFunc: FfiConverterString.lift, + errorHandler: FfiConverterTypePubkyError_lift + ) +} +public func pubkySignUp(secretKeyHex: String, homeserverPublicKeyZ32: String, signupCode: String?)async throws -> String { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_bitkitcore_fn_func_pubky_sign_up(FfiConverterString.lower(secretKeyHex),FfiConverterString.lower(homeserverPublicKeyZ32),FfiConverterOptionString.lower(signupCode) + ) + }, + pollFunc: ffi_bitkitcore_rust_future_poll_rust_buffer, + completeFunc: ffi_bitkitcore_rust_future_complete_rust_buffer, + freeFunc: ffi_bitkitcore_rust_future_free_rust_buffer, + liftFunc: FfiConverterString.lift, + errorHandler: FfiConverterTypePubkyError_lift + ) +} /** * Refresh all active CJIT entries in the database with latest data from the LSP */ @@ -20341,6 +20473,9 @@ private let initializationResult: InitializationResult = { if (uniffi_bitkitcore_checksum_func_derive_private_key() != 25155) { return InitializationResult.apiChecksumMismatch } + if (uniffi_bitkitcore_checksum_func_derive_pubky_secret_key() != 36989) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_bitkitcore_checksum_func_entropy_to_mnemonic() != 26123) { return InitializationResult.apiChecksumMismatch } @@ -20356,6 +20491,9 @@ private let initializationResult: InitializationResult = { if (uniffi_bitkitcore_checksum_func_fetch_pubky_file() != 24890) { return InitializationResult.apiChecksumMismatch } + if (uniffi_bitkitcore_checksum_func_fetch_pubky_file_string() != 47799) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_bitkitcore_checksum_func_fetch_pubky_profile() != 19709) { return InitializationResult.apiChecksumMismatch } @@ -20485,6 +20623,27 @@ private let initializationResult: InitializationResult = { if (uniffi_bitkitcore_checksum_func_prepare_sweep_transaction() != 18273) { return InitializationResult.apiChecksumMismatch } + if (uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret() != 47481) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key() != 36562) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_session_delete() != 39070) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_session_list() != 7225) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_session_put() != 25203) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_sign_in() != 26706) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_bitkitcore_checksum_func_pubky_sign_up() != 61692) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries() != 5324) { return InitializationResult.apiChecksumMismatch } diff --git a/bindings/ios/bitkitcoreFFI.h b/bindings/ios/bitkitcoreFFI.h index 9d5af34..a6c1fba 100644 --- a/bindings/ios/bitkitcoreFFI.h +++ b/bindings/ios/bitkitcoreFFI.h @@ -585,6 +585,11 @@ RustBuffer uniffi_bitkitcore_fn_func_derive_bitcoin_addresses(RustBuffer mnemoni RustBuffer uniffi_bitkitcore_fn_func_derive_private_key(RustBuffer mnemonic_phrase, RustBuffer derivation_path_str, RustBuffer network, RustBuffer bip39_passphrase, RustCallStatus *_Nonnull out_status ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_DERIVE_PUBKY_SECRET_KEY +RustBuffer uniffi_bitkitcore_fn_func_derive_pubky_secret_key(RustBuffer seed, RustCallStatus *_Nonnull out_status +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_ENTROPY_TO_MNEMONIC RustBuffer uniffi_bitkitcore_fn_func_entropy_to_mnemonic(RustBuffer entropy, RustCallStatus *_Nonnull out_status @@ -610,6 +615,11 @@ uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_contacts(RustBuffer public_key uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file(RustBuffer uri ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_FILE_STRING +uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_file_string(RustBuffer uri +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_FETCH_PUBKY_PROFILE uint64_t uniffi_bitkitcore_fn_func_fetch_pubky_profile(RustBuffer public_key @@ -830,6 +840,41 @@ uint64_t uniffi_bitkitcore_fn_func_open_channel(RustBuffer order_id, RustBuffer uint64_t uniffi_bitkitcore_fn_func_prepare_sweep_transaction(RustBuffer mnemonic_phrase, RustBuffer network, RustBuffer bip39_passphrase, RustBuffer electrum_url, RustBuffer destination_address, RustBuffer fee_rate_sats_per_vbyte ); #endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +RustBuffer uniffi_bitkitcore_fn_func_pubky_public_key_from_secret(RustBuffer secret_key_hex, RustCallStatus *_Nonnull out_status +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint64_t uniffi_bitkitcore_fn_func_pubky_put_with_secret_key(RustBuffer secret_key_hex, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_DELETE +uint64_t uniffi_bitkitcore_fn_func_pubky_session_delete(RustBuffer session_secret, RustBuffer path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_LIST +uint64_t uniffi_bitkitcore_fn_func_pubky_session_list(RustBuffer session_secret, RustBuffer dir_path +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SESSION_PUT +uint64_t uniffi_bitkitcore_fn_func_pubky_session_put(RustBuffer session_secret, RustBuffer path, RustBuffer content +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_IN +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_in(RustBuffer secret_key_hex +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_PUBKY_SIGN_UP +uint64_t uniffi_bitkitcore_fn_func_pubky_sign_up(RustBuffer secret_key_hex, RustBuffer homeserver_public_key_z32, RustBuffer signup_code +); +#endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_FN_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES uint64_t uniffi_bitkitcore_fn_func_refresh_active_cjit_entries(void @@ -1535,6 +1580,12 @@ uint16_t uniffi_bitkitcore_checksum_func_derive_bitcoin_addresses(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PRIVATE_KEY uint16_t uniffi_bitkitcore_checksum_func_derive_private_key(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_DERIVE_PUBKY_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_derive_pubky_secret_key(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_ENTROPY_TO_MNEMONIC @@ -1565,6 +1616,12 @@ uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_contacts(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_FILE_STRING +uint16_t uniffi_bitkitcore_checksum_func_fetch_pubky_file_string(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_FETCH_PUBKY_PROFILE @@ -1823,6 +1880,48 @@ uint16_t uniffi_bitkitcore_checksum_func_open_channel(void #define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PREPARE_SWEEP_TRANSACTION uint16_t uniffi_bitkitcore_checksum_func_prepare_sweep_transaction(void +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUBLIC_KEY_FROM_SECRET +uint16_t uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_PUT_WITH_SECRET_KEY +uint16_t uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_DELETE +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_delete(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_LIST +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_list(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SESSION_PUT +uint16_t uniffi_bitkitcore_checksum_func_pubky_session_put(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_IN +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_in(void + +); +#endif +#ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +#define UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_PUBKY_SIGN_UP +uint16_t uniffi_bitkitcore_checksum_func_pubky_sign_up(void + ); #endif #ifndef UNIFFI_FFIDEF_UNIFFI_BITKITCORE_CHECKSUM_FUNC_REFRESH_ACTIVE_CJIT_ENTRIES diff --git a/bindings/python/bitkitcore/bitkitcore.py b/bindings/python/bitkitcore/bitkitcore.py index c458a8d..f776ff8 100644 --- a/bindings/python/bitkitcore/bitkitcore.py +++ b/bindings/python/bitkitcore/bitkitcore.py @@ -507,6 +507,8 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_derive_private_key() != 25155: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_derive_pubky_secret_key() != 36989: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_entropy_to_mnemonic() != 26123: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_estimate_order_fee() != 9548: @@ -517,6 +519,8 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_fetch_pubky_file() != 24890: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_fetch_pubky_file_string() != 47799: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_fetch_pubky_profile() != 19709: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_generate_mnemonic() != 19292: @@ -603,6 +607,20 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_prepare_sweep_transaction() != 18273: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret() != 47481: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key() != 36562: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_session_delete() != 39070: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_session_list() != 7225: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_session_put() != 25203: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_sign_in() != 26706: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_bitkitcore_checksum_func_pubky_sign_up() != 61692: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries() != 5324: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_bitkitcore_checksum_func_refresh_active_orders() != 50661: @@ -1146,6 +1164,11 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_bitkitcore_fn_func_derive_private_key.restype = _UniffiRustBuffer +_UniffiLib.uniffi_bitkitcore_fn_func_derive_pubky_secret_key.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_bitkitcore_fn_func_derive_pubky_secret_key.restype = _UniffiRustBuffer _UniffiLib.uniffi_bitkitcore_fn_func_entropy_to_mnemonic.argtypes = ( _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), @@ -1171,6 +1194,10 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): _UniffiRustBuffer, ) _UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_file.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_file_string.argtypes = ( + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_file_string.restype = ctypes.c_uint64 _UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_profile.argtypes = ( _UniffiRustBuffer, ) @@ -1406,6 +1433,43 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): _UniffiRustBuffer, ) _UniffiLib.uniffi_bitkitcore_fn_func_prepare_sweep_transaction.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_public_key_from_secret.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_public_key_from_secret.restype = _UniffiRustBuffer +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_put_with_secret_key.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_put_with_secret_key.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_delete.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_delete.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_list.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_list.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_put.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_put.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_in.argtypes = ( + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_in.restype = ctypes.c_uint64 +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_up.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, +) +_UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_up.restype = ctypes.c_uint64 _UniffiLib.uniffi_bitkitcore_fn_func_refresh_active_cjit_entries.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_fn_func_refresh_active_cjit_entries.restype = ctypes.c_uint64 @@ -1990,6 +2054,9 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): _UniffiLib.uniffi_bitkitcore_checksum_func_derive_private_key.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_derive_private_key.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_derive_pubky_secret_key.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_derive_pubky_secret_key.restype = ctypes.c_uint16 _UniffiLib.uniffi_bitkitcore_checksum_func_entropy_to_mnemonic.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_entropy_to_mnemonic.restype = ctypes.c_uint16 @@ -2005,6 +2072,9 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): _UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_file.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_file.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_file_string.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_file_string.restype = ctypes.c_uint16 _UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_profile.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_fetch_pubky_profile.restype = ctypes.c_uint16 @@ -2134,6 +2204,27 @@ class _UniffiVTableCallbackInterfaceTrezorUiCallback(ctypes.Structure): _UniffiLib.uniffi_bitkitcore_checksum_func_prepare_sweep_transaction.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_prepare_sweep_transaction.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_public_key_from_secret.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_put_with_secret_key.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_delete.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_delete.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_list.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_list.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_put.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_session_put.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_sign_in.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_sign_in.restype = ctypes.c_uint16 +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_sign_up.argtypes = ( +) +_UniffiLib.uniffi_bitkitcore_checksum_func_pubky_sign_up.restype = ctypes.c_uint16 _UniffiLib.uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries.argtypes = ( ) _UniffiLib.uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries.restype = ctypes.c_uint16 @@ -12364,6 +12455,26 @@ def __init__(self, reason): def __repr__(self): return "PubkyError.ProfileParseFailed({})".format(str(self)) _UniffiTempPubkyError.ProfileParseFailed = ProfileParseFailed # type: ignore + class KeyError(_UniffiTempPubkyError): + def __init__(self, reason): + super().__init__(", ".join([ + "reason={!r}".format(reason), + ])) + self.reason = reason + + def __repr__(self): + return "PubkyError.KeyError({})".format(str(self)) + _UniffiTempPubkyError.KeyError = KeyError # type: ignore + class WriteFailed(_UniffiTempPubkyError): + def __init__(self, reason): + super().__init__(", ".join([ + "reason={!r}".format(reason), + ])) + self.reason = reason + + def __repr__(self): + return "PubkyError.WriteFailed({})".format(str(self)) + _UniffiTempPubkyError.WriteFailed = WriteFailed # type: ignore PubkyError = _UniffiTempPubkyError # type: ignore del _UniffiTempPubkyError @@ -12399,6 +12510,14 @@ def read(buf): return PubkyError.ProfileParseFailed( _UniffiConverterString.read(buf), ) + if variant == 8: + return PubkyError.KeyError( + _UniffiConverterString.read(buf), + ) + if variant == 9: + return PubkyError.WriteFailed( + _UniffiConverterString.read(buf), + ) raise InternalError("Raw enum value doesn't match any cases") @staticmethod @@ -12422,6 +12541,12 @@ def check_lower(value): if isinstance(value, PubkyError.ProfileParseFailed): _UniffiConverterString.check_lower(value.reason) return + if isinstance(value, PubkyError.KeyError): + _UniffiConverterString.check_lower(value.reason) + return + if isinstance(value, PubkyError.WriteFailed): + _UniffiConverterString.check_lower(value.reason) + return @staticmethod def write(value, buf): @@ -12444,6 +12569,12 @@ def write(value, buf): if isinstance(value, PubkyError.ProfileParseFailed): buf.write_i32(7) _UniffiConverterString.write(value.reason, buf) + if isinstance(value, PubkyError.KeyError): + buf.write_i32(8) + _UniffiConverterString.write(value.reason, buf) + if isinstance(value, PubkyError.WriteFailed): + buf.write_i32(9) + _UniffiConverterString.write(value.reason, buf) @@ -17329,6 +17460,13 @@ def derive_private_key(mnemonic_phrase: "str",derivation_path_str: "typing.Optio _UniffiConverterOptionalString.lower(bip39_passphrase))) +def derive_pubky_secret_key(seed: "bytes") -> "str": + _UniffiConverterBytes.check_lower(seed) + + return _UniffiConverterString.lift(_uniffi_rust_call_with_error(_UniffiConverterTypePubkyError,_UniffiLib.uniffi_bitkitcore_fn_func_derive_pubky_secret_key, + _UniffiConverterBytes.lower(seed))) + + def entropy_to_mnemonic(entropy: "bytes") -> "str": _UniffiConverterBytes.check_lower(entropy) @@ -17414,6 +17552,23 @@ async def fetch_pubky_file(uri: "str") -> "bytes": # Error FFI converter _UniffiConverterTypePubkyError, + ) +async def fetch_pubky_file_string(uri: "str") -> "str": + + _UniffiConverterString.check_lower(uri) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_fetch_pubky_file_string( + _UniffiConverterString.lower(uri)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer, + # lift function + _UniffiConverterString.lift, + + # Error FFI converter +_UniffiConverterTypePubkyError, + ) async def fetch_pubky_profile(public_key: "str") -> "PubkyProfile": @@ -18056,6 +18211,142 @@ async def prepare_sweep_transaction(mnemonic_phrase: "str",network: "typing.Opti _UniffiConverterTypeSweepError, ) + +def pubky_public_key_from_secret(secret_key_hex: "str") -> "str": + _UniffiConverterString.check_lower(secret_key_hex) + + return _UniffiConverterString.lift(_uniffi_rust_call_with_error(_UniffiConverterTypePubkyError,_UniffiLib.uniffi_bitkitcore_fn_func_pubky_public_key_from_secret, + _UniffiConverterString.lower(secret_key_hex))) + +async def pubky_put_with_secret_key(secret_key_hex: "str",path: "str",content: "bytes") -> None: + + _UniffiConverterString.check_lower(secret_key_hex) + + _UniffiConverterString.check_lower(path) + + _UniffiConverterBytes.check_lower(content) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_put_with_secret_key( + _UniffiConverterString.lower(secret_key_hex), + _UniffiConverterString.lower(path), + _UniffiConverterBytes.lower(content)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_void, + _UniffiLib.ffi_bitkitcore_rust_future_complete_void, + _UniffiLib.ffi_bitkitcore_rust_future_free_void, + # lift function + lambda val: None, + + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) +async def pubky_session_delete(session_secret: "str",path: "str") -> None: + + _UniffiConverterString.check_lower(session_secret) + + _UniffiConverterString.check_lower(path) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_delete( + _UniffiConverterString.lower(session_secret), + _UniffiConverterString.lower(path)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_void, + _UniffiLib.ffi_bitkitcore_rust_future_complete_void, + _UniffiLib.ffi_bitkitcore_rust_future_free_void, + # lift function + lambda val: None, + + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) +async def pubky_session_list(session_secret: "str",dir_path: "str") -> "typing.List[str]": + + _UniffiConverterString.check_lower(session_secret) + + _UniffiConverterString.check_lower(dir_path) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_list( + _UniffiConverterString.lower(session_secret), + _UniffiConverterString.lower(dir_path)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer, + # lift function + _UniffiConverterSequenceString.lift, + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) +async def pubky_session_put(session_secret: "str",path: "str",content: "bytes") -> None: + + _UniffiConverterString.check_lower(session_secret) + + _UniffiConverterString.check_lower(path) + + _UniffiConverterBytes.check_lower(content) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_session_put( + _UniffiConverterString.lower(session_secret), + _UniffiConverterString.lower(path), + _UniffiConverterBytes.lower(content)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_void, + _UniffiLib.ffi_bitkitcore_rust_future_complete_void, + _UniffiLib.ffi_bitkitcore_rust_future_free_void, + # lift function + lambda val: None, + + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) +async def pubky_sign_in(secret_key_hex: "str") -> "str": + + _UniffiConverterString.check_lower(secret_key_hex) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_in( + _UniffiConverterString.lower(secret_key_hex)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer, + # lift function + _UniffiConverterString.lift, + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) +async def pubky_sign_up(secret_key_hex: "str",homeserver_public_key_z32: "str",signup_code: "typing.Optional[str]") -> "str": + + _UniffiConverterString.check_lower(secret_key_hex) + + _UniffiConverterString.check_lower(homeserver_public_key_z32) + + _UniffiConverterOptionalString.check_lower(signup_code) + + return await _uniffi_rust_call_async( + _UniffiLib.uniffi_bitkitcore_fn_func_pubky_sign_up( + _UniffiConverterString.lower(secret_key_hex), + _UniffiConverterString.lower(homeserver_public_key_z32), + _UniffiConverterOptionalString.lower(signup_code)), + _UniffiLib.ffi_bitkitcore_rust_future_poll_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_complete_rust_buffer, + _UniffiLib.ffi_bitkitcore_rust_future_free_rust_buffer, + # lift function + _UniffiConverterString.lift, + + # Error FFI converter +_UniffiConverterTypePubkyError, + + ) async def refresh_active_cjit_entries() -> "typing.List[IcJitEntry]": """ @@ -19071,11 +19362,13 @@ def wipe_all_transaction_details() -> None: "derive_bitcoin_address", "derive_bitcoin_addresses", "derive_private_key", + "derive_pubky_secret_key", "entropy_to_mnemonic", "estimate_order_fee", "estimate_order_fee_full", "fetch_pubky_contacts", "fetch_pubky_file", + "fetch_pubky_file_string", "fetch_pubky_profile", "generate_mnemonic", "get_activities", @@ -19119,6 +19412,13 @@ def wipe_all_transaction_details() -> None: "onchain_get_transaction_history", "open_channel", "prepare_sweep_transaction", + "pubky_public_key_from_secret", + "pubky_put_with_secret_key", + "pubky_session_delete", + "pubky_session_list", + "pubky_session_put", + "pubky_sign_in", + "pubky_sign_up", "refresh_active_cjit_entries", "refresh_active_orders", "register_device", diff --git a/bindings/python/bitkitcore/libbitkitcore.dylib b/bindings/python/bitkitcore/libbitkitcore.dylib index 965e5dd..5e2381d 100755 Binary files a/bindings/python/bitkitcore/libbitkitcore.dylib and b/bindings/python/bitkitcore/libbitkitcore.dylib differ diff --git a/src/lib.rs b/src/lib.rs index f926ca8..582bce5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1521,6 +1521,104 @@ pub async fn fetch_pubky_contacts(public_key: String) -> Result, Pub })) } +#[uniffi::export] +pub async fn fetch_pubky_file_string(uri: String) -> Result { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::fetch_pubky_file_string(uri).await + }).await.unwrap_or_else(|e| Err(PubkyError::FetchFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub fn derive_pubky_secret_key(seed: Vec) -> Result { + crate::modules::pubky::derive_pubky_secret_key(seed) +} + +#[uniffi::export] +pub fn pubky_public_key_from_secret(secret_key_hex: String) -> Result { + crate::modules::pubky::pubky_public_key_from_secret(secret_key_hex) +} + +#[uniffi::export] +pub async fn pubky_sign_up( + secret_key_hex: String, + homeserver_public_key_z32: String, + signup_code: Option, +) -> Result { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_sign_up(secret_key_hex, homeserver_public_key_z32, signup_code).await + }).await.unwrap_or_else(|e| Err(PubkyError::AuthFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub async fn pubky_sign_in(secret_key_hex: String) -> Result { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_sign_in(secret_key_hex).await + }).await.unwrap_or_else(|e| Err(PubkyError::AuthFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub async fn pubky_session_put( + session_secret: String, + path: String, + content: Vec, +) -> Result<(), PubkyError> { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_session_put(session_secret, path, content).await + }).await.unwrap_or_else(|e| Err(PubkyError::WriteFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub async fn pubky_session_delete( + session_secret: String, + path: String, +) -> Result<(), PubkyError> { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_session_delete(session_secret, path).await + }).await.unwrap_or_else(|e| Err(PubkyError::WriteFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub async fn pubky_put_with_secret_key( + secret_key_hex: String, + path: String, + content: Vec, +) -> Result<(), PubkyError> { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_put_with_secret_key(secret_key_hex, path, content).await + }).await.unwrap_or_else(|e| Err(PubkyError::WriteFailed { + reason: format!("Runtime error: {}", e) + })) +} + +#[uniffi::export] +pub async fn pubky_session_list( + session_secret: String, + dir_path: String, +) -> Result, PubkyError> { + let rt = ensure_runtime(); + rt.spawn(async move { + crate::modules::pubky::pubky_session_list(session_secret, dir_path).await + }).await.unwrap_or_else(|e| Err(PubkyError::FetchFailed { + reason: format!("Runtime error: {}", e) + })) +} + // ============================================================================ // Trezor Hardware Wallet Functions // ============================================================================ diff --git a/src/modules/pubky/errors.rs b/src/modules/pubky/errors.rs index 9b4e6ed..2d9f763 100644 --- a/src/modules/pubky/errors.rs +++ b/src/modules/pubky/errors.rs @@ -1,4 +1,5 @@ #[derive(uniffi::Error, thiserror::Error, Debug)] +#[non_exhaustive] pub enum PubkyError { #[error("Invalid capabilities: {reason}")] InvalidCapabilities { reason: String }, @@ -20,4 +21,10 @@ pub enum PubkyError { #[error("Profile parse failed: {reason}")] ProfileParseFailed { reason: String }, + + #[error("Key error: {reason}")] + KeyError { reason: String }, + + #[error("Write failed: {reason}")] + WriteFailed { reason: String }, } diff --git a/src/modules/pubky/keys.rs b/src/modules/pubky/keys.rs new file mode 100644 index 0000000..18ea5e2 --- /dev/null +++ b/src/modules/pubky/keys.rs @@ -0,0 +1,37 @@ +use bitcoin::hashes::{hmac, sha256, Hash, HashEngine, HmacEngine}; +use pubky::Keypair; + +use super::errors::PubkyError; + +/// Reconstruct a [`Keypair`] from a hex-encoded 32-byte secret key. +pub(super) fn keypair_from_hex(secret_key_hex: &str) -> Result { + let bytes = hex::decode(secret_key_hex) + .map_err(|e| PubkyError::KeyError { reason: e.to_string() })?; + + let secret: [u8; 32] = bytes.try_into().map_err(|v: Vec| PubkyError::KeyError { + reason: format!("expected 32 bytes, got {}", v.len()), + })?; + + Ok(Keypair::from_secret(&secret)) +} + +/// Derive a Pubky Ed25519 secret key from a BIP39 seed using HMAC-SHA256. +pub fn derive_pubky_secret_key(seed: Vec) -> Result { + if seed.len() != 64 { + return Err(PubkyError::KeyError { + reason: format!("expected 64-byte BIP39 seed, got {}", seed.len()), + }); + } + + let mut engine = hmac::HmacEngine::::new(b"paykit/pubky"); + engine.input(&seed); + let result = hmac::Hmac::::from_engine(engine); + + Ok(hex::encode(result.to_byte_array())) +} + +/// Derive the z32-encoded public key from a hex-encoded secret key. +pub fn pubky_public_key_from_secret(secret_key_hex: String) -> Result { + let kp = keypair_from_hex(&secret_key_hex)?; + Ok(kp.public_key().z32()) +} diff --git a/src/modules/pubky/mod.rs b/src/modules/pubky/mod.rs index c036f0f..b52063a 100644 --- a/src/modules/pubky/mod.rs +++ b/src/modules/pubky/mod.rs @@ -1,11 +1,15 @@ mod auth; mod errors; +mod keys; mod profile; mod resolve; +mod session; #[cfg(test)] mod tests; pub use auth::*; pub use errors::*; +pub use keys::*; pub use profile::*; pub use resolve::*; +pub use session::*; diff --git a/src/modules/pubky/resolve.rs b/src/modules/pubky/resolve.rs index 7153723..e990d22 100644 --- a/src/modules/pubky/resolve.rs +++ b/src/modules/pubky/resolve.rs @@ -20,6 +20,14 @@ pub fn resolve_pubky_url(uri: String) -> Result { Ok(url.to_string()) } +/// Fetch a public resource from a `pubky://` URI and return as a UTF-8 string. +pub async fn fetch_pubky_file_string(uri: String) -> Result { + let bytes = fetch_pubky_file(uri).await?; + String::from_utf8(bytes).map_err(|e| PubkyError::FetchFailed { + reason: e.to_string(), + }) +} + /// Fetch a public resource from a `pubky://` URI and return its raw bytes. pub async fn fetch_pubky_file(uri: String) -> Result, PubkyError> { let pubky = get_pubky()?; @@ -28,12 +36,12 @@ pub async fn fetch_pubky_file(uri: String) -> Result, PubkyError> { .public_storage() .get(&uri) .await - .map_err(|e| PubkyError::ResolutionFailed { reason: e.to_string() })?; + .map_err(|e| PubkyError::FetchFailed { reason: e.to_string() })?; let bytes = response .bytes() .await - .map_err(|e| PubkyError::ResolutionFailed { reason: e.to_string() })?; + .map_err(|e| PubkyError::FetchFailed { reason: e.to_string() })?; Ok(bytes.to_vec()) } diff --git a/src/modules/pubky/session.rs b/src/modules/pubky/session.rs new file mode 100644 index 0000000..c6885b1 --- /dev/null +++ b/src/modules/pubky/session.rs @@ -0,0 +1,125 @@ +use pubky::{PublicKey, PubkySession}; + +use super::errors::PubkyError; +use super::keys::keypair_from_hex; +use super::resolve::get_pubky; + +/// Sign up on a homeserver and return the session secret (`":"`). +pub async fn pubky_sign_up( + secret_key_hex: String, + homeserver_public_key_z32: String, + signup_code: Option, +) -> Result { + let kp = keypair_from_hex(&secret_key_hex)?; + + let homeserver_pk = PublicKey::try_from_z32(&homeserver_public_key_z32) + .map_err(|e| PubkyError::KeyError { reason: e.to_string() })?; + + let pubky = get_pubky()?; + let signer = pubky.signer(kp); + + let session = signer + .signup(&homeserver_pk, signup_code.as_deref()) + .await + .map_err(|e| PubkyError::AuthFailed { reason: e.to_string() })?; + + Ok(session.export_secret()) +} + +/// Re-authenticate with an existing secret key and return a new session secret. +pub async fn pubky_sign_in(secret_key_hex: String) -> Result { + let kp = keypair_from_hex(&secret_key_hex)?; + + let pubky = get_pubky()?; + let signer = pubky.signer(kp); + + let session = signer + .signin() + .await + .map_err(|e| PubkyError::AuthFailed { reason: e.to_string() })?; + + Ok(session.export_secret()) +} + +/// Write content to a path on the user's homeserver using their session. +pub async fn pubky_session_put( + session_secret: String, + path: String, + content: Vec, +) -> Result<(), PubkyError> { + let session = import_session(&session_secret).await?; + + session + .storage() + .put(path.as_str(), content) + .await + .map_err(|e| PubkyError::WriteFailed { reason: e.to_string() })?; + + Ok(()) +} + +/// Delete a resource at path on the user's homeserver. +pub async fn pubky_session_delete( + session_secret: String, + path: String, +) -> Result<(), PubkyError> { + let session = import_session(&session_secret).await?; + + session + .storage() + .delete(path.as_str()) + .await + .map_err(|e| PubkyError::WriteFailed { reason: format!("delete failed: {e}") })?; + + Ok(()) +} + +/// Sign in with a secret key and write content in one shot (e.g., redirect.json on old identity). +pub async fn pubky_put_with_secret_key( + secret_key_hex: String, + path: String, + content: Vec, +) -> Result<(), PubkyError> { + let kp = keypair_from_hex(&secret_key_hex)?; + + let pubky = get_pubky()?; + let signer = pubky.signer(kp); + + let session = signer + .signin() + .await + .map_err(|e| PubkyError::AuthFailed { reason: e.to_string() })?; + + session + .storage() + .put(path.as_str(), content) + .await + .map_err(|e| PubkyError::WriteFailed { reason: e.to_string() })?; + + Ok(()) +} + +/// List resources in a directory on the user's homeserver. `dir_path` must end with `/`. +pub async fn pubky_session_list( + session_secret: String, + dir_path: String, +) -> Result, PubkyError> { + let session = import_session(&session_secret).await?; + + let entries = session + .storage() + .list(dir_path.as_str()) + .map_err(|e| PubkyError::FetchFailed { reason: e.to_string() })? + .send() + .await + .map_err(|e| PubkyError::FetchFailed { reason: e.to_string() })?; + + Ok(entries.iter().map(|e| e.to_pubky_url()).collect()) +} + +/// Import a session from its secret token, validating it against the homeserver. +async fn import_session(session_secret: &str) -> Result { + PubkySession::import_secret(session_secret, None) + .await + .map_err(|e| PubkyError::AuthFailed { reason: e.to_string() }) +} diff --git a/src/modules/pubky/tests.rs b/src/modules/pubky/tests.rs index 919cba6..37f47c9 100644 --- a/src/modules/pubky/tests.rs +++ b/src/modules/pubky/tests.rs @@ -69,8 +69,8 @@ async fn fetch_malformed_uri_returns_error() { let result = fetch_pubky_file("totally-not-a-pubky-uri".into()).await; assert!(result.is_err()); match result.unwrap_err() { - PubkyError::ResolutionFailed { .. } => {} - other => panic!("expected ResolutionFailed, got: {other:?}"), + PubkyError::FetchFailed { .. } => {} + other => panic!("expected FetchFailed, got: {other:?}"), } } @@ -242,3 +242,178 @@ async fn fetch_contacts_empty_key_returns_fetch_failed() { } } +// ============================================================================ +// Key derivation tests +// ============================================================================ + +#[test] +fn derive_secret_key_returns_valid_hex() { + let seed = vec![0xABu8; 64]; + let hex_str = derive_pubky_secret_key(seed).unwrap(); + assert_eq!(hex_str.len(), 64); // 32 bytes = 64 hex chars + assert!(hex::decode(&hex_str).is_ok()); +} + +#[test] +fn derive_secret_key_is_deterministic() { + let seed = vec![0x42u8; 64]; + let key1 = derive_pubky_secret_key(seed.clone()).unwrap(); + let key2 = derive_pubky_secret_key(seed).unwrap(); + assert_eq!(key1, key2); +} + +#[test] +fn derive_secret_key_different_seeds_produce_different_keys() { + let key1 = derive_pubky_secret_key(vec![0x01u8; 64]).unwrap(); + let key2 = derive_pubky_secret_key(vec![0x02u8; 64]).unwrap(); + assert_ne!(key1, key2); +} + +#[test] +fn derive_secret_key_rejects_short_seed() { + let result = derive_pubky_secret_key(vec![0u8; 32]); + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +#[test] +fn derive_secret_key_rejects_empty_seed() { + let result = derive_pubky_secret_key(vec![]); + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +#[test] +fn public_key_from_derived_secret_roundtrips() { + let seed = vec![0xCDu8; 64]; + let secret = derive_pubky_secret_key(seed).unwrap(); + let pk1 = pubky_public_key_from_secret(secret.clone()).unwrap(); + let pk2 = pubky_public_key_from_secret(secret).unwrap(); + assert_eq!(pk1, pk2); + assert!(!pk1.is_empty()); + // z32-encoded public keys are 52 characters + assert_eq!(pk1.len(), 52); +} + +#[test] +fn public_key_from_invalid_hex_returns_error() { + let result = pubky_public_key_from_secret("not-valid-hex".into()); + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +#[test] +fn public_key_from_empty_hex_returns_error() { + let result = pubky_public_key_from_secret(String::new()); + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +#[test] +fn public_key_from_wrong_length_hex_returns_error() { + let result = pubky_public_key_from_secret("aabb".into()); // only 2 bytes, need 32 + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +// ============================================================================ +// Sign up / sign in error tests +// ============================================================================ + +#[tokio::test] +async fn sign_up_invalid_secret_key_returns_error() { + let result = pubky_sign_up("bad-hex".into(), "some-homeserver".into(), None).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +#[tokio::test] +async fn sign_in_invalid_secret_key_returns_error() { + let result = pubky_sign_in("bad-hex".into()).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +// ============================================================================ +// Put with secret key error tests +// ============================================================================ + +#[tokio::test] +async fn put_with_secret_key_invalid_key_returns_error() { + let result = pubky_put_with_secret_key("bad-hex".into(), "/pub/test".into(), vec![]).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::KeyError { .. } => {} + other => panic!("expected KeyError, got: {other:?}"), + } +} + +// ============================================================================ +// Session operation error tests +// ============================================================================ + +#[tokio::test] +async fn session_put_invalid_session_returns_error() { + let result = pubky_session_put("bad-session".into(), "/pub/test".into(), vec![]).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::AuthFailed { .. } => {} + other => panic!("expected AuthFailed, got: {other:?}"), + } +} + +#[tokio::test] +async fn session_delete_invalid_session_returns_error() { + let result = pubky_session_delete("bad-session".into(), "/pub/test".into()).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::AuthFailed { .. } => {} + other => panic!("expected AuthFailed, got: {other:?}"), + } +} + +#[tokio::test] +async fn session_list_invalid_session_returns_error() { + let result = pubky_session_list("bad-session".into(), "/pub/test/".into()).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::AuthFailed { .. } => {} + other => panic!("expected AuthFailed, got: {other:?}"), + } +} + +// ============================================================================ +// String fetch tests +// ============================================================================ + +#[tokio::test] +async fn fetch_file_string_malformed_uri_returns_error() { + let result = fetch_pubky_file_string("not-a-uri".into()).await; + assert!(result.is_err()); + match result.unwrap_err() { + PubkyError::FetchFailed { .. } => {} + other => panic!("expected FetchFailed, got: {other:?}"), + } +} +