From f9a2aaaec4f01464d1f2c51f13ae3af298418e90 Mon Sep 17 00:00:00 2001 From: Jujumba Date: Sun, 24 Mar 2024 00:18:22 +0100 Subject: [PATCH] argon2: add hash verification --- src/crypto_helper/computations.rs | 9 +++--- src/crypto_helper/input/argon2.rs | 49 +++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/crypto_helper/computations.rs b/src/crypto_helper/computations.rs index f6923991..97b6e847 100644 --- a/src/crypto_helper/computations.rs +++ b/src/crypto_helper/computations.rs @@ -114,17 +114,18 @@ pub fn process_argon2(input: &Argon2Input) -> Result, String> { let hash = argon2ctx .hash_password(&input.data, salt.as_salt()) - .map_err(|err| err.to_string())?.to_string(); + .map_err(|err| err.to_string())? + .to_string(); Ok(hash.into_bytes()) } Argon2Action::Verify(data) => { let b64 = base64::encode_config(data, config); - let hash = argon2::PasswordHash::parse(&b64, argon2::password_hash::Encoding::B64) - .map_err(|e| e.to_string())?; + let str = String::from_utf8(data.clone()).map_err(|e| e.to_string())?; + let hash = argon2::PasswordHash::new(&str).map_err(|e| e.to_string())?; - if argon2::Argon2::default().verify_password(data, &hash).is_ok() { + if argon2::Argon2::default().verify_password(&input.data, &hash).is_ok() { Ok(vec![1]) } else { Ok(vec![0]) diff --git a/src/crypto_helper/input/argon2.rs b/src/crypto_helper/input/argon2.rs index 42728f89..31eb7dff 100644 --- a/src/crypto_helper/input/argon2.rs +++ b/src/crypto_helper/input/argon2.rs @@ -19,7 +19,6 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html { let input_setter = props.argon2_input_setter.clone(); let action: Argon2Action = props.input.action.clone(); let setter = Callback::from(move |data| { - log::debug!("setting data: {data:?}"); input_setter.emit(Argon2InputData { action: action.clone(), data, @@ -31,7 +30,6 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html { let action: Argon2Action = props.input.action.clone(); let salt_setter = Callback::from(move |salt| { - log::debug!("setting salt with data: {data:?}"); if let Argon2Action::Hash(hash_action) = action.clone() { input_setter.emit(Argon2InputData { action: Argon2Action::Hash(Argon2HashAction { salt, ..hash_action }), @@ -40,6 +38,19 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html { } }); + let data: Vec = props.input.data.clone(); + let input_setter = props.argon2_input_setter.clone(); + let action: Argon2Action = props.input.action.clone(); + + let hash_setter = Callback::from(move |hash: Vec| { + if let Argon2Action::Verify(_) = action.clone() { + input_setter.emit(Argon2InputData { + action: Argon2Action::Verify(hash), + data: data.clone(), + }) + } + }); + let input_setter = props.argon2_input_setter.clone(); let input = props.input.clone(); let on_hash_verify_switch = Callback::from(move |mode: bool| { @@ -78,20 +89,26 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html { {"verify"} {build_byte_input(data, setter, Some(BytesFormat::Ascii), Some("password".into()))} - {if let Argon2Action::Hash(hash_action) = &props.input.action {html! { - <> - {build_byte_input(hash_action.salt.clone(), salt_setter, Some(BytesFormat::Ascii), Some("salt".into()))} - - - - }} else {html! {}}} + {match &props.input.action { + Argon2Action::Hash(hash_action) => html! { + <> + {build_byte_input(hash_action.salt.clone(), salt_setter, Some(BytesFormat::Ascii), Some("salt".into()))} + + + + }, + Argon2Action::Verify(hash) => html! { + <> + {build_byte_input(hash.clone(), hash_setter, Some(BytesFormat::Ascii), Some("hash".into()))} + + }}} } }