class OmniAuth::Strategies::Trezor

Public Instance Methods

callback_phase() click to toggle source
Calls superclass method
# File lib/omniauth/strategies/trezor.rb, line 54
def callback_phase
  verified = verify_signature(
      extra[:public_key],
      extra[:signature],
      extra[:hidden_challenge],
      extra[:visual_challenge]
  )
  if verified
    super
  else
    fail!(:invalid_credentials)
  end
end
request_phase() click to toggle source
# File lib/omniauth/strategies/trezor.rb, line 16
      def request_phase
        session['omniauth.trezor_visual_challenge'] = options[:visual_challenge]
        session['omniauth.trezor_hidden_challenge'] = options[:hidden_challenge]

        OmniAuth::Form.build(
          title: "Trezor Login",
          url: callback_path,
          header_info: <<-HTML
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js" type="text/javascript"></script>
            <script src="https://trezor.github.io/connect/login.js"></script>
            <script type='text/javascript'>
              function trezorLogin() {
                TrezorConnect.requestLogin('#{options[:hosticon]}', '#{options[:hidden_challenge]}', '#{options[:visual_challenge]}', function (result) {
                    if (result.success) {
                        $('input[name=public_key]').val(result.public_key);
                        $('input[name=signature]').val(result.signature);
                        $('form').submit();
                    } else {
                        console.log('Error:', result.error);
                    }
                });

              }
              $(function() {
                $('button').click(function() {
                  trezorLogin();
                  return false;
                });
              });
            </script>
          HTML
        ) do |f|
          f.input_field('hidden', 'public_key')
          f.input_field('hidden', 'signature')
          f.html "<p>Logging in at: #{options[:visual_challenge]}</p>"
        end.to_response
      end
skip_info?() click to toggle source
# File lib/omniauth/strategies/trezor.rb, line 81
def skip_info?
  true
end

Private Instance Methods

verify_signature(pubkey, signature, challenge_hidden='', challenge_visual='') click to toggle source
# File lib/omniauth/strategies/trezor.rb, line 86
def verify_signature(pubkey, signature, challenge_hidden='', challenge_visual='')
  address = Bitcoin.pubkey_to_address(pubkey)
  sha256 = Digest::SHA256.new
  signature = [signature.htb].pack('m0')
  message = sha256.digest(challenge_hidden.htb) + sha256.digest(challenge_visual)
  Bitcoin.verify_message(address, signature, message)
end