Pages

Showing posts with label revolution. Show all posts
Showing posts with label revolution. Show all posts

Monday, May 9, 2016

New in Android Samples Authenticating to remote servers using the Fingerprint API

Posted by Takeshi Hagikura, Yuichi Araki, Developer Programs Engineer

Originally posted on Google Android Developer blog

As we announced in the previous blog post, Android 6.0 Marshmallow is now publicly available to users. Along the way, we’ve been updating our samples collection to highlight exciting new features available to developers.

This week, we’re releasing AsymmetricFingerprintDialog, a new sample demonstrating how to securely integrate with compatible fingerprint readers (like Nexus Imprint) in a client/server environment.

Let’s take a closer look at how this sample works, and talk about how it complements the FingerprintDialog sample we released earlier during the public preview.

Symmetric vs Asymmetric Keys

The Android Fingerprint API protects user privacy by keeping users’ fingerprint features carefully contained within secure hardware on the device. This guards against malicious actors, ensuring that users can safely use their fingerprint, even in untrusted applications.

Android also provides protection for application developers, providing assurances that a user’s fingerprint has been positively identified before providing access to secure data or resources. This protects against tampered applications, providing cryptographic-level security for both offline data and online interactions.

When a user activates their fingerprint reader, they’re unlocking a hardware-backed cryptographic vault. As a developer, you can choose what type of key material is stored in that vault, depending on the needs of your application:

  • Symmetric keys: Similar to a password, symmetric keys allow encrypting local data. This is a good choice securing access to databases or offline files.
  • Asymmetric keys: Provides a key pair, comprised of a public key and a private key. The public key can be safely sent across the internet and stored on a remote server. The private key can later be used to sign data, such that the signature can be verified using the public key. Signed data cannot be tampered with, and positively identifies the original author of that data. In this way, asymmetric keys can be used for network login and authenticating online transactions. Similarly, the public key can be used to encrypt data, such that the data can only be decrypted with the private key.

This sample demonstrates how to use an asymmetric key, in the context of authenticating an online purchase. If you’re curious about using symmetric keys instead, take a look at the FingerprintDialog sample that was published earlier.

Here is a visual explanation of how the Android app, the user, and the backend fit together using the asymmetric key flow:

1. Setting Up: Creating an asymmetric keypair

First you need to create an asymmetric key pair as follows:

KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
keyPairGenerator.initialize(
new KeyGenParameterSpec.Builder(KEY_NAME,
KeyProperties.PURPOSE_SIGN)
.setDigests(KeyProperties.DIGEST_SHA256)
.setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
.setUserAuthenticationRequired(true)
.build());
keyPairGenerator.generateKeyPair();

Note that .setUserAuthenticationRequired(true) requires that the user authenticate with a registered fingerprint to authorize every use of the private key.

Then you can retrieve the created private and public keys with as follows:


KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
PublicKey publicKey =
keyStore.getCertificate(MainActivity.KEY_NAME).getPublicKey();

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
PrivateKey key = (PrivateKey) keyStore.getKey(KEY_NAME, null);

2. Registering: Enrolling the public key with your server

Second, you need to transmit the public key to your backend so that in the future the backend can verify that transactions were authorized by the user (i.e. signed by the private key corresponding to this public key). This sample uses the fake backend implementation for reference, so it mimics the transmission of the public key, but in real life you need to transmit the public key over the network.

boolean enroll(String userId, String password, PublicKey publicKey);

3. Let’s Go: Signing transactions with a fingerprint

To allow the user to authenticate the transaction, e.g. to purchase an item, prompt the user to touch the fingerprint sensor.

Then start listening for a fingerprint as follows:

Signature.getInstance("SHA256withECDSA");
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
PrivateKey key = (PrivateKey) keyStore.getKey(KEY_NAME, null);
signature.initSign(key);
CryptoObject cryptObject = new FingerprintManager.CryptoObject(signature);

CancellationSignal cancellationSignal = new CancellationSignal();
FingerprintManager fingerprintManager =
context.getSystemService(FingerprintManager.class);
fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, this, null);

4. Finishing Up: Sending the data to your backend and verifying

After successful authentication, send the signed piece of data (in this sample, the contents of a purchase transaction) to the backend, like so:

Signature signature = cryptoObject.getSignature();
// Include a client nonce in the transaction so that the nonce is also signed
// by the private key and the backend can verify that the same nonce cant be used
// to prevent replay attacks.
Transaction transaction = new Transaction("user", 1, new SecureRandom().nextLong());
try {
signature.update(transaction.toByteArray());
byte[] sigBytes = signature.sign();
// Send the transaction and signedTransaction to the dummy backend
if (mStoreBackend.verify(transaction, sigBytes)) {
mActivity.onPurchased(sigBytes);
dismiss();
} else {
mActivity.onPurchaseFailed();
dismiss();
}
} catch (SignatureException e) {
throw new RuntimeException(e);
}

