Class: ROTP::OTP

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

Direct Known Subclasses

HOTP, TOTP

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (OTP) initialize(s, options = {})

Params: secret in base32



6
7
8
9
10
# File 'lib/rotp/otp.rb', line 6

def initialize(s, options = {})
  @digits = options[:digits] || 6
  @digest = options[:digest] || "sha1"
  @secret = s
end

Instance Attribute Details

- (Object) digest (readonly)

Returns the value of attribute digest



3
4
5
# File 'lib/rotp/otp.rb', line 3

def digest
  @digest
end

- (Object) digits (readonly)

Returns the value of attribute digits



3
4
5
# File 'lib/rotp/otp.rb', line 3

def digits
  @digits
end

- (Object) secret (readonly)

Returns the value of attribute secret



3
4
5
# File 'lib/rotp/otp.rb', line 3

def secret
  @secret
end

Instance Method Details

- (Object) byte_secret



27
28
29
# File 'lib/rotp/otp.rb', line 27

def byte_secret
  Base32.decode(@secret)
end

- (Object) generate_otp(count)



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/rotp/otp.rb', line 12

def generate_otp(count)
  hmac = OpenSSL::HMAC.digest(
    OpenSSL::Digest::Digest.new(digest),
    byte_secret,
    int_to_bytestring(count)
  )

  offset = hmac[19] & 0xf
  code = (hmac[offset] & 0x7f) << 24 |
    (hmac[offset + 1] & 0xff) << 16 |
    (hmac[offset + 2] & 0xff) << 8 |
    (hmac[offset + 3] & 0xff)
  code % 10 ** digits
end

- (Object) int_to_bytestring(int, padding = 8)



31
32
33
34
35
36
37
38
# File 'lib/rotp/otp.rb', line 31

def int_to_bytestring(int, padding = 8)
  result = []
  until int == 0
    result << (int & 0xFF).chr
    int >>=  8
  end
  result.reverse.join.rjust(8, 0.chr)
end