- Notifications
You must be signed in to change notification settings - Fork27
RFC-compliant TOTP implementation with ease of use as a goal and additionnal QoL features.
License
constantoine/totp-rs
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This library permits the creation of 2FA authentification tokens per TOTP, the verification of said tokens, with configurable time skew, validity time of each token, algorithm and number of digits! Default features are kept as lightweight as possible to ensure small binaries and short compilation time.
It now supports parsingotpauth URLs into a totp object, with sane default values.
Be aware that some authenticator apps will accept theSHA256
andSHA512
algorithms but silently fallback toSHA1
which will make thecheck()
function fail due to mismatched algorithms.
With optional feature "qr", you can use it to generate a base64 png qrcode. This will enable featureotpauth
.
With optional feature "otpauth", support parsing the TOTP parameters from anotpauth
URL, and generating anotpauth
URL. It adds 2 fields toTOTP
.
With optional feature "serde_support", library-defined typesTOTP
andAlgorithm
and will be Deserialize-able and Serialize-able.
With optional feature "gen_secret", a secret will be generated for you to store in database.
Securely zero secret information when the TOTP struct is dropped.
Add support for Steam TOTP tokens.
- Understanding Secret
- Generate a token
- Enable qrcode generation
- Enable serde support
- Enable otpauth url support
- Enable gen_secret support
- With RFC-6238 compliant default
- New TOTP from steam secret
This new type was added as a disambiguation between Raw and already base32 encoded secrets.
Secret::Raw("TestSecretSuperSecret".as_bytes().to_vec())
Is equivalent to
Secret::Encoded("KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ".to_string())
Add it to yourCargo.toml
:
[dependencies]totp-rs ="^5.0"
You can then do something like:
use std::time::SystemTime;use totp_rs::{Algorithm,TOTP,Secret};fnmain(){let totp =TOTP::new(Algorithm::SHA1,6,1,30,Secret::Raw("TestSecretSuperSecret".as_bytes().to_vec()).to_bytes().unwrap(),).unwrap();let token = totp.generate_current().unwrap();println!("{}", token);}
Which is equivalent to:
use std::time::SystemTime;use totp_rs::{Algorithm,TOTP,Secret};fnmain(){let totp =TOTP::new(Algorithm::SHA1,6,1,30,Secret::Encoded("KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ".to_string()).to_bytes().unwrap(),).unwrap();let token = totp.generate_current().unwrap();println!("{}", token);}
Add it to yourCargo.toml
:
[dependencies.totp-rs]version ="^5.3"features = ["qr"]
You can then do something like:
use totp_rs::{Algorithm,TOTP,Secret};fnmain(){let totp =TOTP::new(Algorithm::SHA1,6,1,30,Secret::Encoded("KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ".to_string()).to_bytes().unwrap(),Some("Github".to_string()),"constantoine@github.com".to_string(),).unwrap();let qr_code = totp.get_qr_base64()?;println!("{}", qr_code);}
Add it to yourCargo.toml
:
[dependencies.totp-rs]version ="^5.0"features = ["serde_support"]
Add it to yourCargo.toml
:
[dependencies.totp-rs]version ="^5.0"features = ["otpauth"]
You can then do something like:
use totp_rs::TOTP;fnmain(){let otpauth ="otpauth://totp/GitHub:constantoine@github.com?secret=KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ&issuer=GitHub";let totp =TOTP::from_url(otpauth).unwrap();println!("{}", totp.generate_current().unwrap());}
Add it to yourCargo.toml
:
[dependencies.totp-rs]version ="^5.3"features = ["gen_secret"]
You can then do something like:
use totp_rs::{Algorithm,TOTP,Secret};fnmain(){let totp =TOTP::new(Algorithm::SHA1,6,1,30,Secret::default().to_bytes().unwrap(),Some("Github".to_string()),"constantoine@github.com".to_string(),).unwrap();let qr_code = totp.get_qr_base64()?;println!("{}", qr_code);}
Which is equivalent to
use totp_rs::{Algorithm,TOTP,Secret};fnmain(){let totp =TOTP::new(Algorithm::SHA1,6,1,30,Secret::generate_secret().to_bytes().unwrap(),Some("Github".to_string()),"constantoine@github.com".to_string(),).unwrap();let qr_code = totp.get_qr_base64()?;println!("{}", qr_code);}
You can do something like this
use totp_rs::{Algorithm,TOTP,Secret,Rfc6238};fnmain(){letmut rfc =Rfc6238::with_defaults(Secret::Encoded("KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ".to_string()).to_bytes().unwrap(),).unwrap();// optional, set digits rfc.digits(8).unwrap();// create a TOTP from rfclet totp =TOTP::from_rfc6238(rfc).unwrap();let code = totp.generate_current().unwrap();println!("code: {}", code);}
Withgen_secret
feature, you can go even further and have all values by default and a secure secret.
Note: Withotpauth
feature,TOTP.issuer
will beNone
, andTOTP.account_name
will be""
. Be sure to set those fields before generating an URL/QRCode
fnmain(){let totp =TOTP::default();let code = totp.generate_current().unwrap();println!("code: {}", code);}
Add it to yourCargo.toml
:
[dependencies.totp-rs]version ="^5.3"features = ["steam"]
You can then do something like:
use totp_rs::{TOTP,Secret};fnmain(){let totp =TOTP::new_steam(Secret::Encoded("KRSXG5CTMVRXEZLUKN2XAZLSKNSWG4TFOQ".to_string()).to_bytes().unwrap(),).unwrap();let code = totp.generate_current().unwrap();println!("code: {}", code);}
About
RFC-compliant TOTP implementation with ease of use as a goal and additionnal QoL features.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors12
Uh oh!
There was an error while loading.Please reload this page.