aboutsummaryrefslogtreecommitdiff
path: root/nitrocli/src/pinentry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'nitrocli/src/pinentry.rs')
-rw-r--r--nitrocli/src/pinentry.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/nitrocli/src/pinentry.rs b/nitrocli/src/pinentry.rs
index d6f000c..e4d2b0d 100644
--- a/nitrocli/src/pinentry.rs
+++ b/nitrocli/src/pinentry.rs
@@ -181,6 +181,37 @@ pub fn inquire_pin(
parse_pinentry_pin(str::from_utf8(&output.stdout)?)
}
+fn check_pin(pin_type: PinType, pin: &str) -> crate::Result<()> {
+ let minimum_length = match pin_type {
+ PinType::Admin => 8,
+ PinType::User => 6,
+ };
+ if pin.len() < minimum_length {
+ Err(Error::Error(format!(
+ "The PIN must be at least {} characters long",
+ minimum_length
+ )))
+ } else {
+ Ok(())
+ }
+}
+
+pub fn choose_pin(pin_entry: &PinEntry) -> crate::Result<String> {
+ clear_pin(pin_entry)?;
+ let new_pin = inquire_pin(pin_entry, Mode::Choose, None)?;
+ clear_pin(pin_entry)?;
+ check_pin(pin_entry.pin_type(), &new_pin)?;
+
+ let confirm_pin = inquire_pin(pin_entry, Mode::Confirm, None)?;
+ clear_pin(pin_entry)?;
+
+ if new_pin != confirm_pin {
+ Err(Error::from("Entered PINs do not match"))
+ } else {
+ Ok(new_pin)
+ }
+}
+
fn parse_pinentry_response<R>(response: R) -> Result<(), Error>
where
R: AsRef<str>,