class Aws::Session::Credentials::MfaDevice::YubikeyMfaDevice

Gets MFA codes from a Yubikey using YubiOATH

Attributes

device_arn[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb, line 9
def initialize(options = {})
  @yubikey_name = options.fetch(:yubikey_name) { 'Yubikey' }
  @oath_credential = options[:oath_credential]
  @device_arn = options[:device_arn]
end

Public Instance Methods

code() click to toggle source
# File lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb, line 15
def code
  card_names.each do |card_name|
    card(card_name) do |crd|
      oath = YubiOATH.new(crd)
      codes = oath.calculate_all(timestamp: Time.now)
      # Credential names are returned as ASCII-8BIT
      codes.transform_keys! { |key| key.force_encoding('UTF-8') }
      return codes[@oath_credential]
    end
  end
  nil
end

Private Instance Methods

card(name) { |crd| ... } click to toggle source

@param [String] name @yieldparam card [Smartcard::PCSC::Card]

# File lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb, line 32
def card(name)
  context do |cxt|
    begin
      crd = cxt.card(name, :shared)
      yield crd
    ensure
      crd.disconnect unless crd.nil?
    end
  end
end
card_names() click to toggle source

@return [Array<String>]

# File lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb, line 44
def card_names
  context do |cxt|
    cxt.readers.select { |name| name.include?(@yubikey_name) }
  end
end
context() { |context| ... } click to toggle source

@yieldparam context [Smartcard::PCSC::Context]

# File lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb, line 51
def context
  context = Smartcard::PCSC::Context.new
  yield context
ensure
  context.release
end