Add TOTP::new_unchecked methods
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
diff --git a/src/lib.rs b/src/lib.rs
index cc71cc1..1708d14 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -265,7 +265,7 @@ impl TOTP {
if account_name.contains(':') {
return Err(TotpUrlError::AccountName(account_name));
}
- Ok(TOTP {
+ Ok(Self::new_unchecked(
algorithm,
digits,
skew,
@@ -273,7 +273,38 @@ impl TOTP {
secret,
issuer,
account_name,
- })
+ ))
+ }
+
+ #[cfg(feature = "otpauth")]
+ /// Will create a new instance of TOTP with given parameters. See [the doc](struct.TOTP.html#fields) for reference as to how to choose those values. This is unchecked and does not check the `digits` and `secret` size
+ ///
+ /// # Description
+ /// * `secret`: expect a non-encoded value, to pass in base32 string use `Secret::Encoded(String)`
+ ///
+ /// ```rust
+ /// use totp_rs::{Secret, TOTP, Algorithm};
+ /// let secret = Secret::Encoded("OBWGC2LOFVZXI4TJNZTS243FMNZGK5BNGEZDG".to_string());
+ /// let totp = TOTP::new_unchecked(Algorithm::SHA1, 6, 1, 30, secret.to_bytes().unwrap(), None, "".to_string()).unwrap();
+ /// ```
+ pub fn new_unchecked(
+ algorithm: Algorithm,
+ digits: usize,
+ skew: u8,
+ step: u64,
+ secret: Vec<u8>,
+ issuer: Option<String>,
+ account_name: String,
+ ) -> TOTP {
+ TOTP {
+ algorithm,
+ digits,
+ skew,
+ step,
+ secret,
+ issuer,
+ account_name,
+ }
}
#[cfg(not(feature = "otpauth"))]
@@ -302,13 +333,34 @@ impl TOTP {
) -> Result<TOTP, TotpUrlError> {
crate::rfc::assert_digits(&digits)?;
crate::rfc::assert_secret_length(secret.as_ref())?;
- Ok(TOTP {
+ Ok(Self::new_unchecked(algorithm, digits, skew, step, secret))
+ }
+
+ #[cfg(not(feature = "otpauth"))]
+ /// Will create a new instance of TOTP with given parameters. See [the doc](struct.TOTP.html#fields) for reference as to how to choose those values. This is unchecked and does not check the `digits` and `secret` size
+ ///
+ /// # Description
+ /// * `secret`: expect a non-encoded value, to pass in base32 string use `Secret::Encoded(String)`
+ ///
+ /// ```rust
+ /// use totp_rs::{Secret, TOTP, Algorithm};
+ /// let secret = Secret::Encoded("OBWGC2LOFVZXI4TJNZTS243FMNZGK5BNGEZDG".to_string());
+ /// let totp = TOTP::new_unchecked(Algorithm::SHA1, 6, 1, 30, secret.to_bytes().unwrap()).unwrap();
+ /// ```
+ pub fn new_unchecked(
+ algorithm: Algorithm,
+ digits: usize,
+ skew: u8,
+ step: u64,
+ secret: Vec<u8>,
+ ) -> TOTP {
+ TOTP {
algorithm,
digits,
skew,
step,
secret,
- })
+ }
}
/// Will create a new instance of TOTP from the given [Rfc6238](struct.Rfc6238.html) struct