Class List Method List File List

# Class: ROTP::OTP

Inherits:
  Object
  - Object
  - ROTP::OTP
  show all
Defined in:
  lib/rotp/otp.rb

## Direct Known Subclasses

HOTP, TOTP

## Instance Attribute Summary (collapse)

- - (Object) digest readonly

  Returns the value of attribute digest.

- - (Object) digits readonly

  Returns the value of attribute digits.

- - (Object) secret readonly

  Returns the value of attribute secret.

## Instance Method Summary (collapse)

- - (Object) byte_secret
- - (Object) generate_otp(count)
- - (OTP) initialize(s, options = {}) constructor

  Params: secret in base32.

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

## 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