Class: ROTP::TOTP

Inherits:
OTP
  • Object
show all
Defined in:
lib/rotp/totp.rb

Instance Attribute Summary collapse

Attributes inherited from OTP

#digest, #digits, #secret

Instance Method Summary collapse

Methods inherited from OTP

#generate_otp

Constructor Details

#initialize(s, options = {}) ⇒ TOTP

Returns a new instance of TOTP.

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • interval (Integer) — default: 30

    the time interval in seconds for OTP This defaults to 30 which is standard.



8
9
10
11
# File 'lib/rotp/totp.rb', line 8

def initialize(s, options = {})
  @interval = options[:interval] || 30
  super
end

Instance Attribute Details

#intervalObject (readonly)

Returns the value of attribute interval.



4
5
6
# File 'lib/rotp/totp.rb', line 4

def interval
  @interval
end

Instance Method Details

#at(time) ⇒ Object

Accepts either a Unix timestamp integer or a Time object. Time objects will be adjusted to UTC automatically

Parameters:

  • time (Time/Integer)

    the time to generate an OTP for



16
17
18
19
20
21
# File 'lib/rotp/totp.rb', line 16

def at(time)
  unless time.class == Time
    time = Time.at(time.to_i)
  end
  generate_otp(timecode(time))
end

#nowInteger

Generate the current time OTP

Returns:

  • (Integer)

    the OTP as an integer



25
26
27
# File 'lib/rotp/totp.rb', line 25

def now
  generate_otp(timecode(Time.now))
end

#provisioning_uri(name) ⇒ String

Returns the provisioning URI for the OTP This can then be encoded in a QR Code and used to provision the Google Authenticator app

Parameters:

  • name (String)

    of the account

Returns:

  • (String)

    provisioning uri



52
53
54
# File 'lib/rotp/totp.rb', line 52

def provisioning_uri(name)
  "otpauth://totp/#{URI.encode(name)}?secret=#{secret}"
end

#verify(otp, time = Time.now) ⇒ Object

Verifies the OTP passed in against the current time OTP

Parameters:

  • otp (String/Integer)

    the OTP to check against



31
32
33
# File 'lib/rotp/totp.rb', line 31

def verify(otp, time = Time.now)
  super(otp, self.at(time))
end

#verify_with_drift(otp, drift, time = Time.now) ⇒ Object

Verifies the OTP passed in against the current time OTP and adjacent intervals up to drift.

Parameters:

  • otp (String/Integer)

    the OTP to check against

  • drift (Integer)

    the number of seconds that the client and server are allowed to drift apart



40
41
42
43
44
45
# File 'lib/rotp/totp.rb', line 40

def verify_with_drift(otp, drift, time = Time.now)
  time = time.to_i
  times = (time-drift..time+drift).step(interval).to_a
  times << time + drift if times.last < time + drift
  times.any? { |ti| verify(otp, ti) }
end