r2fa

Crates.ior2fa
lib.rsr2fa
version0.5.0
sourcesrc
created_at2015-07-26 15:20:53.542929
updated_at2015-12-16 00:01:56.610782
descriptionRust Two-Factor Authentication (R2FA) is a collection of tools for two-factor authentication.
homepage
repositoryhttps://github.com/breard-r/r2fa
max_upload_size
id2684
size58,353
Rodolphe Bréard (breard-r)

documentation

https://what.tf/r2fa/

README

R2FA

Build Status R2FA on crates.io R2FA on GitHub

Rust Two-Factor Authentication (R2FA) is a collection of tools for two-factor authentication.

Features

  • HOTP - HMAC-based One-time Password Algorithm (RFC 4226)

    • the key can be passed as bytes, an ASCII string, an hexadicimal string or a base32 string
    • customizable counter
    • customizable hash function (sha1, sha256, sha512)
    • customizable output length
    • customizable output alphabet
  • TOTP - Time-based One-time Password Algorithm (RFC 6238)

    • the key can be passed as bytes, an ASCII string, an hexadicimal string or a base32 string
    • customizable timestamp
    • customizable period
    • customizable initial time (T0)
    • customizable hash function (sha1, sha256, sha512)
    • customizable output length
    • customizable output alphabet
  • U2F - Universal 2nd Factor (FIDO Alliance)

Using within a Rust project

You can find R2FA on crates.io and include it in your Cargo.toml:

r2fa = "*"

Using outside Rust

In order to build R2FA, you will need both the rust compiler and cargo.

$ git clone https://github.com/breard-r/r2fa.git
$ cd r2fa
$ make
$ make install prefix=/usr

Quick examples

Rust

More examples are available in the documentation.

extern crate r2fa;
use r2fa::otp::TOTPBuilder;

let key = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ".to_string();
let code = TOTPBuilder::new()
    .base32_key(&key)
    .finalize()
    .unwrap()
    .generate();
assert_eq!(code.len(), 6);

C

#include <stdio.h>
#include <r2fa.h>

int main(void) {
  struct r2fa_totp_cfg cfg;
  char   code[7], key[] = "12345678901234567890";

  if (r2fa_totp_init(&cfg) != R2FA_OTP_SUCCESS) {
    return 1;
  }
  cfg.key = key;
  cfg.key_len = sizeof(key);
  if (r2fa_totp_generate(&cfg, code) != R2FA_OTP_SUCCESS) {
    return 2;
  }

  printf("%s\n", code);

  return 0;
}
$ cc -o totp totp.c -lr2fa
$ ./totp
848085

Python

from ctypes.util import find_library
from struct import Struct
from ctypes import *

class TOTPcfg(Structure):
    _fields_ = [
        ('key', c_char_p),
        ('key_len', c_size_t),
        ('timestamp', c_longlong),
        ('period', c_uint),
        ('initial_time', c_ulonglong),
        ('output_len', c_size_t),
        ('output_base', c_char_p),
        ('output_base_len', c_size_t),
        ('hash_function', c_int),
    ]

def get_totp():
    key = b'12345678901234567890'
    lib_path = find_library('r2fa') or 'target/release/libr2fa.so'
    lib = cdll.LoadLibrary(lib_path)
    cfg = TOTPcfg()
    if lib.r2fa_totp_init(byref(cfg)) != 0:
        return
    cfg.key_len = len(key)
    cfg.key = c_char_p(key)
    code = create_string_buffer(b'\000' * cfg.output_len)
    if lib.r2fa_totp_generate(byref(cfg), code) != 0:
        return
    return str(code.value, encoding="utf-8")

if __name__ == '__main__':
    code = get_totp()
    print('{}'.format(code))
Commit count: 413

cargo fmt