Giter Site home page Giter Site logo

tejado / authorizer Goto Github PK

View Code? Open in Web Editor NEW
457.0 27.0 51.0 171.2 MB

Authorizer is a Password Manager for Android. It emulates an HID keyboard over USB and enters your credentials on your target device. Additionally it supports OTP :key::mobile_phone_off:

Java 99.23% C++ 0.72% C 0.03% CMake 0.02%
android security password-manager keyboard-emulation usb usb-hid encryption gpg gpg-encryption password-store

authorizer's Introduction

Authorizer CI

Transform Android devices into secure, offline password managers with USB/Bluetooth Auto-Type, OTP, and FIDO support.

Authorizer Screenshot

Use your Android device as a dedicated hardware password manager. It avoids manual typing of lengthy and complicated passwords by offering USB and Bluetooth Auto-Type features. Acting as a keyboard, Authorizer enables users to automatically input passwords on their PC, laptop, tablet, or another smartphone with a simple in-app button press.

By having your Authorizer-device offline using airplane mode, you create a physical separation between your credentials and the devices commonly used for daily activities. Similar to Security Keys but with enhanced functionality and comfort. This concept helps reduce the likelihood of password breaches and unauthorized access, ensuring stored credentials remain secure from online threats and unrelated apps.

Even if you don't fully trust the Authorizer app, you can maintain security as long as your Authorizer-device's underlying OS provides network isolation and data encryption.

Get it on F-Droid Get it on Google Play Get it on GitHub

Table of Contents

Authorizer Demo YouTube video

Features

  • Auto-Type over USB
  • Auto-Type over Bluetooth
  • Auto-type keyboard layouts for English, German, French, Apple and Neo 2
  • Bluetooth FIDO U2F & WebAuthn integration
  • OTP integration (TOTP/HOTP)
  • Asymmetric encrypted offline backup
  • Auto-type keyboard-"commands" like TAB or ENTER for Username and Password fields
  • Predefined usernames with placeholders for fast record creation
  • Tree list
  • Icons
  • pwsafe3 file compatible (*)
  • Yubikey support (*)
  • Biometric protection of your file password (*)
  • Time-based file-close (*)
  • Screen off can trigger file-close (*)
  • Read-only file mode (*)
  • Record protection (*)
  • Local file backup (*)
  • Password expirations (*)
  • Password Policies (*)
  • Password History (*)
  • Notes (*)
  • Groups (*)
  • Shortcut & alias records (*)
  • Home screen widgets (*)
  • Powerful Search (*)
  • Light & Dark mode (*)

* As Authorizer has its foundation in PasswdSafe for Android, it has also adopted these features.

Getting started

Device Recommendation

For security and privacy reasons, the recommended device is any maintained Google Pixel with GrapheneOS.
Other devices might work as well. But as a lot of smartphone vendors are not publishing its underyling kernel and Android source, they can't be recommended.

Requirements

Authorizer can run on every Android device with version 5 or higher (Lollipop: API/SDK level 21).
For Bluetooth features, minimum version 9 is required (Pie: API/SDK level 28). Higher is recommended for stability reasons.

For Auto-Type over USB, low-level root permissions are required to run USB Gadget Tool.
Authorizer does not require root permissions when it is allowed to write to /dev/hidg1 natively (file permissions and selinux needs to be configured for this).

Compatibility

Features Windows Linux (⚠️) macOS (⚠️) iOS Android
AutoType - USB
AutoType - Bluetooth
FIDO U2F
FIDO WebAuthn

⚠️ For macOS and Linux, Chrome or other compatible browser is required. Firefox does not support FIDO / FIDO2 over Bluetooth natively on these platforms.

Features in Detail

Auto-Type over USB and Bluetooth

Authorizer is able to pretend to be an HID Keyboard so it can auto-type the credentials over USB and Bluetooth.
There are Auto-Type buttons at the password entry view. If a button is pressed longer, a different keyboard layout can be choosen. Additional, there is a USB Quick Auto-Type button in the TreeView which auto-types the respective password on a long press.
There are different settings per password entry like delimiter and the password return suffix. In the general App preferences a default keyboard layout can be choosen.

