Windows smartcard logon with Android secure element and NFC


There are different ways to interpret the notion of “logging into your computer PC using a phone.” While it is increasingly common to see phones provide second-factor for login to websites (by sending SMS challenges or using installed apps to generate one-time passcodes) users still have. In addition these ad hoc schemes are not compatible with how authentication works for typical operating systems– for example in an enterprise environment, that means Kerberos.

Here we consider a different approach where the phone is used as primary credential, replacing a standard smart card in conjunction with a short user PIN. Restricting our attention to PCs running Windows on one side and Android devices on the other, it turns out the bulk of the machinery required for implementing this is already present. Quick recap of these raw ingredients from previous posts:

Putting together all of this, we can implement Windows smart card logon with an Android phone:

  1. Write a minimal PIV application for the eSE. Why PIV? In fairness it is one of two options: support for PIV and GIDS standards is built into the OS starting with Windows 7. More over there is a discovery process to automatically recognize such cards as soon as they are introduced to the system. PIV specification is slightly easier to follow and it turns out smart card logon requires a tiny subset of specified functionality.
    • Strictly speaking the applet is not– and can not be– fully PIV compliant. The standard does not permit using the authentication key over NFC. That key is only meant to be used over contact interface, when the card is inserted into a standard reader. Luckily in this case having a more permissive applet does not change anything; Windows does not differentiate between contact verses contactless readers, and will try to use a discovered PIV card either way.
  2. Install the application on the eSE using standard Global Platform commands.
    • Caveat: this part can not be replicated with off-the-shelf hardware. Card manager keys for the secure element will not be known for standard production devices. Luckily one perk of working on Google Wallet is access to development phones, with keys rotated to default well-known values. (This is different from knowing the keys for a production device– a phone with rotated keys can not run Google Wallet any longer, because its keys are not consistent with the ones TSM expects.)
  3. Setup target machine for smart card logon.
    • For enterprise scenarios where the machine is joined to Active Directory, this is built-in. No further action is required on the client machine. However some configuration is required by IT administrators on the backend to issue suitable certificates (for example by installing Active Directory Certificate Services) or setup trust in third-party CA issuer.
    • For local logon to home machine without AD, eIDAuthenticate is a good third-party solution.
  4. Personalize the PIV applet, by setting a PIN, generating key pairs and installing certificates from the enterprise CA. Specifically smart card logon uses only the PIV authentication certificate; remaining keys and certificates are not required.
    • That said, the OS will query the card for other data objects defined in the standard, such as the CHUID and security object. While these are not relevant to the authentication protocol, returning an error can confuse the driver that expects a compliant PIV applet to be configured properly.

That’s it. Tap the phone against a contactless smart card reader and the familiar smart card logon sequence with PIN entry follows. The video shows this proof-of-concept on an HP Envy Spectre, something of a best-case scenario here because it includes an NFC controller under the palm rest, a rarity for laptops on the market today.

One caveat about the HP Spectre: by default the built-in NFC controller only supports peer-to-peer mode, instead of reader mode required to communicate with an external “card” such as the Android eSE. NXP Semiconductors has the necessary drivers to enable reader mode, with the controller appearing as PC/SC compliant smart card reader that Windows can use.

Also note the proof of concept does not require making any changes to Android OS or even writing an Android app. Recall that the eSE is effectively its own environment. Installation of the PIV applet and its personalization can be done entirely over NFC, without going through the Android side at all. For example the employee can walk up to help desk and tap their phone on a reader there to enroll.

CP

8 thoughts on “Windows smartcard logon with Android secure element and NFC

  1. Unfortunately no. This demo requires code running inside the secure element, which is a different piece of hardware than the main processor where Android runs. Distributing an ordinary app via Play Store would not be enough to install to the SE– special privileges are required for that, as explained here:
    See https://randomoracle.wordpress.com/2013/01/28/using-the-secure-element-on-android-devices-33/
    (This demo was done on a special device with “jailbroken” SE)

    Recently Android 4.4 “KitKat” introduced a new model to allow ordinary Android apps to work in card emulation mode, so the scenario may finally become possible.

      • Hello Carlo.

        That depends on whether Windows is recognizing that NFC reader as a PC/SC compatible device.
        (In device manager, it should appear under the smart-card readers node.)
        Do you have a device-driver for it?

        For reference, PN533 works as in the case of HP Envy but it requires drivers from NXP. By default HP only ships drivers that can use that chipset in peer-to-peer mode, as opposed to reader-mode which is required to interact with smart-cards.

  2. Hi Cem,

    Congrats on making this work!

    Is there a way to obtain the “minimal PIV application for the eSE” you’re mentioning? It doesn’t seem it’s an especially complex code, but still requires certain JC programming skills and and understanding of the standard at a level allowing implementation. This unfortunately I’m lacking at the moment and I’m in an urgent need of running similar demo, but with secure element on a SIM card. I’ve been trying to find some code samples or ready to go files, but no luck.

    Cheers!

Leave a comment