121 lines
3.5 KiB
C#
121 lines
3.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace OTPNet
|
|
{
|
|
/**
|
|
* TOTP - One time password generator
|
|
*
|
|
* The TOTP class allow for the generation
|
|
* and verification of one-time password using
|
|
* the TOTP specified algorithm.
|
|
*
|
|
* This class is meant to be compatible with
|
|
* Google Authenticator
|
|
*
|
|
* This class was originally ported from the rotp
|
|
* ruby library available at https://github.com/mdp/rotp
|
|
*/
|
|
public class TOTP : OTP
|
|
{
|
|
|
|
/**
|
|
* The interval in seconds for a one-time password timeframe
|
|
* Defaults to 30
|
|
* @var integer
|
|
*/
|
|
public double interval;
|
|
|
|
|
|
public TOTP(string secret)
|
|
: base(secret, 6, HashAlgorithm.SHA1)
|
|
{
|
|
this.interval = 30;
|
|
}
|
|
|
|
public TOTP(string secret, double interval)
|
|
: base(secret, 6, HashAlgorithm.SHA1)
|
|
{
|
|
this.interval = interval;
|
|
}
|
|
|
|
public TOTP(string secret, double interval, int digits)
|
|
: base(secret, digits, HashAlgorithm.SHA1)
|
|
{
|
|
this.interval = interval;
|
|
}
|
|
|
|
public TOTP(string secret, double interval, int digits, HashAlgorithm algo)
|
|
: base(secret, digits, algo)
|
|
{
|
|
this.interval = interval;
|
|
}
|
|
|
|
/**
|
|
* Get the password for a specific timestamp value
|
|
*
|
|
* @param integer $timestamp the timestamp which is timecoded and
|
|
* used to seed the hmac hash function.
|
|
* @return integer the One Time Password
|
|
*/
|
|
public int at(double timestamp)
|
|
{
|
|
return this.generateOTP(this.timecode(timestamp));
|
|
}
|
|
|
|
/**
|
|
* Get the password for the current timestamp value
|
|
*
|
|
* @return integer the current One Time Password
|
|
*/
|
|
public int now()
|
|
{
|
|
return this.at(new Unixtime().toTimeStamp());
|
|
}
|
|
|
|
/**
|
|
* Verify if a password is valid for a specific counter value
|
|
*
|
|
* @param integer $otp the one-time password
|
|
* @param integer $timestamp the timestamp for the a given time, defaults to current time.
|
|
* @return bool true if the counter is valid, false otherwise
|
|
*/
|
|
public bool verify(int otp, double timestamp)
|
|
{
|
|
return (otp == this.at(timestamp));
|
|
}
|
|
|
|
public bool verify(int otp)
|
|
{
|
|
//calls verify(int, int)
|
|
return this.verify(otp, new Unixtime().toTimeStamp());
|
|
}
|
|
|
|
/**
|
|
* Returns the uri for a specific secret for totp method.
|
|
* Can be encoded as a image for simple configuration in
|
|
* Google Authenticator.
|
|
*
|
|
* @param string $name the name of the account / profile
|
|
* @return string the uri for the hmac secret
|
|
*/
|
|
public string provisitioning_uri(string name)
|
|
{
|
|
return "otpauth://totp/" + name + "?secret=" + this.secret;
|
|
}
|
|
|
|
/**
|
|
* Transform a timestamp in a counter based on specified internal
|
|
*
|
|
* @param integer $timestamp
|
|
* @return integer the timecode
|
|
*/
|
|
public Int64 timecode(double timestamp)
|
|
{
|
|
return (Int64)(((((timestamp * 1000)) / (this.interval * 1000))));
|
|
}
|
|
}
|
|
}
|