Auto-Type over USB requires support of the USB HID device role. This can be enabled with my USB Gadget Tool.

Auto-Type over Bluetooth is currently an experimental feature and only available on Android Pie (9.0) or higher.

Asymmetric encrypted backup on USB mass storage

The concept behind Authorizer is to have an offline device. As a consequence, it can't create password file backups over the network. To create backups in a comfortable way, Authorizer will open a backup dialog if it detects a new connected mass-storage (e.g. an USB stick connected over an USB On-The-Go adapter). By pressing "Backup now" in this dialog, a backup folder can be selected. It must contain a GPG public key with the file name "pubkey.asc". The default password file will be encrypted with this GPG key and stored in the selected folder.
This feature can be enabled over the general App preference "Enable GPG backup on USB storage".

OTP integration

Besides standard username & password entries, Authorizer also supports two-factor authentication (2FA) over one-time passwords (OTP). Time-based (TOTP) and HMAC-based (HOTP) one-time passwords are supported.
The OTP secret can be added to a password entry manually or by scanning a QR code. Afterwards, a press on the empty token field ("------") will generate a new OTP. It is also possible, to auto-type the OTP over USB or Bluetooth by adding {OTP} as a placeholder directly in the username or password, e.g. {OTP} in the password "myPa$sword{OTP}" will be replaced with a newly generated OTP.
Like username, password and other data, the OTP secret is stored in the password file.

Additional Auto-Type placeholders

In addition to the {OTP} placeholder, Authorizer also supports {TAB} and {RET} for the tabulator and return key. Adding these to the username and/or password will result in auto-typing the respective key (tab or return) instead of the placeholder.
Example: if "peter{TAB}{OTP}" is set as the username, "peter" followed by the tabulator key and a newly generated OTP will be auto-typed.

Roadmap

Please see Authorizer Roadmap.

FAQ

In progress

Limitations and Known Issues

  • When Authorizer creates or modifies psafe3 files, it will add extra fields like auto-type settings, FIDO keys, and icons, which may not be displayed when using other software that supports psafe3.
  • Running Authorizer app on tablets is currently not tested.
  • The experience of Bluetooth-stack stability can differ between devices, as it is dependent on both the Android version and the specific device being used.
  • Due to limitations in the Bluetooth-stack, Authorizer can only be paired as Keyboard OR as FIDO Security key and not both.
  • It is important to unpair from the other device as well to prevent unexpected behavior, when establishing a new pairing under a separate profile (like Keyboard or FIDO).
  • Currently, FIDO credentials can't be added to existing records.

Contributions & Community

Contributions are highly welcome.
For contributions, discussions and questions around Authorizer, feel free to

Please note that I am not interested in further localization of Authorizer, except for auto-type keyboard layouts.

Special Thanks

Authorizer is based on

Privacy Policy

Authorizer does not collect any data from your mobile device.

  • Camera access is used only for scanning OTP QR codes.
  • Location access only used for Bluetooth device scanning and it is optional.

If you believe this policy has been violated in any way, please file an issue.

authorizer's People

Contributors

absturztaube avatar geco2 avatar hacksawfred3232 avatar jefftharris avatar mohammadnaseri avatar papagon avatar poussinou avatar tejado avatar vi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

authorizer's Issues

Implement bluetooth keyboard functionality similar to USB keyboard

Hey there,
I don't know whether this is even possible at all nor securely, this would definitely require some investigation, however, if this is doable without security concerns this could be a great feature.

It would need android to be able to behave as a bt keyboard and it would have to be looked at possible security issues like traffic sniffing (reading keys or at least being able to replay them).

Improve Delay Time When Using USB HID Keyboard

'dd' command works, but has a bad permformance. I think we can launch a java process using 'app_process' command ,then using socket or Ibinder to communicate with your APP. That will be really fast !!!

Fingerprint support to access database.