Last, verify the signed data in the backend using the public key enrolled in step 2:

@Override
public boolean verify(Transaction transaction, byte[] transactionSignature) {
try {
if (mReceivedTransactions.contains(transaction)) {
// It verifies the equality of the transaction including the client nonce
// So attackers cant do replay attacks.
return false;
}
mReceivedTransactions.add(transaction);
PublicKey publicKey = mPublicKeys.get(transaction.getUserId());
Signature verificationFunction = Signature.getInstance("SHA256withECDSA");
verificationFunction.initVerify(publicKey);
verificationFunction.update(transaction.toByteArray());
if (verificationFunction.verify(transactionSignature)) {
// Transaction is verified with the public key associated with the user
// Do some post purchase processing in the server
return true;
}
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
// In a real world, better to send some error message to the user
}
return false;
}

At this point, you can assume that the user is correctly authenticated with their fingerprints because as noted in step 1, user authentication is required before every use of the private key. Let’s do the post processing in the backend and tell the user that the transaction is successful!

Other updated samples

We also have a couple of Marshmallow-related updates to the Android For Work APIs this month for you to peruse:

  • AppRestrictionEnforcer and AppRestrictionSchemaThese samples were originally released when the App Restriction feature was introduced as a part of Android for Work API in Android 5.0 Lollipop. AppRestrictionEnforcer demonstrates how to set restriction to other apps as a profile owner. AppRestrictionSchema defines some restrictions that can be controlled by AppRestrictionEnforcer. This update shows how to use 2 additional restriction types introduced in Android 6.0.
  • We hope you enjoy the updated samples. If you have any questions regarding the samples, please visit us on our GitHub page and file issues or send us pull requests.

    Read More..

    Saturday, April 23, 2016

    Do you want to write on Android Revolution HD blog

    Its time to expand. This place has a potential and I want it to become even more popular. If you are interested in making this place even better and more crowded, please keep reading!

    So, what I am looking for?

    Strong written English
    This is essential. Its fine if English isnt your first language, its not if I have to rewrite all your posts. Your grammar and variety of vocabulary must be at an advanced level.

    Good understanding of mobile tech and an attention to detail
    Know the areas you want to write about, know the sources and strive for accuracy. Your articles must have some particular level of quality, otherwise it cant be published.

    Have an opinion
    Re-posting news from other tech-sites is not welcomed. You need to be able to understand what things mean, put it in context and share your thoughts with our readers. Im more interested in creating the opinion rather then passing some news along.

    Regular contribution
    This isnt a job offer, but this might change in the future. For now I want to create a friendly place where dedicated people can share their thoughts (and there is a lot to share nowadays). I ask that all applicants are able to post on average 1-2 times a week. News posts dont have to be thousands of words, in most cases a couple of hundred will suffice.

    Technologies
    Im mostly interested in Android / Windows Phone articles, however the variety of potential topics is: "Linux Kernels" | "Linux General" | "Android General" | "Android Devices" | "Windows Devices" | "Other OS Devices" | "Tablets" | "Gadgets" | "Manufacturers News" | "PC News" | "your idea".


    There is no age limitation. Everyone can have hobby and be addicted to gadgets :)

    How to apply
    Please contact us via our Twitter profile: Twitter
    Read More..

    Friday, April 8, 2016

    The Meenova Micro SD Card Reader for Android

    A few months back I decided to pledge $12 US to a Kickstarter Project for a miniaturised USB card reader for Android smartphones. The idea looked promising, and I had a spare $12, so I took the gamble, and this week it paid off. Through the post I received the dividend on my investment. Ill follow up this mini-review with some details on performance once I can get hold of a class 10 card, but for now here are some first impressions and opinions.

    The concept of USB OTG (on-the-go) storage is a good one, especially for the increasing number of us of us whose favourite phones dont have an SD card slot. However, one of the big issues with the regular arrangement for OTG is the need to carry a male-female adapter cable and a card reader or memory stick around in addition to the telephone. Doing away with this inconvenient clutter was really what attracted me to the idea of the Meenova reader.

    I knew that a tiny, almost weightless device, which clips to my keyring, but which can take exchangeable micro SD cards at least up to 64Gb, would be worth $12 to me just for the convenience. The Meenova reader ticks all those boxes at around 2cm square by 8mm thick and weighing in at only 3 grammes.

    Unboxing the Meenova


    The reader arrived by mail, safe in a protective envelope, direct from the manufacturing facility. US customers receive theirs via USPS, the rest of the world via Hong Kong Post. Inside the envelope the reader was neatly packaged, and the pack included the reader, a USB adapter for lap/desktop connectivity, and a keyring clip.
     


    All the items were well made and well finished. The only exception was the tiny split ring for the keyring adapter, which was quite flimsy, but that was such an insignificant part of the package that I just replaced it with a better one for five cents. The cap clips onto the reader with a satisfying and tight click, and the reader is securely held. 

    That led me to thinking that instead of hanging the reader from my keyring, I should hang the cap from the ring and clip the reader in/out of it as I used it. I punched a small hole in the cap, threaded the tiny keyring through it, and I am very happy with the modification. 


    N.B. - Later Edit 
    Do NOT hang the reader on your keyring as I described above. My reader came unclipped twice today and I almost lost it !! Use the tag provided on the body of the reader and pass the spring clip through that. Only use the ring to hang the cap from the clip when the reader is in use.

    Getting To Grips with the Meenova


    Having got it all ready to use, my next step was to rummage in the spares bin. Luckily I found an old 8Gb class 4 SD card to use for the first test. I slotted it into the reader, plugged the reader into the USB adapter and plugged all that into my trusty iMac.

    Partitioning and formatting the card was quick, easy and there were no issues.  A nice touch is that USB connector on the reader is mounted in a raised, transparent, plastic "plinth" and from inside the casing a blue LED flashes to indicate any activity.


    The Meenova is actually much smaller than it appears here
    My first test was to load up my entire photo library from iPhoto to see what would happen. 2 Gb was a heavy enough load, and during the loading process I also deleted around 400 of the photos from the card during the load to see if that caused any issues. The process took a while, but there was no noticeable slowdown during the deletions and no data dropouts or corruption.

    Following the successful upload I unmounted the device and plugged it into the USB port of my HTC One. The One immediately reported "Preparing USB storage, Please Wait" and then "USB storage is ready" which popped up almost too quickly for me to take the screen shots.




    ES File Explorer, showed me that the USB was mounted automatically by the OS at the mount point /mnt/usb. On opening, Explorer already had the USB folder open and I was able to examine the contents just as I would any other part of the file system.

    The next step in this little test was to open Gallery and look for the photos I uploaded. They had already been found by the Gallery app and the app was in the process of making them available. Once the photos folder had been opened in Gallery, the photos themselves did take some time to appear, but until I can get hold of a faster card I can only speculate on whether this was caused by the cheap, slow card, the reader, or the OTG/USP processing in the phone OS.

    Gotcha !!!


    After playing with it for a while I was ready to hang the reader back on my keyring and drop my One into its slip case ... That was the only point at which I had an issue with the setup. In my haste, I just pulled the reader out of the USB socket and immediately received the notification "USB Storage unexpectedly removed" ...



    Oops ... My Bad ... I had forgotten to unmount before removal!


    I was only reading from the card so on this occasion it wasnt a painful experience, but no excuses ... some cards can be very sensitive to superblock corruption so its never a sensible thing to just pull them out without first unmounting, and definitely not advisable following a write to the card.

    Just to make sure I knew what to do in future, I reinserted the reader and went in search of the unmount action. I have to admit, I was naively expecting a bar in the notifications or settings pull-down with some obvious wording such as "USB/OTG storage - Click to unmount" ...

    No such luck ... I eventually found the action buried in the basement !! ... Its actually in Settings->Storage->USB Storage->Unmount USB Storage.



    For the sake of user convenience, I think there is a good case for smartphone manufacturers to do some rethinking about where that action should be placed. In my opinion, it belongs in a much more prominent position.

    Third-Party Apps and the Meenova


    Because of that one thing, I went in search of an OTG/USB third-party app to see if I could make the unmount a little more convenient. I tried two (see *** footnote) and both worked well. However, both of them were designed to manage the mount and unmount themselves. That is, they are set up to create a mount point and mount to/unmount from that point. When using these apps on the HTC One, the OS native mount is maintained in addition to the ones set up by the tool, so a final unmount will still need to be done from within the settings page.

    If you have a phone with an OS which automatically mounts the OTG/USB storage, then dont bother with third-party apps. Just be sure you know how to unmount the device. If, on the other hand your OS doesnt automount the storage, but you have an OTG-aware kernel, then these third party apps can make your use of OTG devices easier.

    OTG Compatibility


    There is a list of known compatible devices on the Meenova web site, but in this rapidly changing world, the list may not be complete. In hard terms, the device is only a micro card reader, and the chipset is the same one that can be found in many regular readers, so the rule of thumb is that if your phone works with a cable and memory stick, either with native or third-party software, then the chance is good that it will work with a Meenova Reader as well.

    On the general subject of OTG compatibility my advice is for you to research your phone carefully before buying anything. Not all versions of Android support OTG and manufacturer support can also very variable, even between model ranges from the same company. Dont just assume that because your phone is fairly new and your Android is 4.x then it will have OTG. Check it out.

    Conclusion (for now)


    Overall I am already satisfied with my $12 investment, and at this point I feel that I can recommend this device to anyone looking for a compact, handy, OTG/USB storage solution.

    In Part Two (coming soon) I will take a closer look at the Meenova readers performance with music and video files, and I will try to run a set of timing comparisons using Class 4 and class 10 Micro SD cards.

    Have any questions or comments? Feel free to share! Also, if you like this article, please use media sharing buttons (Twitter, G+, Facebook) below this post!



    *** The OTG Storage managers I tested were:

    USB Storage Manager by Goprasoft
    USB OTG Helper (Root) by Ray of Light

    As for Meenova the company, the Kickstart project seems to have been a great success. Plenty of cash was raised to get the project onto a stable footing, and I have yet to read a negative comment about either the Meenova reader or the guys who set it all up. The initial seed stock has now been dispatched to all the original backers, and the company are now taking pre-orders for the next batch of devices.
    Read More..

    Thursday, March 24, 2016

    Android Revolution Needs Your Help! Setting up new servers

    Android Revolution HD for various devices has been downloaded more than 4 million times during last 3 years (from official sources). With the average of 1GB  size per ROM, that means almost 4000 terabytes of data we transferred to our users in 3 years, not to count other files (mods, kernels, fixes etc.). With such amount of data this places Android Revolution HD among the most popular custom ROMs.

    This also brought us some problems – most servers we used to date can’t manage such traffic. Weve also lost our androidrevolution.nldomain lately, that’s why you can’t download anything at the moment (we hope to fix that as soon as possible).

    Now we need to set up some new servers and bring back download links to life. For that we’ll need some extra funds. If you’d like to contribute, please use the PayPal donation link below. We want to ensure that every time you click on the download link you’ll be able to get what you want within minutes, without waiting for hours until download is complete! Any amount counts and helps!



    With that being said, I cant thank enough to Lizard, Android Revolution member since the beginning whos taking technical care of the servers. You wont be able to download anything without him!

    For latest news follow Android Revolution HD on popular social platforms:

    Read More..

    Saturday, February 20, 2016

    The future of Android Revolution HD


    Its been quite a long time since I updated some of custom ROMs for HTC One series devices. This weekend I was able to release 2 major update for the HTC One M8 and HTC One M9.

    Android Revolution HD 14.0 | High Quality & Performance | 2.10.401.1 | ARMv8 64
    Re-build from the beginning using latest 2.10.401.1 base
    De-odexed using latest tools with better arm64 support
    SuperSU updated to latest 2.52
    Updated Google apps
    Updated custom apps
    Updated HTC apps
    Sense Toolbox updated to latest 2.2.1
    Total ROM size reduced by almost 200MB
    Other minor changes and fixes
    Android Revolution HD 45.0 | ART | High Quality & Performance | Sense 7.0
    Based on the latest 4.16.401.13 update
    SuperSU updated to latest 2.52
    Updated Google apps
    Updated custom appsUpdated HTC apps
    Sense Toolbox updated to latest 2.2.1
    Total ROM size reduced by almost 200MB
    Other minor changes and fixes
    Now, the short story. If youre wondering whats the reason behind my little activity on the custom ROMs development field, its because last 4 months brought a lot of changes in my life. In June 2015 I became a proud father of the most beautiful girl in the world. As you can imagine, priorities changed :)


    Also, I got married with my fiancée few weeks ago. We planned this marriage since 2013, but as always, last few weeks of preparations were extremely busy. Plus the baby was already here :)

    Its worth to mention, that during last few years Android Revolution HD was the most popular custom ROM for high-end HTC devices. With a total number of 6.430.689 downloads (6,5 millions !!!) Android Revolution custom ROMs series became the biggest and most desirable custom ROM for the HTC high-end devices.

    Android Revolution HD will still be supported, and all projects will be still continued. I just cant spend as much time on it as I used to spend in the past. Plus the the real life business I own expanded and developed significantly, so I need to focus now on my family and work. Both needs me :)

    PS. Im thinking about getting a Nexus 6P as my next daily device, as soon as its available in my country. Are you considering Nexus 6P as your next device too? Would you like to run Android Revolution HD on it? Let me know, as Im trying to find out if its worth to start N6P custom ROM development.

    Do you have any questions or comments? Feel free to share! Also, if you like this article, please use media sharing buttons (Twitter, G+, Facebook) below this post!


    For latest news follow Android Revolution HD on popular social platforms:

    Read More..