diff options
15 files changed, 102 insertions, 32 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt index 9ac2a761ff..805801946d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt @@ -156,7 +156,7 @@ fun VpnSettingsScreen( toastMessagesSharedFlow: SharedFlow<String>, onSelectObfuscationSetting: (selectedObfuscation: SelectedObfuscation) -> Unit = {}, onObfuscationInfoClick: () -> Unit = {}, - onSelectQuantumResistanceSetting: (quantumResistant: Boolean?) -> Unit = {}, + onSelectQuantumResistanceSetting: (quantumResistant: QuantumResistantState) -> Unit = {}, onQuantumResistanceInfoClicked: () -> Unit = {} ) { val cellVerticalSpacing = dimensionResource(id = R.dimen.cell_label_vertical_padding) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt index c2c7d074fd..1515b2d19a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt @@ -1,6 +1,7 @@ package net.mullvad.mullvadvpn.compose.state import net.mullvad.mullvadvpn.model.DefaultDnsOptions +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation import net.mullvad.mullvadvpn.viewmodel.CustomDnsItem import net.mullvad.mullvadvpn.viewmodel.StagedDns @@ -14,7 +15,7 @@ sealed interface VpnSettingsUiState { val contentBlockersOptions: DefaultDnsOptions val isAllowLanEnabled: Boolean val selectedObfuscation: SelectedObfuscation - val quantumResistant: Boolean? + val quantumResistant: QuantumResistantState data class DefaultUiState( override val mtu: String = "", @@ -25,7 +26,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class MtuDialogUiState( @@ -38,7 +39,7 @@ sealed interface VpnSettingsUiState { override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val mtuEditValue: String, override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class DnsDialogUiState( @@ -51,7 +52,7 @@ sealed interface VpnSettingsUiState { override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val stagedDns: StagedDns, override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class LocalNetworkSharingInfoDialogUiState( @@ -63,7 +64,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class ContentBlockersInfoDialogUiState( @@ -75,7 +76,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class CustomDnsInfoDialogUiState( @@ -87,7 +88,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class MalwareInfoDialogUiState( @@ -99,7 +100,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class ObfuscationInfoDialogUiState( @@ -111,7 +112,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class QuantumResistanceInfoDialogUiState( @@ -123,6 +124,6 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt index c9bd699c12..7ff4a63ff4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt @@ -7,6 +7,7 @@ import kotlinx.parcelize.Parcelize import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.LocationConstraint import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState // Requests that the service can handle sealed class Request : Message.RequestMessage() { @@ -85,7 +86,9 @@ sealed class Request : Message.RequestMessage() { @Parcelize data class SetObfuscationSettings(val settings: ObfuscationSettings?) : Request() - @Parcelize data class SetWireGuardQuantumResistant(val quantumResistant: Boolean?) : Request() + @Parcelize + data class SetWireGuardQuantumResistant(val quantumResistant: QuantumResistantState) : + Request() companion object { private const val MESSAGE_KEY = "request" diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt new file mode 100644 index 0000000000..a19267388a --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +enum class QuantumResistantState : Parcelable { + Auto, + On, + Off +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt index 47c8c54a57..f4a869a4ea 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt @@ -4,4 +4,5 @@ import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize -data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: Boolean?) : Parcelable +data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: QuantumResistantState) : + Parcelable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt index cde1c698ca..ac9637c683 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt @@ -14,6 +14,7 @@ import net.mullvad.mullvadvpn.model.DefaultDnsOptions import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.DnsState import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager import net.mullvad.mullvadvpn.ui.serviceconnection.customDns @@ -54,7 +55,7 @@ class SettingsRepository( serviceConnectionManager.settingsListener()?.wireguardMtu = value } - fun setWireguardQuantumResistant(value: Boolean?) { + fun setWireguardQuantumResistant(value: QuantumResistantState) { serviceConnectionManager.settingsListener()?.wireguardQuantumResistant = value } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt index d46a71d805..089e13ef31 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt @@ -14,6 +14,7 @@ import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.GetAccountDataResult import net.mullvad.mullvadvpn.model.LoginResult import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.RelayList import net.mullvad.mullvadvpn.model.RelaySettingsUpdate import net.mullvad.mullvadvpn.model.RemoveDeviceEvent @@ -178,6 +179,10 @@ class MullvadDaemon( setObfuscationSettings(daemonInterfaceAddress, settings) } + fun setQuantumResistant(quantumResistant: QuantumResistantState) { + setQuantumResistantTunnel(daemonInterfaceAddress, quantumResistant) + } + fun onDestroy() { onSettingsChange.unsubscribeAll() onTunnelStateChange.unsubscribeAll() @@ -255,6 +260,11 @@ class MullvadDaemon( settings: ObfuscationSettings? ) + private external fun setQuantumResistantTunnel( + daemonInterfaceAddress: Long, + quantumResistant: QuantumResistantState + ) + private fun notifyAppVersionInfoEvent(appVersionInfo: AppVersionInfo) { onAppVersionInfoChange?.invoke(appVersionInfo) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt index cd0da7a3fc..fec7578a05 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt @@ -1,6 +1,5 @@ package net.mullvad.mullvadvpn.service.endpoint -import android.util.Log import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.Channel @@ -19,6 +18,7 @@ class SettingsListener(endpoint: ServiceEndpoint) { class SetAutoConnect(val autoConnect: Boolean) : Command() class SetWireGuardMtu(val mtu: Int?) : Command() class SetObfuscationSettings(val settings: ObfuscationSettings?) : Command() + class SetQuantumResistant(val quantumResistant: QuantumResistantState) : Command() } private val commandChannel = spawnActor() @@ -62,8 +62,9 @@ class SettingsListener(endpoint: ServiceEndpoint) { } registerHandler(Request.SetWireGuardQuantumResistant::class) { request -> - // TODO - Log.d("Remove this", "Set quantum resistant ${request.quantumResistant}") + commandChannel.trySendBlocking( + Command.SetQuantumResistant(request.quantumResistant) + ) } } } @@ -127,6 +128,8 @@ class SettingsListener(endpoint: ServiceEndpoint) { is Command.SetWireGuardMtu -> daemon.await().setWireguardMtu(command.mtu) is Command.SetObfuscationSettings -> daemon.await().setObfuscationSettings(command.settings) + is Command.SetQuantumResistant -> + daemon.await().setQuantumResistant(command.quantumResistant) } } } catch (exception: ClosedReceiveChannelException) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt index 5cfb4f1f0b..4146c66ce8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt @@ -6,6 +6,7 @@ import net.mullvad.mullvadvpn.ipc.EventDispatcher import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.RelaySettings import net.mullvad.mullvadvpn.model.Settings import net.mullvad.talpid.util.EventNotifier @@ -35,8 +36,10 @@ class SettingsListener(private val connection: Messenger, eventDispatcher: Event connection.send(Request.SetWireGuardMtu(value).message) } - var wireguardQuantumResistant: Boolean? - get() = settingsNotifier.latestEvent?.tunnelOptions?.wireguard?.quantumResistant + var wireguardQuantumResistant: QuantumResistantState + get() = + settingsNotifier.latestEvent?.tunnelOptions?.wireguard?.quantumResistant + ?: QuantumResistantState.Off set(value) { connection.send(Request.SetWireGuardQuantumResistant(value).message) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt index b8ff734287..81811722c7 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt @@ -22,6 +22,7 @@ import net.mullvad.mullvadvpn.model.Constraint import net.mullvad.mullvadvpn.model.DefaultDnsOptions import net.mullvad.mullvadvpn.model.DnsState import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.model.Udp2TcpObfuscationSettings @@ -56,7 +57,7 @@ class VpnSettingsViewModel( selectedObfuscation = settings?.selectedObfuscationSettings() ?: SelectedObfuscation.Off, dialogState = dialogState, - quantumResistant = settings?.quantumResistant() + quantumResistant = settings?.quantumResistant() ?: QuantumResistantState.Off ) } .stateIn( @@ -306,7 +307,7 @@ class VpnSettingsViewModel( dialogState.update { VpnSettingsDialogState.ObfuscationInfoDialog } } - fun onSelectQuantumResistanceSetting(quantumResistant: Boolean?) { + fun onSelectQuantumResistanceSetting(quantumResistant: QuantumResistantState) { viewModelScope.launch(dispatcher) { repository.setWireguardQuantumResistant(quantumResistant) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt index 86f0c980eb..520296784a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt @@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel import net.mullvad.mullvadvpn.compose.state.VpnSettingsUiState import net.mullvad.mullvadvpn.model.DefaultDnsOptions +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation data class VpnSettingsViewModelState( @@ -14,7 +15,7 @@ data class VpnSettingsViewModelState( val contentBlockersOptions: DefaultDnsOptions, val selectedObfuscation: SelectedObfuscation, val dialogState: VpnSettingsDialogState, - val quantumResistant: Boolean? + val quantumResistant: QuantumResistantState ) { fun toUiState(): VpnSettingsUiState { return when (dialogState) { @@ -140,7 +141,7 @@ data class VpnSettingsViewModelState( isAllowLanEnabled = false, dialogState = VpnSettingsDialogState.NoDialog, selectedObfuscation = SelectedObfuscation.Auto, - quantumResistant = null + quantumResistant = QuantumResistantState.Off ) } } diff --git a/mullvad-jni/src/classes.rs b/mullvad-jni/src/classes.rs index eea0dd6544..d4765e78a4 100644 --- a/mullvad-jni/src/classes.rs +++ b/mullvad-jni/src/classes.rs @@ -30,6 +30,7 @@ pub const CLASSES: &[&str] = &[ "net/mullvad/mullvadvpn/model/LocationConstraint$Hostname", "net/mullvad/mullvadvpn/model/ObfuscationSettings", "net/mullvad/mullvadvpn/model/PublicKey", + "net/mullvad/mullvadvpn/model/QuantumResistantState", "net/mullvad/mullvadvpn/model/Relay", "net/mullvad/mullvadvpn/model/RelayConstraints", "net/mullvad/mullvadvpn/model/RelayEndpointData$Bridge", diff --git a/mullvad-jni/src/daemon_interface.rs b/mullvad-jni/src/daemon_interface.rs index 78e50c3d86..771c432a7a 100644 --- a/mullvad-jni/src/daemon_interface.rs +++ b/mullvad-jni/src/daemon_interface.rs @@ -10,6 +10,7 @@ use mullvad_types::{ states::{TargetState, TunnelState}, version::AppVersionInfo, wireguard, + wireguard::QuantumResistantState, }; #[derive(Debug, err_derive::Error)] @@ -326,6 +327,22 @@ impl DaemonInterface { .map_err(|_| Error::UpdateSettings) } + pub fn set_quantum_resistant_tunnel( + &self, + quantum_resistant: QuantumResistantState, + ) -> Result<()> { + let (tx, rx) = oneshot::channel(); + + self.send_command(DaemonCommand::SetQuantumResistantTunnel( + tx, + quantum_resistant, + ))?; + + block_on(rx) + .map_err(|_| Error::NoResponse)? + .map_err(|_| Error::UpdateSettings) + } + fn send_command(&self, command: DaemonCommand) -> Result<()> { self.command_sender.send(command).map_err(Error::NoDaemon) } diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index cb8ddb9e5f..5d062ffbbc 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -1238,6 +1238,29 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setObfu } } +#[no_mangle] +#[allow(non_snake_case)] +pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setQuantumResistantTunnel( + env: JNIEnv<'_>, + _: JObject<'_>, + daemon_interface_address: jlong, + quantumResistantState: JObject<'_>, +) { + let env = JnixEnv::from(env); + + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { + let quantum_resistant = FromJava::from_java(&env, quantumResistantState); + + if let Err(error) = daemon_interface.set_quantum_resistant_tunnel(quantum_resistant) { + log::error!( + "{}", + error.display_chain_with_msg("Failed to update quantum resistant tunnel state") + ); + } + } +} + fn log_request_error(request: &str, error: &daemon_interface::Error) { match error { daemon_interface::Error::Api(RestError::Aborted) => { diff --git a/mullvad-types/src/wireguard.rs b/mullvad-types/src/wireguard.rs index 2e699c344e..9fdda6cb20 100644 --- a/mullvad-types/src/wireguard.rs +++ b/mullvad-types/src/wireguard.rs @@ -1,7 +1,7 @@ #![allow(clippy::identity_op)] use chrono::{offset::Utc, DateTime}; #[cfg(target_os = "android")] -use jnix::IntoJava; +use jnix::{FromJava, IntoJava}; use serde::{Deserialize, Deserializer, Serialize}; use std::{convert::TryFrom, fmt, str::FromStr, time::Duration}; use talpid_types::net::wireguard; @@ -15,6 +15,8 @@ pub const DEFAULT_ROTATION_INTERVAL: Duration = MAX_ROTATION_INTERVAL; const QUANTUM_RESISTANT_AUTO_STATE: bool = false; #[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)] +#[cfg_attr(target_os = "android", derive(IntoJava, FromJava))] +#[cfg_attr(target_os = "android", jnix(package = "net.mullvad.mullvadvpn.model"))] #[serde(rename_all = "lowercase")] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] pub enum QuantumResistantState { @@ -201,14 +203,6 @@ pub struct TunnelOptions { #[serde(rename = "wireguard_nt")] pub use_wireguard_nt: bool, /// Obtain a PSK using the relay config client. - #[cfg_attr( - target_os = "android", - jnix(map = "|state| match state { - QuantumResistantState::Auto => None, - QuantumResistantState::On => Some(true), - QuantumResistantState::Off => Some(false), - }") - )] pub quantum_resistant: QuantumResistantState, /// Interval used for automatic key rotation #[cfg_attr(target_os = "android", jnix(skip))] |