It would be nice to have fingerprint support to access the database. KeePass dx has this functionality. Maybe you can get some inspiration from their codebase.

app crashes on launch

10-01 20:18:07.234 31439 31439 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{net.tjado.passwdsafe/net.tjado.passwdsafe.PasswdSafe}: android.view.InflateException: Binary XML file line #89: Binary XML file line #89: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3121)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:214)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7063)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #89: Binary XML file line #89: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView
10-01 20:18:07.234 31439 31439 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #89: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView
10-01 20:18:07.234 31439 31439 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance0(Native Method)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createView(LayoutInflater.java:686)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:829)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:769)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:902)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:863)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:554)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:461)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:383)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:775)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:197)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at net.tjado.passwdsafe.PasswdSafe.onCreate(PasswdSafe.java:392)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7327)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7318)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3101)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:214)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7063)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
10-01 20:18:07.234 31439 31439 E AndroidRuntime: Caused by: android.content.res.Resources$NotFoundException: Drawable net.tjado.passwdsafe:color/tab_bg_color with resource ID #0x7f06040d
10-01 20:18:07.234 31439 31439 E AndroidRuntime: Caused by: android.content.res.Resources$NotFoundException: File res/color/tab_bg_color.xml from drawable resource ID #0x7f06040d
10-01 20:18:07.234 31439 31439 E AndroidRuntime: 	at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:898)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:677)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.Resources.getDrawableForDensity(Resources.java:903)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.Resources.getDrawable(Resources.java:842)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.Context.getDrawable(Context.java:628)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at androidx.core.content.ContextCompat$Api21Impl.getDrawable(ContextCompat.java:1110)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:526)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.navigation.NavigationBarItemView.setItemBackground(NavigationBarItemView.java:676)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.navigation.NavigationBarMenuView.buildMenuView(NavigationBarMenuView.java:729)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.navigation.NavigationBarPresenter.updateMenuView(NavigationBarPresenter.java:72)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.navigation.NavigationBarView.inflateMenu(NavigationBarView.java:382)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.navigation.NavigationBarView.<init>(NavigationBarView.java:276)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:108)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:103)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:98)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance0(Native Method)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createView(LayoutInflater.java:686)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:829)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:769)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:902)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:863)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:554)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:461)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:383)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:775)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:197)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at net.tjado.passwdsafe.PasswdSafe.onCreate(PasswdSafe.java:392)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7327)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7318)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3101)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:214)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7063)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f04016c a=-1}
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:177)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:122)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:146)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1359)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1318)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:879)
10-01 20:18:07.236 31439 31439 E AndroidRuntime: 	... 42 more

The following fixes crash for me, but I have no clue what any of that means and what's proper way to fix that:

diff --git a/authorizer/src/main/res/color/tab_bg_color.xml b/authorizer/src/main/res/color/tab_bg_color.xml
index 11b34e58..52135a84 100644
--- a/authorizer/src/main/res/color/tab_bg_color.xml
+++ b/authorizer/src/main/res/color/tab_bg_color.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="@color/primary" android:drawable="@color/primary" android:state_checked="true" />
-    <item android:color="?attr/customNavigationBarColor" android:drawable="?attr/customNavigationBarColor" />
 </selector>

This is from Galaxy A40 running Android 9, btw.

Shortcut buttons to push either token

Hi, currently one has to choose each secret explicitly and then tap a corresponding button to push the respective token via USB or Bluetooth. Along with that, sensitive information is also displayed at the very first tab (including username and other login details), which is not nice if somebody looking at your screen. I would propose:

  • Display shortcut buttons to push token already in the list of secrets (for each of them);
  • Display sensitive login information only on the second tab if secret is chosen, and only buttons on the first tab.

Assign password to a device or Macro ability?

When I select a login/password from Authorizer, I'm asked to select a device. If now I want to type in another password, I have to

  1. exit the current credential
  2. find another credential
  3. tap password
  4. select device

It would be nice if we could create macros that can do all of the above in a single tap. Currently you have a list of groups/credentials that you select from. Those can remain but then allow us to compose those menus into a macro and then allow us to browse through those macros.

