Home » USBPass


Project source: USBPass on GitHub
Trello board: USBPass on Trello


USBPass is a small device for storing passwords. Simply plug it in to any PC or device which supports USB HID keyboard, and use the 3 buttons to replay any of the 20 passwords stored in its memory. A cross-platform desktop application allows the user to store passwords (write-only) and reconfigure the functionality of each of the buttons. Originally I had intended on having the device type out the description of each password until the correct one is selected, but this proved to be too buggy and kind of obnoxious to work with. After realizing how awkward this technique is, I implemented short vs long press events for each button. With this in place, you can assign up to 6 passwords to the 3 buttons. This brings us to one of the primary design goals: Be as cheap as possible. If you build it yourself, you can build 3 for just under $20. Compared to the Yubikey, which costs $25, you can have 3 USBPasses on your keychain with 6 passwords each. 18 passwords for $20 vs 2 for $25. ;-) Of course, the Yubikey is sold at markup to cover development and server costs.


Rev A

Rev A issues

Rev A of anything is rarely without it's faults. ;-)

  • Copyright mask is mirrored
  • Atmega32u2 comes pre-programmed for *EXTERNAL* 8MHz crystal (and clkdiv8): 8MHz square wave must be applied between XTAL1 and XTAL2 (Future revs will require including a crystal or a programming jig that provides the signal)
  • nHWB needs to be broken out
  • Accidentally ordered 0603 for R1 and R2 (should be 0402)
  • Decoupling capacitors are WAY too close to the USB port, could possibly short on PC chassis
  • USB port slides far enough side-to-side to short out!!
  • Buttons are on the "back" of the board when plugged into most computers

Rev B thoughts

Rev B needs only a few tweaks to clean up the design: The most important changes are improvements to the USB connection and the position of the buttons.



The firmware for the USBPass is based around LUFA, specifically the HID keyboard demo. Once I got the demo working on my hardware, I added HID report functionality to transfer little bits of data from a desktop application. From here, developing the functionality for the buttons and recalling passwords went very quickly as I spent most of the time waiting for the hardware prototyping with a Qt desktop application.


The desktop software is primarily designed as a library, allowing me to write separate console and GUI interfaces, and makes cross-platform a bit easier to manage. Currently the GUI is barely functional, but the console app supports just about every feature developed so far. To simplify accessing the USB device I made use of HID API, which made it very easy to find the device and send reports.