Skip to content

Commit

Permalink
argon2: add hash verification
Browse files Browse the repository at this point in the history
  • Loading branch information
Jujumba committed Mar 23, 2024
1 parent 4ed099f commit 7e806ba
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 22 deletions.
11 changes: 5 additions & 6 deletions src/crypto_helper/computations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,17 +114,16 @@ pub fn process_argon2(input: &Argon2Input) -> Result<Vec<u8>, 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 str = String::from_utf8(data.clone()).map_err(|e| e.to_string())?;
let hash = argon2::PasswordHash::new(&str).map_err(|e| e.to_string())?;

let hash = argon2::PasswordHash::parse(&b64, argon2::password_hash::Encoding::B64)
.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])
Expand Down
49 changes: 33 additions & 16 deletions src/crypto_helper/input/argon2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 }),
Expand All @@ -40,6 +38,19 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html {
}
});

let data: Vec<u8> = 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<u8>| {
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| {
Expand Down Expand Up @@ -78,20 +89,26 @@ pub fn argon2_input(props: &Argon2InputProps) -> Html {
<span class="total">{"verify"}</span>
</div>
{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()))}
<select onchange={set_version} class="base-input">
<option value="Argon10">{"Argon10"}</option>
<option value="Argon13">{"Argon13"}</option>
</select>
<select onchange={set_variant} class="base-input">
<option value="Argon2i">{"Argon2i"}</option>
<option value="Argon2d">{"Argon2d"}</option>
<option value="Argon2id">{"Argon2id"}</option>
</select>
</>
}} 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()))}
<select onchange={set_version} class="base-input">
<option value="Argon10">{"Argon10"}</option>
<option value="Argon13">{"Argon13"}</option>
</select>
<select onchange={set_variant} class="base-input">
<option value="Argon2i">{"Argon2i"}</option>
<option value="Argon2d">{"Argon2d"}</option>
<option value="Argon2id">{"Argon2id"}</option>
</select>
</>
},
Argon2Action::Verify(hash) => html! {
<>
{build_byte_input(hash.clone(), hash_setter, Some(BytesFormat::Ascii), Some("hash".into()))}
</>
}}}
</div>
}
}
Expand Down

0 comments on commit 7e806ba

Please sign in to comment.