For example, in a home lab scenario, I could have

  1. Macro 1_PC 1 Login Username/Password
  2. Macro 2_PC 1 Service Password (no username)
  3. Macro 3_PC 2 Login Username/Password (tab instead of return)
  4. Macro 4_PC 2 Service Password (no username)
  5. Macro 5_PC 2 MyCustomApp Login Username/Password
  6. etc...

That way, you can quickly logon to multiple devices in a quick succession. You can organize your macros for a specific task (e.g., you might have a set of macros for work devices/password and another set of macros for home devices and passwords).

Not sure if this can be done in userland (like Auto It script/macros in Windows). Don't think it is possible without rooting.

Other than that, a great app and thank you for your contribution!

Support for PasswdSafe Sync

I'm editing HID patch for my device right now and to that day I was using PasswdSafe by Jeff Harris.
Since your project is based on the same sources, can you maybe make it compatible with great addon, for version I metioned earlier, called PasswdSafe Sync (albo by the same person)?
For now, when you open Authorizer you will got security errors when have this apk addon installed immediately after openning your app. It is open-sourced too but if you can't make it compatible (by compiling it probably for your fork) then just please remove part of code that is calling it when starting Authorizer because it is impossible to use in my case. If it is only matter of few simple tweaks then I will try to build it myself.
Screenshot of error

Fingerprint support

Hello,
great app !!
could you please add fingerprint reading as master password, to unlock the application ?

Thanks

lib version change

Hi, while checking the source code of the previous version, I found that the version of one lib changed differently.
com.github.bmelnychuk:atv

It changed from 1.2.+ to 1.2.9
As we all know that + will match the latest version, why do we need to change 1.2.+ to 1.2.9?
Could you please tell me why? Thanks. :-)

feature request: pass integration

Hi, finally authorizer is on f droid :)

It would be nice to have pass integration since this is a "standart" format for password storing (with gpg encryptation) and that works with git

Here is pass website for reference : https://www.passwordstore.org/

Also there is a project here on github that already integrates this format which i dont remeber the name

Wrong symbol over USB

If the password contains "-", then when entering it via usb, from the page with all passwords, this symbol is replaced by "/". If you go to the page with the password and press "PASSWORD", the input will be correct.

Documentation.

Hi, I would like to add a FAQ document to the project. To help users of the application.
I await your response. Thank you

Modify for wearable

Would it be possible to port something like this to a wearable device?The aim would be to have something that is as small as possible that uses your USB feature. I've trawled through the code, but I'm far too inexperienced to know the limits of wearables (it seems very limited to me).

Neat - some ideas

Neat just found your project searching for something to make OTPs less of a hassle to enter, since still too less products are supporting u2f... .

Here some ideas/concerns:
Using it simply as a HID is of course an easy and supported way across platforms, however, it is not necessarily something you want in your environment due to the danger of whitelisting those. In certain cases you might not be able to guarantee that the phone isn't taken over maliciously and end up bing a rubber ducky instead. Alternatives might be browser extensions specifically for the otp purpose, communicating with the client on the phone. I will see if we find some time to look into that, until then, please feel free to acknowledge, but we don't expect you to implement it of course.

Yubikey Neo support

I'd really like to see 2FA for logging into the password database, like their is on the normal passwdsafe application. If this was implemented idk if I'd ever use another password manager again. I'd use the normal passwdsafe app, but the USB otg function is something I absolutely love. Also is their any way to donate to this project if so please let me know.

Typing over USB doesn't work (Mac, Xiaomi Mi6)

Hi @tejado!

Awesome app I'd really like to use, but I have an issue. When I try to "type" the password, nothing happens.

I have your USB Gadget Tool installed and I added hid.keyboard function to the default gadget (g1). I also tried to use a separate gadget, but no luck.

Setup:

  1. Phone: Xiaomi Mi6
  2. Android 9, MIUI 11
  3. Rooted with Magisk, if that helps.
  4. Mac, MacOS Monterey
  5. I tried a simple USB-C->USB-C cable and a USB-C->USB one, but looks like my Mac sees the phone as a keyboard. At least it shows a popup saying "Configure your keyboard"
  6. I also have an external keyboard

It also keep spamming with "Root permission granted" when I tap the "type" button

Attaching the logs I got form the debug version
type.log

P.S. Also my additional gadget in the USB Gadget Tool goes missing after I reboot the phone.

Bluetooth failure on Android 13

An android 13 I get the following error in logcat:

10-20 10:52:15.362 16583 16583 E AndroidRuntime: Process: net.tjado.passwdsafe, PID: 16583
10-20 10:52:15.362 16583 16583 E AndroidRuntime: java.lang.SecurityException: Need BLUETOOTH permission
10-20 10:52:15.362 16583 16583 E AndroidRuntime:  at android.bluetooth.BluetoothProfileConnector.connect(BluetoothProfileConnector.java:177)
10-20 10:52:15.362 16583 16583 E AndroidRuntime:  at android.bluetooth.BluetoothHidDevice.<init>(BluetoothHidDevice.java:445)
10-20 10:52:15.362 16583 16583 E AndroidRuntime:  at android.bluetooth.BluetoothAdapter.getProfileProxy(BluetoothAdapter.java:3645)
10-20 10:52:15.362 16583 16583 E AndroidRuntime:  at net.tjado.authorizer.OutputBluetoothKeyboard.initializeBluetoothHidDevice(OutputBluetoothKeyboard.java:187)

I don't think it needs that permission on Android 13 and I see that in the source, however perhaps it's based on the target sdk rather than the device level.

Auto-type over BT doesnt work

Lineage OS 17.1(based on AOSP 10)

Logs:

08-03 20:48:05.088 19118 19118 D BluetoothHidDevice: Binding service...
08-03 20:48:05.089 19118 19118 E BluetoothHidDevice: Could not bind to Bluetooth Service with Intent { act=android.bluetooth.IBluetoothHidDevice }
08-03 20:48:06.113 19118 19118 E InputEventReceiver: Exception dispatching input event.
08-03 20:48:06.113 19118 19118 E MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.bluetooth.BluetoothHidDevice.getConnectionState(android.bluetooth.BluetoothDevice)' on a null object reference
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at net.tjado.authorizer.OutputBluetoothKeyboard.connectDeviceAndSend(OutputBluetoothKeyboard.java:283)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at net.tjado.passwdsafe.PasswdSafeRecordBasicFragment$26.onClick(PasswdSafeRecordBasicFragment.java:935)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1222)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.widget.AdapterView.performItemClick(AdapterView.java:330)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.widget.AbsListView.performItemClick(AbsListView.java:1190)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3198)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.widget.AbsListView.onTouchUp(AbsListView.java:4128)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.widget.AbsListView.onTouchEvent(AbsListView.java:3886)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.View.dispatchTouchEvent(View.java:13953)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3054)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2741)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:465)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1849)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.app.Dialog.dispatchTouchEvent(Dialog.java:861)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:423)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.View.dispatchPointerEvent(View.java:14212)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5652)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5455)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5011)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4977)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5117)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4985)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5174)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5011)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4977)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4985)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7675)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7644)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7605)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7800)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.os.MessageQueue.nativePollOnce(Native Method)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.os.MessageQueue.next(MessageQueue.java:336)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.os.Looper.loop(Looper.java:174)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at android.app.ActivityThread.main(ActivityThread.java:7356)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at java.lang.reflect.Method.invoke(Native Method)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
08-03 20:48:06.114 19118 19118 E MessageQueue-JNI:      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)
08-03 20:48:06.114 19118 19118 D AndroidRuntime: Shutting down VM
08-03 20:48:06.115 19118 19118 E AndroidRuntime: FATAL EXCEPTION: main
08-03 20:48:06.115 19118 19118 E AndroidRuntime: Process: net.tjado.passwdsafe, PID: 19118
08-03 20:48:06.115 19118 19118 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.bluetooth.BluetoothHidDevice.getConnectionState(android.bluetooth.BluetoothDevice)' on a null object reference
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at net.tjado.authorizer.OutputBluetoothKeyboard.connectDeviceAndSend(OutputBluetoothKeyboard.java:283)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at net.tjado.passwdsafe.PasswdSafeRecordBasicFragment$26.onClick(PasswdSafeRecordBasicFragment.java:935)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1222)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.widget.AdapterView.performItemClick(AdapterView.java:330)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.widget.AbsListView.performItemClick(AbsListView.java:1190)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3198)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.widget.AbsListView.onTouchUp(AbsListView.java:4128)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3886)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.View.dispatchTouchEvent(View.java:13953)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3054)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2741)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:465)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1849)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.app.Dialog.dispatchTouchEvent(Dialog.java:861)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:423)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.View.dispatchPointerEvent(View.java:14212)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5652)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5455)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5011)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4977)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5117)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4985)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5174)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5011)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4977)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4985)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4958)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7675)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7644)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7605)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7800)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.os.MessageQueue.nativePollOnce(Native Method)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.os.MessageQueue.next(MessageQueue.java:336)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:174)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7356)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
08-03 20:48:06.115 19118 19118 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)
08-03 20:48:06.118  1552  5270 W ActivityTaskManager:   Force finishing activity net.tjado.passwdsafe/.PasswdSafe

Where is an OTP Button in keyboard?

Since new update that I got from F-Droid is have support to add OTP in password database, but unfortunately, I cannot find the button to insert/autotype OTP in the app keyboard yet.

Add button to Auto-Type URL

Hello.

The ability to Auto-Type a URL in addition to a username/password is a valuable feature that would enhance convenience for users.
I would appreciate it if you seriously considered including this feature in the new program version.

Sincerely.

Enhance FIDO credentials

  • Show FIDO credentials in the record
  • FIDO credentials should be mergable with other records
  • During FIDO credential registration, the target record should be selectable

This is valid for FIDO U2F and FIDO2 WebAuthn.

App FC when accessing saved file

This happens when opening previously created file rw or ro. It also FC when using the widget linked to file. If you need a logcat, I can provide.

Android 7.1 Samsung Galaxy J5

Add a Stateless Password Generator

If you're unfamiliar with stateless passwords one popular implementation is lesspass. You can read up on how it works: https://blog.lesspass.com/lesspass-how-it-works-dde742dd18a4#.vbgschksh

Alright, so here's my vision for this use case:
Authorizer could live on an offline device and send these stateless passwords through keyboard emulation, increasing security as the master password is never entered on the target device. An attacker with a keylogger installed on your PC or a website database breach might be able to obtain passwords but never your master password or your OTPs. You can simply increment the counter to generate new password replacements as soon as you're aware of the breach. If your device is lost, stolen, or broken you'll never lose access to your accounts because you can simply generate the same passwords again in the future, and you don't have to worry about the thief having access to your passwords as nothing needs to be stored on disk.

You don't have to buy some fancy specialized security hardware. A small, cheap android device could do the job, hardening your security without sacrificing convenience. Authorizer is already quite close to making this a reality.

Security is hard, and I'm not an expert by any means but this seems like something to look into. Let me know what you think.

Improve Bluetooth Device Pairing

Currently, it is tricky to pair Authorizer with a respective other device, so that Bluetooth HID (keyboard + CTAP/CTAP2) is working correctly.
This needs to be improved.

I guess it makes sense to have a bluetooth device section in the preferences.

Wrong keyboard events from Authorizer.

I ask Authoritzer to type ttt on USB keyboard gadget, and get these events instead:

evdev-dump events
/dev/input/event21 1659630959.601249 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.601249 EV_KEY KEY_LEFTCTRL 0x00000001
/dev/input/event21 1659630959.601249 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.601249 EV_KEY KEY_LEFTSHIFT 0x00000001
/dev/input/event21 1659630959.601249 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.601249 EV_KEY KEY_LEFTALT 0x00000001
/dev/input/event21 1659630959.601249 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.601249 EV_KEY KEY_RIGHTCTRL 0x00000001
/dev/input/event21 1659630959.601249 EV_SYN SYN_REPORT 0x00000001
/dev/input/event21 1659630959.602216 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.602216 EV_KEY KEY_LEFTCTRL 0x00000000
/dev/input/event21 1659630959.602216 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.602216 EV_KEY KEY_LEFTSHIFT 0x00000000
/dev/input/event21 1659630959.602216 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.602216 EV_KEY KEY_LEFTALT 0x00000000
/dev/input/event21 1659630959.602216 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.602216 EV_KEY KEY_RIGHTCTRL 0x00000000
/dev/input/event21 1659630959.602216 EV_SYN SYN_REPORT 0x00000001
/dev/input/event21 1659630959.617249 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.617249 EV_KEY KEY_LEFTCTRL 0x00000001
/dev/input/event21 1659630959.617249 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.617249 EV_KEY KEY_LEFTSHIFT 0x00000001
/dev/input/event21 1659630959.617249 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.617249 EV_KEY KEY_LEFTALT 0x00000001
/dev/input/event21 1659630959.617249 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.617249 EV_KEY KEY_RIGHTCTRL 0x00000001
/dev/input/event21 1659630959.617249 EV_SYN SYN_REPORT 0x00000001
/dev/input/event21 1659630959.618250 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.618250 EV_KEY KEY_LEFTCTRL 0x00000000
/dev/input/event21 1659630959.618250 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.618250 EV_KEY KEY_LEFTSHIFT 0x00000000
/dev/input/event21 1659630959.618250 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.618250 EV_KEY KEY_LEFTALT 0x00000000
/dev/input/event21 1659630959.618250 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.618250 EV_KEY KEY_RIGHTCTRL 0x00000000
/dev/input/event21 1659630959.618250 EV_SYN SYN_REPORT 0x00000001
/dev/input/event21 1659630959.633248 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.633248 EV_KEY KEY_LEFTCTRL 0x00000001
/dev/input/event21 1659630959.633248 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.633248 EV_KEY KEY_LEFTSHIFT 0x00000001
/dev/input/event21 1659630959.633248 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.633248 EV_KEY KEY_LEFTALT 0x00000001
/dev/input/event21 1659630959.633248 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.633248 EV_KEY KEY_RIGHTCTRL 0x00000001
/dev/input/event21 1659630959.633248 EV_SYN SYN_REPORT 0x00000001
/dev/input/event21 1659630959.634251 EV_MSC MSC_SCAN 0x000700E0
/dev/input/event21 1659630959.634251 EV_KEY KEY_LEFTCTRL 0x00000000
/dev/input/event21 1659630959.634251 EV_MSC MSC_SCAN 0x000700E1
/dev/input/event21 1659630959.634251 EV_KEY KEY_LEFTSHIFT 0x00000000
/dev/input/event21 1659630959.634251 EV_MSC MSC_SCAN 0x000700E2
/dev/input/event21 1659630959.634251 EV_KEY KEY_LEFTALT 0x00000000
/dev/input/event21 1659630959.634251 EV_MSC MSC_SCAN 0x000700E4
/dev/input/event21 1659630959.634251 EV_KEY KEY_RIGHTCTRL 0x00000000
/dev/input/event21 1659630959.634251 EV_SYN SYN_REPORT 0x00000001

hid_gadget_test, for example, does type keys correctly, so I assume the problem is with Authorizer itself.

The same version of Authorizer work before on the same device on Android 11, but with Android 12 it seems to be failing.

Doesn't tell if user doesn't have root access

When using the app I noticed it didn't work, even on multiple devices, with different cables and everything, untill I used saw the changelog where it's the only place it says that the app uses root permissions in order to work.

Can you make it so that if root isn't granted, to tell the user? It would help many new users who think the app is broken or something.

.csv import

Hello👋 In short, I would like to see support for importing passwords and logins from a .csv file. For example, in firefox, this file looks like this:

"url,"username","password","httpRealm","formActionOrigin","guid","timeCreated","timeLastUsed","timePasswordChanged"
https://site.com,"[email protected]","password",,"https://site.com","87f23f23f","1649905569125","1649906459007","1649905569125"
url username password httpRealm formActionOrigin guid timeCreated timeLastUsed timePasswordChanged
https://site.com [email protected] password https://site.com 87f23f23f 1649905569125 1649906459007 1649905569125

Creating a new demo video of Authorizer app

The current video linked in the README.md shows a really old version of Authorizer. It would be great if someone creates a new one. The video should show two devices and the Authorizer version 0.3.0 similar the current one.
Bonus: OTP & usb backup demo

USB Support for FIDO CTAP/CTAP2 for U2F & WebAuthn

I'm working on the support of WebAuthn over USB. For this, the Android device needs to have special USB HID descriptor (CTAP) and Authorizer needs to implement the device logic (key creating and authentication).

The latest spec of the Client to Authenticator Protocol (CTAP) can be found here: https://fidoalliance.org/specs/fido2/fido-client-to-authenticator-protocol-v2.1-rd-20191217.html

The USB HID descriptor is already available in USB Gadget Tool (recently released by me).

And a first PoC to implement the WebAuthn device logic was successful.

Next step:

  • Defining of how these WebAuthn keys and metadata will be stored in the pwsafe3 format
  • Clarifying how Authorizer will listen for incoming CTAP requests (USB HID keyboard will be triggered by Authorizer. For WebAuthn, the trigger is on the USB Host side, so that Authorizer needs to react on incoming requests).
  • Implementing device logic into Authorizer
  • Adding relevant UI elements

Support for QR codes in FIDO

Hi,

I'm pretty new to this thingy, it looks all well and I think the Bluetooth FIDO is implemented in #54. I tried to use it with okta.com but my chromium presents me a QR code that I should scan and it contains a FIDO:/ url, i'm not sure how to proceed with that. Any help? I think its not yet implemented to use QR codes with FIDO?! It also asks me to register over Bluetooth but when I press "Accept" nothing happens.

Doesn't type G reliably

Hi,

It seems the app has a problem typing the g character reliably.

I added a record with username gg, and password gggg-gggg.

Authorizer types g [tab] ggg-gggg, instead of the correct gg [tab] gggg-gggg

I also tested with a different keybord layout (neo 2.0), and it typed the correct numbers of characters, just not a g, but a i.

And I just tested with capital G, and it just doesn't want to type it. Username GG, types nothing.

NFC support

I've been working on a similar project that uses NFC and would like to share what I have found, so that we can work together on a solution. My main areas are embedded and hardware, rather than Android.

NFC uses APDU to exchange data, which requires the Android device to emulate a basic smart card. APDU can transfer arbitrary data, and allows an application to be selected by the reader. More info here:

https://developer.android.com/guide/topics/connectivity/nfc/hce

My intention is to build a very small USB keyboard emulator with NFC that can read passwords from an Android phone and type them on the host. It's a shame no off-the-shelf hardware can do this.

There are two options for the reader, an RC522 or a PN532 chip. I'm evaluating both. To control them my plan is to use a XMEGA microcontroller, since I have a fully open source USB stack for it, which includes HID and DFU for bootloading. Also all the development tools are free (GCC) and well supported.

Other options include an ARM CPU. The advantages are that they are physically smaller and slightly cheaper, but the down side is that development support is worse. Actually one other big advantage is that they often come with a USB bootloader factory installed, where as with XMEGA you need a programmer (and probably a programming header).

It would be great to get some feedback on these ideas and also ensure that the hardware can be used with Authorizer.

Sending via USB not working

On my nexus 5, I installed the linked kernel, rooted via SuperSU, I can't send text via USB.

It has been downgraded to 5.0 from 6.0, USB Keyboard app is installed, and when I use Authorizer as keyboard for USB Keyboard, I can enter the logins and passwords.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.