)]}'
{
  "log": [
    {
      "commit": "237f4b369bfd8021882007d103b9921fca789263",
      "tree": "ae8c83b2076af2a15ad7dc51ce37aabde19734e8",
      "parents": [
        "c4a169cfb452ac4e8c7fb4ac153f66892ee0b16e"
      ],
      "author": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Mon Apr 24 13:57:46 2017 +0200"
      },
      "committer": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Wed Apr 26 17:40:44 2017 +0200"
      },
      "message": "Add device ID attestation method to keymaster\n\nDevice ID attestation consists of three steps:\n* Generate a temporary key\n* Attest the key and desired device IDs\n* Delete the temporary key\n\nRather than being spread over three keymaster APIs, these operations\nshould happen automatically in a single keymaster method.\n\nBug: 34734938\nTest: GTS com.google.android.gts.security.DeviceIdAttestationHostTest\n\nChange-Id: Ifabb5163b9e4d12cb309a6b0ca8e5f2f92d212f4\n"
    },
    {
      "commit": "a00c7c0a9983e30e4dcbc4f7ae847a26d9ea614f",
      "tree": "147c433a2c9ee6dc9caaa01198700c805ca6dedd",
      "parents": [
        "5313eee98a2e7bcac48105888bdfb25d61dce2ce",
        "0f3f60b576aedc78524d50da3dadada2201e63c2"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@google.com",
        "time": "Tue Apr 25 22:10:56 2017 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Apr 25 22:11:01 2017 +0000"
      },
      "message": "Merge \"Fix some issues found by new doclava linter.\" into oc-dev"
    },
    {
      "commit": "0f3f60b576aedc78524d50da3dadada2201e63c2",
      "tree": "10687f8ec2be4c125de12c100effc0c796a4b529",
      "parents": [
        "30e06bb668f2e4b024c4ebc2a131de91c96de5eb"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Apr 24 18:06:20 2017 -0600"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Apr 25 13:12:45 2017 -0600"
      },
      "message": "Fix some issues found by new doclava linter.\n\nAdd missing API annotations for permissions and SdkConstants, and\ninvoke doclava with new \"-android\" flag.\n\nTest: make -j32 offline-sdk-docs\nBug: 37526420\nChange-Id: I970bb2655eb568fd25004636f134c794663a6c33\n"
    },
    {
      "commit": "12b644d275b121dd952a4a564fa65b9c18c9b22c",
      "tree": "70b21b6b53191591312ca0ade265e0d59aeed6da",
      "parents": [
        "274442e33433b74f4c6abca936cf3a1b3e0705bd"
      ],
      "author": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Fri Apr 21 19:21:42 2017 +0100"
      },
      "committer": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Mon Apr 24 20:04:50 2017 +0100"
      },
      "message": "Introduce KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION\n\nThis flag is used by system server to mark keys used during the\nsynthetic password auth flow. keys marked with this flag will not\nbe super encrypted because super encryption requires knowledge of\nthe synthetic password, causing a chicken-and-egg problem.\n\nBug: 35849499\nBug: 34600579\nTest: cts-tradefed run cts-dev -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.MixedProfileOwnerTest#testResetPasswordWithToken\n\nChange-Id: I474822f2e026f24ce6f6de1aa58b5012922f7b13\n"
    },
    {
      "commit": "910e081216ac530432ac9d0aab10d5e5e4c73ab8",
      "tree": "d3c1c65d39a11fc3b446bf1534773ae8c46c6263",
      "parents": [
        "faf37babb0bc0962c01750b222fc03bd197b0b62"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Apr 21 16:29:27 2017 -0600"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Apr 21 16:35:08 2017 -0600"
      },
      "message": "More auto-doc work.\n\nAdd support for AnyThread, CallSuper, and UiThread.\n\nAnother related CL started documenting @RequiresPermission, so remove\nduplicated information in existing APIs.\n\nSuppress auto-doc on a handful of classes that are already\nwell-documented.\n\nTest: make -j32 offline-sdk-docs\nBug: 37526420\nChange-Id: I791437dccec0f11d5349a23b982ba098cb551af8\n"
    },
    {
      "commit": "8b651bf7d54f23549c8a7baa27dbed38a35465e4",
      "tree": "0a8bc7769b65d7505baff93dded2de577b965622",
      "parents": [
        "b261269bcf2178a22ce3b4275cd3d89f8ac4a240"
      ],
      "author": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Thu Mar 23 09:26:09 2017 -0700"
      },
      "committer": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Thu Mar 23 09:26:09 2017 -0700"
      },
      "message": "Fix ACTION_STORAGE_CHANGED doc\n\nThe deprecation note was not quite correct.\n\nChange-Id: I15231881bbf1ee1ee4d342bff74280d7e9807ac0\nFixes: 36493384\nTest: builds\n"
    },
    {
      "commit": "ad60c0615facbcccb1a2b4e87584e8e3980c4f4e",
      "tree": "20ad9f32f97a96d667e361eb5c34f12d2d9240ad",
      "parents": [
        "6099e75df2c12f5b4b9e73cf3f8acdbaea4b3146"
      ],
      "author": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Mon Mar 20 13:59:51 2017 +0100"
      },
      "committer": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Mon Mar 20 14:00:25 2017 +0100"
      },
      "message": "Add manufacturer and model to device ID attestation\n\nDiscussions have shown that in addition to brand, device and product,\nwe should also allow devices to attest their manufacturer and model.\n\nBug: 36433192\nTest: GTS com.google.android.gts.security.DeviceIdAttestationHostTest\n\nChange-Id: Idd48929d6a0c9fe6656c6d2656e2c3f6f370a21e\n"
    },
    {
      "commit": "05dc9f764c9d399add8b7495e680f66d098c55eb",
      "tree": "9ef2b8247c040c633438baffc7dd38e9f819339d",
      "parents": [
        "f063264d3a1393608501f9c07180a1f3cfbb8b7f"
      ],
      "author": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Wed Feb 22 23:41:14 2017 +0100"
      },
      "committer": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Fri Mar 03 19:42:51 2017 +0100"
      },
      "message": "Add API for checking which CA certs were installed by the DO/PO\n\nWith this API, the system can determine whether a CA cert was\ninstalled by the user or the user\u0027s DO/PO.\n\nBug: 32692748\nTest: unit tests (see DevicePolicyManagerTest.java for invocation)\nTest: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases\n\nChange-Id: I3bcae5ac18ec2b110154184fc515df804fd73da6\n"
    },
    {
      "commit": "66925ecc64e909a1ec2b650d10a4e8647f9c5f14",
      "tree": "198e0da88f56fcbe0760b9ec931ac446dffdf852",
      "parents": [
        "77f53170030c8a5c6af00d215967a6f455511649"
      ],
      "author": {
        "name": "Frank Salim",
        "email": "franksalim@google.com",
        "time": "Wed Jan 25 22:22:41 2017 +0000"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Mar 02 11:16:09 2017 -0700"
      },
      "message": "Revert \"Add new key purpose Wrap Key to KeyProperties.java and\"\n\nThis reverts commit eb30e64f3fac192404a6ae3c162a0770201a7dc2.\n\nReason for revert: Remove partial support for wrapped key import\n\nTest: CTS tested\nChange-Id: I8008494860534257fa983e1a5169d0ed034621f7\n"
    },
    {
      "commit": "a7aaae881cb3168641e3117a0de6db15b63b5a44",
      "tree": "22d8ca0bc254cc0096665a953831f790e68e51c1",
      "parents": [
        "d92eee2344cbe4eba957a2f6d227dd3361d804d5",
        "abaa0695c5361b36a7a2cdbe87c77bf60be20af7"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Feb 28 22:09:02 2017 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 22:09:06 2017 +0000"
      },
      "message": "Merge \"Delete ParcelableString, add StringParceledListSlice\""
    },
    {
      "commit": "abaa0695c5361b36a7a2cdbe87c77bf60be20af7",
      "tree": "d4df278a80bfdd1b25373072946426981bbfe884",
      "parents": [
        "c98c16ded8738054242b2576a74e145f834b6efa"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Feb 20 20:54:22 2017 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Feb 28 18:07:08 2017 +0000"
      },
      "message": "Delete ParcelableString, add StringParceledListSlice\n\nBoth inherit from package private BaseParceledListSlice.\n\nThis is still bad, but it\u0027s not as bad. The existing code that uses\nthis can just do Foo.bar().getList() now instead of having to marshal\nto and from an oddball type at either end as well.\n\nIn the longer term ParceledListSlice\u003c\u003e should be eliminated, but it\u0027s\nnot clear how far into the future that is going to happen.\n\nTest: runtest -x services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java\nTest: runtest -x core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java\nChange-Id: Ie69b96b5215d6e04990f6d31345772cdfee21d78\n"
    },
    {
      "commit": "3e7cf168a547982676f18d3308b83381abc95f06",
      "tree": "fe117bb7181058d1350a72b2a1079819b7f7aea0",
      "parents": [
        "c98c16ded8738054242b2576a74e145f834b6efa"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Sat Feb 25 01:28:25 2017 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Sat Feb 25 01:32:54 2017 +0000"
      },
      "message": "Make IKeyChainAliasCallback oneway\n\nSo it can be sent from devicepolicymanager (system_server) to keychain\n(a system_app) without waiting on the response and having to do\neverything in a background thread.\n\nSide-effect: the regular keychain \u003d\u003e app callback is slightly more\nefficient now too. in case anyone particularly needs blazing fast\nprivate key user selections.\n\nFix: 35675253\nTest: cts-tradefed run cts --abi\u003darm64-v8a --skip-device-info --module CtsDevicePolicyManagerTestCases --test \u0027com.android.cts.devicepolicy.DeviceOwnerTest#testKeyManagement\u0027 \u003c/dev/null 2\u003e\u00261\nChange-Id: I6e9d96ca3c42e6489d879d8cfb0507eb94838bf1\n"
    },
    {
      "commit": "2c92e9daa4c787e8678c25d4a2d3f3ae2362dd4d",
      "tree": "e2c105b49fe8c00066c5ad3ff8f1820b537c93c6",
      "parents": [
        "02761acc674ae9b13d5bbda493ac794ecc4c1c6e",
        "7c3b65e9b184c975b77b2c202e0d675a6770bd2d"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Feb 14 15:58:28 2017 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 14 15:58:31 2017 +0000"
      },
      "message": "Merge \"Reject HMAC keys smaller than 64 bits.\""
    },
    {
      "commit": "7f5c91c6bce6a8ff2414549219a321a98a98ab31",
      "tree": "ad73588c43eed6d0f29b368b8e3faa3f00562258",
      "parents": [
        "f9a55d42d2e2adbf5895d04e4790debb145508ed"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Wed Feb 08 21:27:02 2017 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Feb 14 13:29:31 2017 +0000"
      },
      "message": "MonitoringCertTask no longer relies on software.device_admin\n\nAdded a test to validate that it still works the way it should before\nand after the change.\n\nBug: 33258404\nBug: 35196414\nFix: 35129745\nTest: runtest -x services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java\nTest: also manual, instructions:\nTest: (1) Disable software.device_admin from tablet_core_hardware, rebuild.\nTest: (2) Install CA cert. Notification should appear.\nTest: (3) Reboot. Notification should still be there.\nChange-Id: Id992725c1844a2fffbde4d8acaba531e99f853ad\n"
    },
    {
      "commit": "59ced28f0f722d2517afc65d755ebb388902f76b",
      "tree": "dd9fd9a52c6558c73222620d96d8021cb429b843",
      "parents": [
        "451911ea3a324a153a30daa42e30987071fc16ed"
      ],
      "author": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Mon Jan 30 23:39:12 2017 +0000"
      },
      "committer": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Thu Feb 02 17:53:32 2017 +0000"
      },
      "message": "Add hidden KeyProtection API to specify SID\n\nAllows the caller to specify which SID the given key\nshould be bound to, overriding the default rule of\nbinding to the current root/fingerprint SID.\n\nThis is a prerequsite for introducing synthetic password\nbased authentication flow.\n\nTest: cts-tradefed run cts -m CtsKeystoreTestCases\nBug: 33126414\nChange-Id: Ide03c0f4fd33ecca7a169ea763c3d4d0b173d1dd\n"
    },
    {
      "commit": "92e8cfd21dbe4800b2ed6f18316b07136af1791f",
      "tree": "fbd65a82c97973365f9f6cd81e48555895f5af48",
      "parents": [
        "9d3d90a22f0f64af71fb970e9a5ce75ac799fe3e"
      ],
      "author": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Mon Jan 23 17:40:47 2017 +0100"
      },
      "committer": {
        "name": "Bartosz Fabianowski",
        "email": "bartfab@google.com",
        "time": "Wed Jan 25 04:47:15 2017 +0100"
      },
      "message": "Add device id attestation\n\nThis adds a new public API for attesting the device\u0027s hardware ids\n(e.g. serial number and IMEI).\n\nBug: 34597337\nTest: CTS CtsKeystoreTestCases and GTS DeviceIdAttestationHostTest\n\nChange-Id: I2e9c1b4f8eb24afa4a09c71c137ce33a6b87eb27\n"
    },
    {
      "commit": "eb30e64f3fac192404a6ae3c162a0770201a7dc2",
      "tree": "4c788e9a0f0307eaeeec2e1ab1f8c610de97f5a5",
      "parents": [
        "a9da39cb645243e334505cd072488593521ea42c"
      ],
      "author": {
        "name": "Crystal Qin",
        "email": "crystalyq@google.com",
        "time": "Tue Jan 03 15:45:23 2017 -0800"
      },
      "committer": {
        "name": "Crystal Qin",
        "email": "crystalyq@google.com",
        "time": "Thu Jan 19 21:02:10 2017 -0800"
      },
      "message": "Add new key purpose Wrap Key to KeyProperties.java and\nKeymasterDefs.java.\n\nTest: There will be a CTS test CL submitted together.\nChange-Id: Ic60c3efc451cd7cbb04689b3d7bf9d607fae6c1f\n"
    },
    {
      "commit": "7c3b65e9b184c975b77b2c202e0d675a6770bd2d",
      "tree": "dc6f29eae3147e7361862f106264a83784add22b",
      "parents": [
        "38b17ad26b2e69081637d6a2836ed2f149462c6b"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Nov 22 06:53:02 2016 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jan 17 05:05:56 2017 -0700"
      },
      "message": "Reject HMAC keys smaller than 64 bits.\n\nTest: CTS test has been updated to verify this.\nChange-Id: I6389d9fa2ff75d08a2223c789e5437190c4b82c6\n"
    },
    {
      "commit": "dea66146038a28e9c7da2ad04a6119cfd83de2f8",
      "tree": "e3b8f683d3f5e5722a11b94a96a5a160d945d1c5",
      "parents": [
        "ebd8b62cfe53192c967dc4a9822d5668d3bec8a0"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Wed Nov 16 06:01:06 2016 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Wed Nov 16 06:06:36 2016 -0700"
      },
      "message": "Test for null context in getPrivateKey\n\nIn N, passing a null context to getPrivateKey provoked a\nNullPointerException, which is validated by a CTS test. In commit\n28d68b1 this behavior was changed (inadvertently, I believe) causing\ngetPrivateKey to wrap the NPE in a KeyChainException. This CL restores\nthe previous behavior, fixing the test and avoiding breaking any apps\nthat were catching the NPE.\n\nTest: Fixing broken test\nChange-Id: Icb0c75b03efc478b7310998cf3e7108a2c419107\n"
    },
    {
      "commit": "0a17db1cc5942ea000ca87bb72853de57a15ec64",
      "tree": "7a0b51064dc654901bd69857c2f3a14fe8d5871a",
      "parents": [
        "9d710882602a8a0ad661cf10ce2cb421f3255ee2"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Nov 04 11:23:46 2016 -0600"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Nov 07 17:03:37 2016 -0700"
      },
      "message": "Detect non-oneway calls leaving system_server.\n\nTo protect system stability, any Binder calls leaving the\nsystem_server must carefully be performed using FLAG_ONEWAY (or\nthe \u0027oneway\u0027 verb in AIDL) which prevents the call from blocking\nindefinitely on the remote process.\n\nIn this CL, the system_server uses the new Binder.setWarnOnBlocking()\nmethod to enable detection by default for all remote Binder\ninterfaces.  It can also use Binder.allowBlocking() to allow\nblocking calls on certain remote interfaces that have been\ndetermined to be safe.\n\nThis CL adds the \u0027oneway\u0027 verb to several interfaces and methods\nwhere it should have been added, and marks a handful of system\nContentProviders as being safe to call into.  Also, we assume that\nany services obtained from ServiceManager are part of the core\nOS, and are okay to make blocking calls to.\n\nTest: builds, boots, runs with minimal logs triggered\nBug: 32715088\nChange-Id: Ide476e120cb40436a94b7faf7615c943d691f4c0\n"
    },
    {
      "commit": "7f99db4e634619144c09f309ed11519e6336b075",
      "tree": "23d54b88a435880c6992c06c46575ef787e45f46",
      "parents": [
        "1a1c99bdf19056cd05999e13cfb2d520cb3dcb15",
        "8f75adc624c70dfd597b7fc3aab993a7d5815f4c"
      ],
      "author": {
        "name": "Tucker Sylvestro",
        "email": "tuckeris@google.com",
        "time": "Thu Oct 06 16:20:19 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Thu Oct 06 16:20:19 2016 +0000"
      },
      "message": "Add the onDeviceOffBody API method to KeyStore am: b32aae2a46\nam: 8f75adc624\n\nChange-Id: Ib8d7bc19a167999894b90b45e7eb1cadb2a85d24\n"
    },
    {
      "commit": "8f75adc624c70dfd597b7fc3aab993a7d5815f4c",
      "tree": "f0254eed5c074f872a47e2a3312596c92efb7c26",
      "parents": [
        "67c1ee6ed40bd6ccf899db32e9977a636e040c65",
        "b32aae2a46bc3678e11c7f0ca88e01a192829490"
      ],
      "author": {
        "name": "Tucker Sylvestro",
        "email": "tuckeris@google.com",
        "time": "Thu Oct 06 16:13:48 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Thu Oct 06 16:13:48 2016 +0000"
      },
      "message": "Add the onDeviceOffBody API method to KeyStore\nam: b32aae2a46\n\nChange-Id: Idbf7f1d505b1d446a3d648dcf1b0f334a629110a\n"
    },
    {
      "commit": "c8d45456bddec043a1b3db6f047e59f0fee8d562",
      "tree": "9a86ca440f50dd9661dc6c338385c22e196a1a80",
      "parents": [
        "9fbfa5dcbd0e466a1d472ee64d93ead9f361870d",
        "f4ac9198497ce3bb10862167772f18ad729f6e24"
      ],
      "author": {
        "name": "Kevin Hufnagle",
        "email": "khufnagle@google.com",
        "time": "Tue Sep 27 02:06:09 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Sep 27 02:06:09 2016 +0000"
      },
      "message": "docs: Fixed broken link to Android KeyStore facility am: c0c4ac5e35 am: 507a5c03da\nam: f4ac919849\n\nChange-Id: I20e5abdffd9ac4fd8b4164ef56c1b3bafb58ad2b\n"
    },
    {
      "commit": "f4ac9198497ce3bb10862167772f18ad729f6e24",
      "tree": "a6af0e516cf0b5a5aa0ab6c44c4c680c2910fd7f",
      "parents": [
        "723ef5d67c5373fba3dc0a25308024fbdb971a7b",
        "507a5c03da5dd807f85902e6610c9b13ad75ab90"
      ],
      "author": {
        "name": "Kevin Hufnagle",
        "email": "khufnagle@google.com",
        "time": "Mon Sep 26 23:47:39 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Mon Sep 26 23:47:39 2016 +0000"
      },
      "message": "docs: Fixed broken link to Android KeyStore facility am: c0c4ac5e35\nam: 507a5c03da\n\nChange-Id: Iec80ad1c7127efb7e257be0625988ef1b2588b0f\n"
    },
    {
      "commit": "b32aae2a46bc3678e11c7f0ca88e01a192829490",
      "tree": "6be59826cbf0cba7ae3acca5bd42e3a6ec84e26a",
      "parents": [
        "1c49ec372b408401ed420431376603927cbcf621"
      ],
      "author": {
        "name": "Tucker Sylvestro",
        "email": "tuckeris@google.com",
        "time": "Thu Jun 23 17:23:33 2016 -0400"
      },
      "committer": {
        "name": "Tucker Sylvestro",
        "email": "tuckeris@google.com",
        "time": "Fri Sep 23 15:11:42 2016 -0400"
      },
      "message": "Add the onDeviceOffBody API method to KeyStore\n\nThis is necessary for allowing the KeyStore to lock keys that remain\nauthorized as long as the device is on-body.\n\nBug 28911985\n\nChange-Id: If50bc84d5a1cb23f9b01b1950c3676d1519cc4f5\n"
    },
    {
      "commit": "c0c4ac5e3533597f6ae9012e1a6417d5a20a3664",
      "tree": "8626d97d40af3e5bd3b66017247a86c2abb72f2d",
      "parents": [
        "8279621b829c656b3e2b1c9fbd14822646cab410"
      ],
      "author": {
        "name": "Kevin Hufnagle",
        "email": "khufnagle@google.com",
        "time": "Mon Sep 19 11:31:08 2016 -0700"
      },
      "committer": {
        "name": "Kevin Hufnagle",
        "email": "khufnagle@google.com",
        "time": "Mon Sep 19 11:31:08 2016 -0700"
      },
      "message": "docs: Fixed broken link to Android KeyStore facility\n\nBug: 13663279\nChange-Id: I859b3c9a35f9e6c63cb0c29260f4aa1aa33ab15c\n"
    },
    {
      "commit": "8910bf2ca0a10d13f6b63301f157567ccefc36eb",
      "tree": "9892f9bf3ae12f5aa51425cb0fc4a56c8be5faf5",
      "parents": [
        "4bb1cc1facc95aa89059c5aa42cf4227f4b3cc9b",
        "f38514ccd666be39410bfff734ef6318979c3f05"
      ],
      "author": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Tue Aug 23 22:29:15 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 23 22:29:15 2016 +0000"
      },
      "message": "Merge \"Handle null packageName in PendingIntentRecord\" into nyc-mr1-dev am: 6acd5e7361 am: 2f6eecbed0\nam: f38514ccd6\n\nChange-Id: I1071a92b4ff74a57bf94c9b6aad9df4fb3852072\n"
    },
    {
      "commit": "c378aabddad75b0c3a2e18afe0c8a649e864dc93",
      "tree": "89e9d6bc48e04dd47d866a9c89e4b0b732a62e18",
      "parents": [
        "2f6eecbed00c9bd91ead475626bebb089355e37e",
        "da23618043667e9cee680688b7413f65b400516e"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Aug 23 16:09:41 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 23 16:09:41 2016 +0000"
      },
      "message": "Documentation warning against short-lived Contexts\nam: da23618043\n\nChange-Id: Ie6e4c05d8d9a273f0f529c2be79f3df4a856fedb\n"
    },
    {
      "commit": "4f7d56a7061ac5513b2d4373180fbb6b519ed65e",
      "tree": "b23cc92526602aee92fd12eb602075eae0d39dfc",
      "parents": [
        "901ec3d0531df6c85770682b371dcca11dd762e8",
        "f04a663d6a06404d000274d551f5e43fca02d88b"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Aug 23 16:06:39 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 23 16:06:39 2016 +0000"
      },
      "message": "Force application context for KeyChain bindings\nam: f04a663d6a\n\nChange-Id: I16c31a9c31527a79addbd2b44003f8fe56cb652f\n"
    },
    {
      "commit": "da23618043667e9cee680688b7413f65b400516e",
      "tree": "fb234ca3e4f157ba5d46e4b73dd36ba445fadd09",
      "parents": [
        "ab6e7c3502e191abb956f9f17959b627e230b0db"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Fri Aug 12 12:46:28 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Aug 23 12:47:54 2016 +0000"
      },
      "message": "Documentation warning against short-lived Contexts\n\nIt\u0027s better to use an Application Context rather than hoping the\nactivity won\u0027t be destroyed in another thread (because it will).\n\nChange-Id: I9bf842d0d7dbedcc509a4a314d23a9a6cfca4d48\nFix: 29873669\n"
    },
    {
      "commit": "e5d71c4cfa21652c21698ba3584fca11c4a75e65",
      "tree": "9f6a0e8a585a15bba8605cb4f1c9f7663445cbcc",
      "parents": [
        "6715c6abbd1e994b6a08948907dab17b5bd2beb8",
        "9e8b4ad9c90f30f8f1d2d57484feca851b439d65"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Aug 09 19:38:00 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 09 19:38:00 2016 +0000"
      },
      "message": "Fix @link tags in keystore doc am: 3f0526ea09\nam: 9e8b4ad9c9\n\nChange-Id: Iadb16bd13d4bb525805dd0266aea046c4c472309\n"
    },
    {
      "commit": "3f0526ea095a880d5ee1e5e55fd2712ff6ffbecc",
      "tree": "f0311b51db323e3820c4cb95708d6807f5d084ae",
      "parents": [
        "997ccdc071c9fe45af972827ca61e4cdf426f9e5"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Jul 21 10:02:16 2016 -0600"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Aug 02 16:45:06 2016 +0000"
      },
      "message": "Fix @link tags in keystore doc\n\nBug: 30258412\nChange-Id: I370a53ebad29ff0471e4b7776cd76b2530efe760\n(cherry picked from commit 9739d48a2101e49b0936096d69c29006f9acdeb5)\n"
    },
    {
      "commit": "1c23ed9601d4b93c2d56243e40ba2e51d3f917b5",
      "tree": "e07d5ba932326b83045cc11d356b8d0a930f8819",
      "parents": [
        "37f0905daf1f800a747af10f4322c2e63f53dc61",
        "9739d48a2101e49b0936096d69c29006f9acdeb5"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Mon Aug 01 23:49:52 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Aug 01 23:49:53 2016 +0000"
      },
      "message": "Merge \"Fix @link tags in keystore doc\""
    },
    {
      "commit": "28d68b14566f1f7f5ceb7cff2b1b31212f83ed1e",
      "tree": "f8b4155c6b9da174ba0b684f5cfb64e6ea684471",
      "parents": [
        "e828bb26b4e50b10efe6c7d64309e7d0c72e0d66"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Fri Jul 22 16:32:32 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Wed Jul 27 11:11:13 2016 +0100"
      },
      "message": "Unbind from KeyChainService before RPCing to keystore\n\nThis leaves the binder connection open for far too long, which keeps\nthe keychain app alive longer than necessary.\n\nBug: 29873669\nChange-Id: I037c2b91400202ba6a474819867df16b6342ec0d\n"
    },
    {
      "commit": "bea9e036f546f34c2066d3aaa9e8173a2720ab99",
      "tree": "66672e5f43aec7c8cae845c792cacefcd503c3be",
      "parents": [
        "12dfccc8c333b09b76464a7c1d260ef4132807a4",
        "dbf01c12d0b9f3fe3b3262529a97e4fe294f5eb8"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Mon Jul 25 23:08:56 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Jul 25 23:08:57 2016 +0000"
      },
      "message": "Merge \"Fix incorrect @link in ACTION_STORAGE_CHANGED comment\""
    },
    {
      "commit": "dbf01c12d0b9f3fe3b3262529a97e4fe294f5eb8",
      "tree": "fe1901e3dd5450a2ee51d41681eb691db5de1e1d",
      "parents": [
        "23f440d30f2a77e3df54a82674979106e136be6f"
      ],
      "author": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Mon Jul 25 14:54:39 2016 -0700"
      },
      "committer": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Mon Jul 25 14:54:39 2016 -0700"
      },
      "message": "Fix incorrect @link in ACTION_STORAGE_CHANGED comment\n\nChange-Id: Ibfca8651a55e32e9caed96b04e5a40dc6ebc3019\n"
    },
    {
      "commit": "f04a663d6a06404d000274d551f5e43fca02d88b",
      "tree": "018a43b51fd3953e2a1ca2310409cc2176eb6589",
      "parents": [
        "dd756c26e2a081365e9a57685419cdb6526c8a8a"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Jul 25 16:09:22 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Jul 25 17:35:12 2016 +0000"
      },
      "message": "Force application context for KeyChain bindings\n\nBug: 29873669\nChange-Id: I68c11ab19a169498045bbc23bc8fe6a2f46be031\n(cherry picked from commit 43e235c0d55fce8ff845c0249a414a1b2daa5b10)\n"
    },
    {
      "commit": "43e235c0d55fce8ff845c0249a414a1b2daa5b10",
      "tree": "707fb5c6f57652d2e44f5f1f746880ff764b3b35",
      "parents": [
        "840212616aede950ca3f3bd0c9d4f6e0a644939a"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Jul 25 16:09:22 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Jul 25 16:09:22 2016 +0100"
      },
      "message": "Force application context for KeyChain bindings\n\nBug: 29873669\nChange-Id: I68c11ab19a169498045bbc23bc8fe6a2f46be031\n"
    },
    {
      "commit": "9739d48a2101e49b0936096d69c29006f9acdeb5",
      "tree": "c5f47940deb8b2e33e9b926d298f08be571c841f",
      "parents": [
        "49f187249d8c14e89c7389827b6e0c46e28bd2a9"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Jul 21 10:02:16 2016 -0600"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Jul 21 10:11:09 2016 -0600"
      },
      "message": "Fix @link tags in keystore doc\n\nBug: 30258412\nChange-Id: I370a53ebad29ff0471e4b7776cd76b2530efe760\n"
    },
    {
      "commit": "cde8c47be613ce78b2282afbc3e94da418072447",
      "tree": "d58ec43c5bd54b6bf0b2ca14a71c7e800f58d687",
      "parents": [
        "f7de5eeeac88441df5782736fafe0a4c6c063e7f",
        "4beff1fc13762bed8181ed967b2dfee83da04c47"
      ],
      "author": {
        "name": "ewol",
        "email": "ewol@google.com",
        "time": "Tue Jul 19 18:01:29 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Jul 19 18:01:29 2016 +0000"
      },
      "message": "Merge \\\\\"Fix a broken case of AndroidKeyStoreProvider error logging\\\\\" into nyc-mr1-dev am: 45b8216d33\nam: 4beff1fc13\n\nChange-Id: I0e547655e9a10572be341db50976c66ae493d021\n"
    },
    {
      "commit": "292d291fa774de46f07573016ff457e86cf749e2",
      "tree": "a0af99e7104a9933c6397aab0d5543455bd49cd9",
      "parents": [
        "a0967ebbdf8a846c85381f0849c3475eebba6701"
      ],
      "author": {
        "name": "Erik Wolsheimer",
        "email": "ewol@google.com",
        "time": "Fri Jul 15 11:18:29 2016 -0700"
      },
      "committer": {
        "name": "Erik Wolsheimer",
        "email": "ewol@google.com",
        "time": "Fri Jul 15 11:22:25 2016 -0700"
      },
      "message": "Fix a broken case of AndroidKeyStoreProvider error logging\n\nBUG: 30117950\nChange-Id: Ib9985493a08d721021d777e0e4a4d67511f190a5\n"
    },
    {
      "commit": "721afae8f1deb2e064d0f973ec3304a07b3e9739",
      "tree": "7c14c7b2002d64c8db9cb0362641af501b79f886",
      "parents": [
        "ec6f6c863f7ad42506debc138c19926b58aed79b"
      ],
      "author": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Fri Jul 08 11:06:09 2016 -0700"
      },
      "committer": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Fri Jul 08 11:06:09 2016 -0700"
      },
      "message": "Mention target API limits for ACTION_STORAGE_CHANGED\n\nBug: 28450538\nChange-Id: I9c69f9d0bdda5b69aec2dc3014a612d84082dc64\n"
    },
    {
      "commit": "4de59ef3238c4bf4b8c994b83be2c703ffad2a5b",
      "tree": "4a66736e782345c88a1d516e5b434852900c2fb9",
      "parents": [
        "b657b9b7febd38e309bef943dcfc55dbb7b30c2c"
      ],
      "author": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Mon May 02 13:17:31 2016 -0700"
      },
      "committer": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Thu Jun 30 09:23:15 2016 -0700"
      },
      "message": "Deprecate ACTION_STORAGE_CHANGED\n\nACTION_STORAGE_CHANGED is too noisy and fires on too many events. It has\nbeen split into ACTION_KEYCHAIN_CHANGED for\naddition/modification/removal of user certificates and keys,\nACTION_TRUST_STORE_CHANGED for changes the the user added and system CA\nstores on the device and ACTION_KEY_ACCESS_CHANGED for changes to key\ngrants.\n\nACTION_STORAGE_CHANGED will only be sent to applications targeting N\nand below. Applications targeting future releases should use the new\nbroadcasts.\n\nBug:28450538\nChange-Id: I34ff838e9858db65f7308ca2b0f7d652c48fae17\n"
    },
    {
      "commit": "d04aaa323c3a788d26f18fc66e0a59b47e525b38",
      "tree": "e514dff2a79b0c0ed41022bc2c006040ecb0f79d",
      "parents": [
        "d5f7bf8032da639ee0286a6d121503fa2dfc4a4c"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Mon Jun 13 12:09:36 2016 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jun 15 11:32:16 2016 -0700"
      },
      "message": "More thorough cleansing of expired users\n\nIf any /data/system_[c|d]e folders were not erased\nwhen the user was removed (maybe due to a reboot),\nmake sure they\u0027re cleaned up on restart as well\nas when the userId is recycled later.\n\nMark the users\u0027 system folders with the correct\nserial number for later verification.\n\nAccountManager shouldn\u0027t be querying accounts of\npartially created/destroyed users.\n\nChange-Id: I4313756b7464f34cd5ce4fb296d61daa50b41fcb\nFixes: 29285673\n"
    },
    {
      "commit": "26e8d553e52055955db83061c5799ba4439ebe1b",
      "tree": "9897e80f04565b6c6edf91f5783183d74cfdaec1",
      "parents": [
        "5e018c04a6d1018b214fb4a727ca3182768301f2"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jun 14 17:27:10 2016 -0600"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jun 14 17:29:54 2016 -0600"
      },
      "message": "Update semantics of on-body Keystore API.\n\nArchitectural changes from the Wear team have required changes to the\nsemantics of the Keystore on-body feature. Although no devices will\nactually implement this feature until the release of new Wear devices\nwith the necessary sensors, we need to get the API documentation right\nnow.\n\nBug: 29369151\nChange-Id: I857e00928f994a1337313123eae7e00534c53c3c\n"
    },
    {
      "commit": "5e018c04a6d1018b214fb4a727ca3182768301f2",
      "tree": "6c7a2267632f185d030e011c159777b7eaa6bc60",
      "parents": [
        "166b0abf13af62ba577b898d4c5ad806f691604a"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jun 14 16:59:14 2016 -0600"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jun 14 17:00:25 2016 -0600"
      },
      "message": "Unbreak Javadoc on getAttestationChallenge()\n\nBug: 28844154\nChange-Id: I8402a39f366291cd2b5d646536cd2c2bab8556d2\n"
    },
    {
      "commit": "682c24e22811d4ee17ae1cd61bf255c3f7e722b7",
      "tree": "14ae11892022b653871ede366b09277254704f5a",
      "parents": [
        "65136ac6a4f6fb2423a0768b451782dcd0e960d5"
      ],
      "author": {
        "name": "Trevor Johns",
        "email": "trevorjohns@google.com",
        "time": "Tue Apr 12 10:13:47 2016 -0700"
      },
      "committer": {
        "name": "Trevor Johns",
        "email": "trevorjohns@google.com",
        "time": "Tue Apr 19 02:03:59 2016 -0700"
      },
      "message": "Resolve merge conflicts of a5060ee to nyc-dev\n\nThis undoes the automerger skip which occured in\ncommit e740c84dc32180214a7fd157105d6c18d30408ee and\nreplays it as a standard (NOT -s ours) merge.\n\nChange-Id: If5a47be26f73d6a0735c425cd66310a3e2a89086\n"
    },
    {
      "commit": "b43659170824dd8d753d9249fe6ccfd37c6221ae",
      "tree": "c9b45209e1828431ae5cbe3043fb6b522db65a24",
      "parents": [
        "6b69b122025631290380f4350f7bd0074bad10dd"
      ],
      "author": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Wed Mar 23 12:13:22 2016 +0000"
      },
      "committer": {
        "name": "Rubin Xu",
        "email": "rubinxu@google.com",
        "time": "Wed Mar 30 11:57:58 2016 +0100"
      },
      "message": "Add DevicePolicyManager API to install a client cert chain.\n\nWhen installing a keypair the caller will have the option to specify a\ncertificate chain which will later be returned to whoever requests access\nto the keypair via KeyChain.\n\nBug: 18239590\nChange-Id: Id21ef026e31537db38d891cb9b712dd4fe7159c7\n"
    },
    {
      "commit": "f78cae3cb4278ba69d5e2de0f2887836d726b412",
      "tree": "db1e562960c2d842767ad24bdfb1ab5767059b8a",
      "parents": [
        "c1a72b6b74c08b0b304998838d1e792884a6354c"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Mar 23 08:52:25 2016 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Mar 23 14:29:33 2016 -0700"
      },
      "message": "Use canonical name for SHA1withECDSA\n\nThe Standard Names documentation says that \"ECDSA\" should not be used\ndue to its ambiguity. Bouncycastle has switched from \"ECDSA\" to\n\"SHA1withECDSA\" so therefore we should switch this \"workaround\" Provider\nto use the same name to keep it functioning correctly.\n\n(cherry picked from commit 8a6c191094b3d1f74dbb71a7f262496377596ba8)\n\nBug: 27753949\nChange-Id: I5acfca9d89c85bf005902a2f06cb5d7b1ef9dff2\n"
    },
    {
      "commit": "7854d58392738338a71506ceb81dad2b5a4656e7",
      "tree": "62732b1866c87412f996172de8fefd6c38ef85b6",
      "parents": [
        "1ca7c808447737fb38330a013dae5ab21deea9b9",
        "21bcbc54dd6b1f029f4973bef27c20e55d057432"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Thu Mar 03 19:11:35 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 03 19:11:37 2016 +0000"
      },
      "message": "Merge \"Guard against null component when binding KeyChain\" into nyc-dev"
    },
    {
      "commit": "21bcbc54dd6b1f029f4973bef27c20e55d057432",
      "tree": "c72ebd2bd73bd8f895604d010e4f3ddd254bd4d6",
      "parents": [
        "42d8b7d7abe4ecab049e020c3836dae97660dd4d"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Feb 29 18:55:35 2016 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Thu Mar 03 18:57:32 2016 +0000"
      },
      "message": "Guard against null component when binding KeyChain\n\nIf keychain is removed from a device, there will be no sensible\nresolution and client apps will bind to whatever is available.\n\nDoesn\u0027t affect system apps which are forcibly prevented from wildcard\nbinding.\n\nBug: 27475655\nChange-Id: Ide1aab3778e12f0b9a96662deb297a76d2f4997f\n"
    },
    {
      "commit": "e4487ea288e9fea837995d9bc4608c8a4a253ec8",
      "tree": "dca512b8025bfdc8d858ceec8964ebb040b34055",
      "parents": [
        "42d8b7d7abe4ecab049e020c3836dae97660dd4d"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Feb 29 17:43:54 2016 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Mar 01 18:56:14 2016 +0000"
      },
      "message": "More sensible return code for Credentials.deleteAll\n\nWas: result \u003d True iff nDeleted !\u003d 0\nNow: result \u003d True iff nDeleted \u003d\u003d nExisted\n\nThe most common reason you\u0027d want to delete all credentials under an\nalias is to be sure they no longer exist. The new contract gives a\nway to do this without multiple IPCs to the same service.\n\nBug: 27335182\nChange-Id: I8762b9b4fcc48037387dd805dbd0dbbe141d5b24\n"
    },
    {
      "commit": "c38eae5229a820966008ae1885af90cd27c265e7",
      "tree": "ed92f88bf2ce4e330e16805ae9f31105c760229f",
      "parents": [
        "f5725e6501f1d326e2b7ab3e9cee5ef4058858df"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Mon Feb 22 23:28:34 2016 +0000"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Mon Feb 22 20:38:00 2016 -0700"
      },
      "message": "Revert \"Revert \"Add option to allow key validity after fingerprint enrollment.\"\"\n\nThis reverts commit 512c132f49fc6e8e4fc119f4cf167d33b2393509.\n\nChange-Id: Iac381dfebcfe42f0468569eb2395ebeb97a95887\n"
    },
    {
      "commit": "512c132f49fc6e8e4fc119f4cf167d33b2393509",
      "tree": "cca39e8c48ecd981704b010f60e0f1ded698920e",
      "parents": [
        "ada0fc1b05902b11401094b15480377d1b6c5a35"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Mon Feb 22 22:59:34 2016 +0000"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Mon Feb 22 22:59:34 2016 +0000"
      },
      "message": "Revert \"Add option to allow key validity after fingerprint enrollment.\"\n\nThis reverts commit ada0fc1b05902b11401094b15480377d1b6c5a35.\n\nChange-Id: I934b6e6af49ab680af726c544f0193dfcb80054e\n"
    },
    {
      "commit": "ada0fc1b05902b11401094b15480377d1b6c5a35",
      "tree": "52dd4df1415d51b57ae6f57fb7edbb1a2d92f41d",
      "parents": [
        "0f900c02d9aafa9a98ff39ea7d661c1cdfbddcdb"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Fri Jan 29 08:32:07 2016 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Feb 18 15:13:50 2016 -0700"
      },
      "message": "Add option to allow key validity after fingerprint enrollment.\n\nBug: 21563854\nChange-Id: I4f601e59fbfcd601e6a80ddcbc7b83ced6cc18c8\n"
    },
    {
      "commit": "adef49640d6339e6b4a6ad736c5815e35d9b8803",
      "tree": "d81f38b7d0964e32e9c94b3ded4c57c01712adbd",
      "parents": [
        "4dbf436cacf3278d607d4692a8596f35771b8567"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Fri Jan 29 07:07:16 2016 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Feb 18 05:50:21 2016 -0700"
      },
      "message": "Add support for extending key validity while on body.\n\nBug: 21563854\nChange-Id: I3b622d2af77ec4ac3ba42407fc391112c153ef0f\n"
    },
    {
      "commit": "8d8c7477746c357d54f586fc92e8d422a4fc6441",
      "tree": "4f045715493d846d7b08b393c13fee3c312fa689",
      "parents": [
        "d1bbdeb86e5b6b83465440947dffc89de46a3f93"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Feb 02 08:27:39 2016 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Mon Feb 08 19:29:54 2016 +0000"
      },
      "message": "Add attestation API to Android KeyStore.\n\nBug: 22914603\nChange-Id: I7c6162dc7a390aa48a2542494780959b01c23bd4\n"
    },
    {
      "commit": "bd0d4265bb1d4a136874f9212cf26f819c5c6b20",
      "tree": "0ac270b48d374aae09ef82ec5bee1657bf3ae28f",
      "parents": [
        "e35bde5291ed986dfe4d202a600a19154dae04ed",
        "b21416e2875973706d8b922428225194d9625875"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Fri Feb 05 22:37:31 2016 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Fri Feb 05 22:37:31 2016 +0000"
      },
      "message": "Merge \"Fix typo in KeyInfo Javadoc.\" am: e8fbc20e12\nam: b21416e287\n\n* commit \u0027b21416e2875973706d8b922428225194d9625875\u0027:\n  Fix typo in KeyInfo Javadoc.\n"
    },
    {
      "commit": "d9dded5a46bb26f621d9da9334dd982217645e93",
      "tree": "77bd465a9e85a6e6815115ddb912d5da9e9e1bc7",
      "parents": [
        "31312ecfd2b701c6b9fdc34156e8a12df3022c25"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Fri Feb 05 14:18:19 2016 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Fri Feb 05 14:18:19 2016 -0800"
      },
      "message": "Fix typo in KeyInfo Javadoc.\n\nChange-Id: I801005a93aee71b93b3d6cf3f7c38361493ff203\n"
    },
    {
      "commit": "9498e8a8d2deb7b0a2e964d5d3c5d3b8747610e9",
      "tree": "698b310de6f10eda346e1700444dabc5dfda4d88",
      "parents": [
        "9e892f53dd489c824b6a39c45028f838123daa85"
      ],
      "author": {
        "name": "Neil Fuller",
        "email": "nfuller@google.com",
        "time": "Mon Nov 30 09:51:33 2015 +0000"
      },
      "committer": {
        "name": "Neil Fuller",
        "email": "nfuller@google.com",
        "time": "Fri Jan 15 16:14:57 2016 +0000"
      },
      "message": "Fix @code escapes\n\nThe body of {@code} must not be HTML escaped. This is one of\nseveral changes that fix the source in conjunction with a\ndoclava fix.\n\nBug: 25757239\n(cherry-picked from commit 71fbb81b14958b80fe55738607740c6630e4e9da)\n\nChange-Id: I19dafddc6501be6fee362c396ac5bbdc934ae39d\n"
    },
    {
      "commit": "3a435f03906778677b846baa7ebedadd3119e892",
      "tree": "807910c15ddf77dccd9bc713112725169284833a",
      "parents": [
        "026688070c8002911dc0a8f1fb487bf5bfed52d4"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Dec 21 12:06:04 2015 +0000"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Dec 21 12:09:20 2015 +0000"
      },
      "message": "Return null on getPrivateKey failure not exception\n\nAccording to documentation:\n\nReturns the {@code PrivateKey} for the requested alias, or null if\nthere is no result.\n\n@throws KeyChainException if the alias was valid but there was some\nproblem accessing it.\n\n@throws IllegalStateException if called from the main thread.\n\nIn this case the alias doesn\u0027t exist or isn\u0027t visible to the caller so\nthey should get null back instead of KeyChainException.\n\nChange-Id: Ied5603ac6aefbcef79050f24c2aa7ee8f386be0b\n"
    },
    {
      "commit": "fbc65644b9bda216699f5f1f883d6dfa2668e545",
      "tree": "cdbcaef4248f442402dcc74faebc4ab2b8c91cc9",
      "parents": [
        "f12288bda135ddf66073adce45e92ea8cc5d7450"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon Aug 03 16:21:22 2015 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Dec 08 16:40:56 2015 +0000"
      },
      "message": "DevicePolicy API to remove an installed KeyPair\n\nThe keypair is specified by alias and removed via a call to the\nKeyChainService, which will have installed the pair in the first place.\n\nBug: 22541933\nChange-Id: I37317e7c22e89816156e6e9a7abf4c5a59e8440a\n"
    },
    {
      "commit": "71fbb81b14958b80fe55738607740c6630e4e9da",
      "tree": "1f1be8961057d82b54b99637b8e6b423ff621575",
      "parents": [
        "355a74f2842b44b0ae07c5f982c50761d47d9ca0"
      ],
      "author": {
        "name": "Neil Fuller",
        "email": "nfuller@google.com",
        "time": "Mon Nov 30 09:51:33 2015 +0000"
      },
      "committer": {
        "name": "Neil Fuller",
        "email": "nfuller@google.com",
        "time": "Wed Dec 02 14:24:11 2015 +0000"
      },
      "message": "Fix @code escapes\n\nThe body of {@code} must not be HTML escaped. This is one of\nseveral changes that fix the source in conjunction with a\ndoclava fix.\n\nBug: 25757239\nChange-Id: Ib38a0fa2dd2a3d68e467f78a812071e763d7e881\n"
    },
    {
      "commit": "7b0b9a1351df7fdcd9ea5d72fe5041186e3789fc",
      "tree": "d1c2c78464623ac5ab0ceb40e5af74d306de3a1d",
      "parents": [
        "fe341d43509e53d5fee56743c2b02e3e5337e4aa",
        "0540e1b127e03ecc97c32719ac79769d69c16aec"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Nov 25 19:23:55 2015 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Wed Nov 25 19:23:55 2015 +0000"
      },
      "message": "Merge \"Custom engineUpdate/engineDoFinal(ByteBuffer, ByteBuffer).\" am: e766e399c5 am: 4bc1904119\nam: 0540e1b127\n\n* commit \u00270540e1b127e03ecc97c32719ac79769d69c16aec\u0027:\n  Custom engineUpdate/engineDoFinal(ByteBuffer, ByteBuffer).\n"
    },
    {
      "commit": "d976c5a4ee0d093592a93ada6e5118dec6892e9b",
      "tree": "f78d7de5352cdd2f3fae5e5d1242484e156cbef9",
      "parents": [
        "9a83f115ade900a816f0fa2beae2cdd6f54bfc54"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Nov 24 17:22:27 2015 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Nov 24 17:22:27 2015 -0800"
      },
      "message": "Custom engineUpdate/engineDoFinal(ByteBuffer, ByteBuffer).\n\nThis makes Android Keystore\u0027s Cipher implementation use a custom\nimplementation of engineUpdate(ByteBuffer, ByteBuffer) and\nengineDoFinal(ByteBuffer, ByteBuffer). The implementation is\nexplicitly designed around the fact that Android Keystore transmits\ninput and receives output via Binder and thus there\u0027s no need to\nattempt any optimizations to avoid copying input and output.\n\nBug: 25863382\nChange-Id: I311072891f02f5e7a283628b51b8d6058b55231c\n"
    },
    {
      "commit": "8f49178b8fe5c0c9d1594052b39d7f24c966cf7d",
      "tree": "5ae94d6e4186efcaf67e198d8813d1a180960ea6",
      "parents": [
        "39d554b7aab31bd772ffa2a17fa4212b7fb60f7a",
        "00245ffce4d08fbb6aeaeba62b8a30ce234862fa"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Nov 17 23:14:38 2015 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Nov 17 23:14:38 2015 +0000"
      },
      "message": "Merge \"Insert Android Keystore JCA Provider at the correct position.\" am: 887d348d7e am: 5995579f5f\nam: 00245ffce4\n\n* commit \u002700245ffce4d08fbb6aeaeba62b8a30ce234862fa\u0027:\n  Insert Android Keystore JCA Provider at the correct position.\n"
    },
    {
      "commit": "8e028e6507ac3e112a3503aaf500eb07f69026bf",
      "tree": "07850a9e16a3e1c2de615015bdbf5166356748e2",
      "parents": [
        "3c54ed00f390e0ce9c555eb517594628b362705f"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Fri Nov 13 17:36:45 2015 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Nov 16 10:11:50 2015 -0800"
      },
      "message": "Insert Android Keystore JCA Provider at the correct position.\n\nSecurity.insertProviderAt uses 1-based positions whereas the\nAndroidKeyStoreProvider.install code was incorrectly passing in\n0-based positions, thus installing the AndroidKeyStoreBCWorkaround\nprovider one level higher than intended. This change fixes the issue\nin AndroidKeyStoreProvider.\n\nBug: 25399691\nChange-Id: I4a66bf37c0d151edb9a2349db9d91939064c0574\n"
    },
    {
      "commit": "2cea8d4b7b15888d80d89cc04fb6d109e1e812dd",
      "tree": "04b01b411958a10afeb35dbd65337f4e1af78933",
      "parents": [
        "733ca8ac78e7e6d24fe6f23f1d5a66a6d18c741a",
        "5bbf04803f050296a6deab10a3c7104743c4e38c"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Sep 10 22:37:50 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Sep 10 22:37:50 2015 +0000"
      },
      "message": "Merge \"Allow uid to be passed for more operations\""
    },
    {
      "commit": "3876b1be27e3aefde9a72eb2e4f856e94fc5f946",
      "tree": "5783b18f074f1971a83a615ef805f5483f6cfb90",
      "parents": [
        "435acfc88917e3535462ea520b01d0868266acd2"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Sep 09 14:55:03 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Sep 10 15:35:06 2015 -0700"
      },
      "message": "Support cross-UID access from AndroidKeyStore.\n\nThis is meant for exposing the pre-existing cross-UID access to keys\nbacked by the keystore service via higher-level JCA API. For example,\nthis lets system_server use Wi-Fi or VPN UID keys via JCA API.\n\nTo obtain a JCA AndroidKeyStore KeyStore for another UID, use the\nhidden system API AndroidKeyStoreProvider.getKeyStoreForUid(uid).\n\nTo generate a key owned by another UID, invoke setUid(uid) on\nKeyGenParameterSpec.Builder.\n\nThis CL does not change the security policy, such as which UID can\naccess/modify which UIDs\u0027 keys. The policy is that only certain system\nUIDs are permitted to access keys of certain other system UIDs.\n\nBug: 23978113\nChange-Id: Ie381530f41dc41c50d52f675fb9e68bc87c006de\n"
    },
    {
      "commit": "5bbf04803f050296a6deab10a3c7104743c4e38c",
      "tree": "b8671ab0d8c5cd02e2db75c38861c70e0a9a692e",
      "parents": [
        "20a17f4a1f0ea06bc5215a6f04f983a8cf23be18"
      ],
      "author": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Wed Sep 09 14:53:52 2015 -0700"
      },
      "committer": {
        "name": "Chad Brubaker",
        "email": "cbrubaker@google.com",
        "time": "Thu Sep 10 15:34:11 2015 -0700"
      },
      "message": "Allow uid to be passed for more operations\n\nThis expands get, getmtime, exportKey, getKeyCharacteristcs and begin to\naccept a uid to run as. This is only for system to use keys owned by\nWifi and VPN, and not something that can be used to do operations as\nanother arbitrary application.\n\nBug: 23978113\nChange-Id: I06aa089859edc934a5415e3b184b917d6d171ae2\n"
    },
    {
      "commit": "72245d7909763dd1ed4cf4082aa1042e0ea61f4d",
      "tree": "e5c5d1eec29b46e3d603f5d0f986843cddb60d58",
      "parents": [
        "4dbb37ae95bdf60d230777c6a5e8d53b932e9d40"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Aug 11 06:41:13 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Aug 11 11:36:09 2015 -0700"
      },
      "message": "Add more examples of generating/importing keys to Javadocs.\n\nBased on developer feedback, this updates Android Keystore Javadocs\nwith more examples of generating and importing keys of various\nalgorithms. This also clarifies that key use authorizations apply to\nsecret and private key and do no apply to public keys.\n\nBug: 23102874\nChange-Id: If0dc20fda4836fd23b9cd9c92490a04e71b19fc0\n"
    },
    {
      "commit": "75e51ec0b14e9c5363ad86a69fd7a764290a5cfb",
      "tree": "b1d18feb041f43d16b00a478b99c38cf54932a7d",
      "parents": [
        "730c0f6591b1c99699e9d0ecf36d696f7d87629f",
        "3ab1f04004c417397bfac8f061dc187b7b66109d"
      ],
      "author": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Thu Jul 30 19:57:22 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jul 30 19:57:22 2015 +0000"
      },
      "message": "Merge \"Raw RSA Cipher relies on keymaster for padding and range checks.\" into mnc-dev"
    },
    {
      "commit": "e4928a2912297751108c7045ce3343ec63edcc01",
      "tree": "abd65971cc8d06e43eebc57bf70232b45c30ea72",
      "parents": [
        "350662197542d406df58aa65afddc9e23f9309d3"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jul 21 13:38:48 2015 -0700"
      },
      "committer": {
        "name": "Shawn Willden",
        "email": "swillden@google.com",
        "time": "Tue Jul 28 13:00:56 2015 -0600"
      },
      "message": "Keymaster digest/padding NONE no longer means ANY.\n\nThis adjusts the public API documentation to no longer say that\ndigest/padding NONE means any digest/padding. This also changes the\nimplementation of legacy key generation and import to explicitly\nlist which digests/paddings the generated/imported key is authorized\nfor. Previously, such keys were simply authorized for digest NONE and\npadding NONE.\n\nBug: 22556114\nChange-Id: Id02d9450a07de16ccb795b76b6de0006dd49dcca\n"
    },
    {
      "commit": "3ab1f04004c417397bfac8f061dc187b7b66109d",
      "tree": "a917f7df99f577caf3a2908a105e21561c141bf0",
      "parents": [
        "ada70be897fb7541129f1ab1f6faa94a80fca986"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 20 09:01:34 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jul 22 13:16:04 2015 -0700"
      },
      "message": "Raw RSA Cipher relies on keymaster for padding and range checks.\n\nThis makes Android Keystore\u0027s RSA/ECB/NoPadding Cipher implementation\nrely on the underlying keystore/keymaster to left-pad the input (if\nnecessary) and to reject invalid input. Prior to this change the\nCipher implementation attempted to do it itself, but wasn\u0027t doing it\nright anyway.\n\nThis fixes a regression where Android Keystore\u0027s raw RSA Cipher\n(\"RSA/ECB/NoPadding\") refused to encrypt plaintexts of the same length\n(in bytes) as RSA modulus which were nevertheless numerically smaller\nthan the RSA modulus.\n\nBug: 22599805\nChange-Id: I591a8115a574eaf8f6075f29b50d93a87532c5eb\n"
    },
    {
      "commit": "ada70be897fb7541129f1ab1f6faa94a80fca986",
      "tree": "4686db46b90b94925b7d73643a0616b0bba5354f",
      "parents": [
        "ff21279e2cbe0bdd9c41350b7a204cabf9370377",
        "a95550f8016bbb0dba086dbd73eec63e6cdbbe98"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jul 22 15:24:27 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jul 22 15:24:27 2015 +0000"
      },
      "message": "Merge \"Add KM_MIN_MAC_LENGTH tag to HMAC and AES-GCM keys.\" into mnc-dev"
    },
    {
      "commit": "5d586dd585a6663290b68abce433a75b5760fc5d",
      "tree": "0bff9f52339afa0a937210feace90ec2556c0946",
      "parents": [
        "23e19066de2caf1db1fa0759ac49a1118b59f7a5",
        "53d544a4b9964166f90f34b46f3866cafefb84e7"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jul 21 19:50:47 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jul 21 19:50:50 2015 +0000"
      },
      "message": "Merge \"KM module may consume less input than provided by finish time.\" into mnc-dev"
    },
    {
      "commit": "a95550f8016bbb0dba086dbd73eec63e6cdbbe98",
      "tree": "e6912c5fdb0fc66d6a5fc7fe48d3e8c640270877",
      "parents": [
        "f7592b234acde62f0f0a93dad77284f12ca9980a"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jul 16 16:32:23 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jul 16 16:52:51 2015 -0700"
      },
      "message": "Add KM_MIN_MAC_LENGTH tag to HMAC and AES-GCM keys.\n\nThis makes Android Keystore add the KM_MIN_MAC_LENGTH tag to generated\nand imported HMAC and AES-GCM keys. This tag specifies the minimum\nlength of the MAC/authentication tag authorized to be used for the\nkey.\n\nFor HMAC keys the minimum MAC length is set to the length of the\ndigest associated with the key (HMAC keys are authorized for exactly\none digest). For AES keys the minimum authetication tag length is set\nto 96 bit. This is the minimum supported by Android Keystore\u0027s AES-GCM\nimplementation.\n\nBug: 22337277\nChange-Id: Ic6e47cf084734d1592788dc58088889f7fff74eb\n"
    },
    {
      "commit": "53d544a4b9964166f90f34b46f3866cafefb84e7",
      "tree": "31072f3652496e693cc4791e49c4cdb713f8ba97",
      "parents": [
        "b09b84cafde5ac31f5ef5c79f7a78db540824471"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jul 15 17:15:08 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jul 16 14:18:49 2015 -0700"
      },
      "message": "KM module may consume less input than provided by finish time.\n\nKeymaster1 HAL permits the implementation of \"update\" operation to\nleave some input unconsumed by the time \"finish\" operation neeeds to\nbe invoked. This needs to be treated as \"invalid input\" error rather\nthan a \"can\u0027t happen\" exception.\n\nThis CL was confirmed to fix the issue by the vendor who encountered\nthe issue.\n\nBug: 22512100\nChange-Id: Ibb1a37d58f650d03605612559a154ce2416d147c\n"
    },
    {
      "commit": "c58153b2d7418f44f2b0e397478be808e91decef",
      "tree": "281c3d80d1265fa344fffe460d4e45509fba0e3e",
      "parents": [
        "532737df65330200dc55ae42d31140d19c4024be"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jul 08 09:31:23 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jul 16 09:59:51 2015 -0700"
      },
      "message": "HMAC keys are authorized for exactly one digest.\n\nThis is in preparation for enforcing the minimum length of MACs\nwhich in the case of HMAC keys generated or imported by Android\nKeystore will be set to the length of the digest for which the\nkey is authorized.\n\nBug: 22337277\nChange-Id: I0255d5ba184dabfb6b45d8f32ddadeb84ab7fc19\n"
    },
    {
      "commit": "6f2eb6d7a642b842976f5eeac2733b6f7e128711",
      "tree": "5c9185214b6bd76b2461911be4e5d13c6fb83b87",
      "parents": [
        "c021aaaf6bd085d7332a33232e8118bab50ecc1f"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 13 15:26:17 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 13 15:26:17 2015 -0700"
      },
      "message": "Fix Android Keystore key factories to obey JCA contract.\n\nAndroid Keystore provider\u0027s KeyFactory and SecretKeyFactory\nimplementations were throwing UnsupportedOperationException instead of\nInvalidKeyException/InvalidKeySpecException from their\ntranslateKey/generateKey methods.\n\nBug: 22459811\nChange-Id: I6d5a5dc1bed724e858ad324d558b7480b9b848da\n"
    },
    {
      "commit": "d25093d2fd151638a108a110484e579cc1dcaf54",
      "tree": "d146d9a6adeefb7d7d1044285b50aa3bd21f5178",
      "parents": [
        "3aa1b1e5ec3a4e2074ea054b931cd68df45b43cf",
        "5c38e7918aea36ee8f516793d5641b05a8de710e"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jul 08 19:32:02 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jul 08 19:32:32 2015 +0000"
      },
      "message": "Merge \"Reject AlgorithmParameters of wrong type.\" into mnc-dev"
    },
    {
      "commit": "5c38e7918aea36ee8f516793d5641b05a8de710e",
      "tree": "155a7595bf30947878248930c949b41bf391f22b",
      "parents": [
        "46c272d6bfc0dd5bbeeb536a9057fa18b754f9ba"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jul 07 15:39:10 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jul 07 15:39:10 2015 -0700"
      },
      "message": "Reject AlgorithmParameters of wrong type.\n\nThis makes Android Keystore Cipher implementations reject rather than\nignore AlgorithmParameters of wrong algorithm type. The danger in not\ndoing so is that a Cipher will produce output that does not actually\ndepend on the provided AlgorithmParameters.\n\nBug: 22330716\nChange-Id: Ifa9de2c74f2fe4b738a3731c895059dddd075a13\n"
    },
    {
      "commit": "024bce82292786f9b71da488f06a0bb35d029bbf",
      "tree": "313cdfb020a01b348aefe531f4cf058f44d4fde9",
      "parents": [
        "a5c82a6b2adfbad7ac9009fa6feba3e02dad0c04",
        "ca7aaeaeee616d9d1d557ee2fb19dd14783be1f0"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jul 07 18:54:32 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jul 07 18:54:33 2015 +0000"
      },
      "message": "Merge \"Support loading AES keys with authorized digests.\" into mnc-dev"
    },
    {
      "commit": "ca7aaeaeee616d9d1d557ee2fb19dd14783be1f0",
      "tree": "3c01cc34d321b2c4122856d80b98dd0cd394b0cd",
      "parents": [
        "7fe86c4753e88058a7f1a1bf8d0302df9a64bd2e"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 06 14:09:01 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 06 14:09:01 2015 -0700"
      },
      "message": "Support loading AES keys with authorized digests.\n\nDue to a bug, Android Keystore failed to load AES keys authorized for\nuse with one or more digests. This CL fixes this bug.\n\nBug: 22300737\nChange-Id: Ia49e27833dddb526565e4dc4977ed1e352e5836b\n"
    },
    {
      "commit": "b6e628644a981b8077b3755b9def4550ff4a46a0",
      "tree": "ab842adc8ff4b36e6372f73d9627f4a6254eb7c9",
      "parents": [
        "7fe86c4753e88058a7f1a1bf8d0302df9a64bd2e"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 06 10:31:07 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jul 06 11:27:16 2015 -0700"
      },
      "message": "Avoid IllegalStateException when generating/importing keys.\n\nThis avoids IllegalStateException when generating/importing keys which\nrequire user authentication when the system is not configured to\ngenerate/import such keys (e.g., secure lock screen not set up).\n\nThe documentation states that before generating/importing such keys\napps should check (using public API) whether the system is in a\nsuitable state. However, some apps are not doing that and instead\ncatching the IllegalStateException thrown during key\ngeneration/import. This is a bad practice because this exception is an\nundocumented implementation detail and should thus not be depended\nupon.\n\nThis CL addresses this issue as follows:\n1. Key(Pair)Generator.init now throws a checked\n   InvalidAlgorithmParameterException when the system is in a wrong\n   state. Because in most uses of Key(Pair)Generator .init is\n   immediately followed by .generate, this prevents .generate from\n   encountering this state and does so using a checked exception\n   which is part of public API.\n2. Key import rethrows the IllegalStateException as a checked\n   KeyStoreException which is meant to be thrown if the key cannot be\n   imported for any reason. Key(Pair)Generator.generate unfortunately\n   cannot throw any checked exceptions and thus has to continue\n   throwing unchecked exceptions.\n\nBug: 22262809\nChange-Id: Ic0f7b7a90e0ba63df9139c79b80a8649d2645d2a\n"
    },
    {
      "commit": "a7bdb6c99b7ddb6e17f9c939c138686e0bfdbbc4",
      "tree": "99414df05a8522eea9496e99bdd20a13a9dcee63",
      "parents": [
        "71e3d079d623b93ec8a66afa6a1281896c7cd2c6",
        "59e3baa8ab08c4da270023540ba15268c87e0d67"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Fri Jul 03 16:48:11 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jul 03 16:48:15 2015 +0000"
      },
      "message": "Merge \"KeyChain: annotate with @WorkerThread\" into mnc-dev"
    },
    {
      "commit": "59e3baa8ab08c4da270023540ba15268c87e0d67",
      "tree": "9c87f8fdec9055c17f9edbd1628ba9c7170dac1d",
      "parents": [
        "fd70942147edec7eb512c72c3fd0f89a3d7fa646"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Jun 30 10:48:06 2015 -0700"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Jun 30 13:08:46 2015 -0700"
      },
      "message": "KeyChain: annotate with @WorkerThread\n\nSeveral methods need to be called off the main UI thread. This is\nthe first documentation of that requirement.\n\nBug: 19440165\nChange-Id: I0303011c0ded6ec1efa92119c1e02a8a39b14a59\n"
    },
    {
      "commit": "fdbc02a433e87da7bc730bd2e773e6d1c84d4e99",
      "tree": "9235f3a2dd06e9eeb55643a66f8badca81246724",
      "parents": [
        "82b3f67711246ad5beaf7702ce16e9d433406d1e"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 29 14:39:29 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 29 14:39:29 2015 -0700"
      },
      "message": "Enforce IND-CPA requirement when generating asymmetric keys.\n\nThis enforces the randomized encryption requirement (IND-CPA), if\nrequested, when generating asymmetric key pairs. Whether randomized\nencryption is used depends on the encryption padding modes authorized\nfor the key pair. Thus, if randomized encryption is required, the\nKeyPairGenerator must reject attempts to generate keys authorized for\nencryption using non-compliant padding schemes.\n\nThis is similar to the existing check in AndroidKeyStoreImpl during\nasymmetric key import.\n\nBug: 22179911\nChange-Id: I3d85367259c17bd44198a736ace853d0d3567d5e\n"
    },
    {
      "commit": "903d0fb98817dca284a640dbc853c7fcbbdc8313",
      "tree": "ff21d11dec3828c271cce69800591ad380e96aac",
      "parents": [
        "0f61c7dcc40276788f58300d5d8ca85be2ce0e59"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jun 25 17:13:30 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jun 25 18:44:43 2015 -0700"
      },
      "message": "Don\u0027t offer crypto ops for public keys of trusted cert entries.\n\nAndroid Keystore cannot offer crypto operations for public keys of\ntrusted certificate entries (entries without a private key). Prior to\nthis CL it accidentally tried to do so, causing crypto operations on\nthese keys to fail.\n\nThe fix is for Android Keystore to offer crypto operations only for\npublic keys for which there is a corresponding private key in the\nkeystore. Crypto operations on public keys from trusted certificate\nentries will be handled by other installed crypto providers. Those\nproviders don\u0027t need a private key to carry out these operations on\npublic keys.\n\nBug: 22091725\nBug: 21835320\nChange-Id: Ib7d92b067711e4c57128d0db72c08bf288a45ce1\n"
    },
    {
      "commit": "25d2270704e246d897596c991a36233cdc620790",
      "tree": "70f1800de6e8474bbd3140a8a079eae29c3a7b48",
      "parents": [
        "c781405f43ca06041777f2e382c0d5b7bdeac43a"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jun 25 09:04:37 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Jun 25 09:09:04 2015 -0700"
      },
      "message": "Support RSA encrypt using private key and PKCS#1 paddding.\n\nSome apps such as OpenVPN Connect for some reason generate\nPKCS#1-padded RSA signatures using Cipher (initialized in\nCipher.ENCRYPT_MODE with private key!) instead of using Signature.\n\nUnfortunately, RI supports this strange behavior and previous releases\nof Android Keystore did the same. So, we have to continue supporting\nthis craziness.\n\nBug: 22083023\nChange-Id: Ife3950d0d4ceb4e44e08014635312c1252878b69\n"
    },
    {
      "commit": "d23dc502b0a1952887d4453cba98aa2e3d2f5009",
      "tree": "ec5252f24cf19123d994cd084c18902134734b12",
      "parents": [
        "cede20a7c273279a9bc51750bdd99c1383816e3e"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jun 24 12:25:52 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Jun 24 15:42:09 2015 -0700"
      },
      "message": "Make NONEwithECDSA truncate input when necessary.\n\nKeymaster\u0027s implementation of ECDSA with digest NONE rejects input\nlonger than group size in bytes. RI\u0027s NONEwithECDSA accepts inputs\nof arbitrary length by truncating them to the above size. This CL\nmakes Android Keystore\u0027s NONEwithECDSA do the truncation to keep\nthe JCA and Keymaster happy.\n\nThe change is inside AndroidKeyStoreECDSASignatureSpi$NONE. All other\nsmall modifications are for supporting that change by making it\npossible for AndroidKeyStoreSignatureSpiBase to pass in the signature\nbeing verified into KeyStoreCryptoOperationStreamer. This in turn is\nneeded to make it possible for NONEwithECDSA implementation to provide\na wrapper streamer which truncates input.\n\nBug: 22030217\nChange-Id: I26064f6df37ef8c631d70a36a356aa0b76a9ad29\n"
    },
    {
      "commit": "ae6cb7aad56bb006769cd8a69b92af7236644fc1",
      "tree": "e70a45074619bb3e1f97cb5dcfe0c28bbfe60129",
      "parents": [
        "12402dafeaf2ec8255d6331d3e82028d694b87d7"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 18:09:35 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 20:04:28 2015 -0700"
      },
      "message": "Keymaster INT, LONG and DATE tag values are unsigned.\n\nThis CL ensures that Android Keystore framework code complies with\nsignedness of keymaster tags. In particular:\n* INT tags are unsigned 32-bit numbers, and\n* LONG and DATE tags are unsigned 64-bit numbers.\n\nThe ensure compliance, KeymasterArguments and KeyCharacteristics\nclasses through which Android Keystore interacts with Keymaster tags\nhave been modified as follows:\n* ENUM and INT tags which used to be conflated are now added/queried\n  via separate methods, because ENUM can remain represented as an int\n  data type whereas INT is now represented as a long data type with\n  permitted range being [0; 2^32).\n* Methods for adding/quering LONG tags have been switched from the long\n  data type to the BigInteger data type and now ensure that the value\n  is in the permitted [0; 2^63).\n* Methods for adding/querying DATE tags now ensure the Date value is\n  in the permitted range [0; 2^63) ms since Unix epoch.\n* Methods for adding tags throw an IllegalArgumentException if the tag\n  type is unsuitable for the method. This is to ensure that tags with\n  invalid values cannot be added through similar methods (e.g., INT tag\n  added via an ENUM tag addition method invoked with a negative value).\n\nBug: 22008538\nChange-Id: I6eefd5cbb561cc52d27de952691af4d9d5e1af1e\n"
    },
    {
      "commit": "90c9e4eb54a9c4b4fbc821b1992f2aee2f2b1e8c",
      "tree": "3adda6bc46dacb89715e293c6c9f285bdc80e1a9",
      "parents": [
        "f1b25bd43464b2603da98ce5f03f41d9819d2374",
        "d6c7799b9a8b00d160a1d2d32c7326132cbc7b7b"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 20:35:23 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jun 23 20:35:30 2015 +0000"
      },
      "message": "Merge \"Keymaster key validity dates are optional.\" into mnc-dev"
    },
    {
      "commit": "d6c7799b9a8b00d160a1d2d32c7326132cbc7b7b",
      "tree": "69af6ee4fd661f6386eb7f30ed4d93b79e008187",
      "parents": [
        "6d2268a57603e1c60329b93fb853ac2c134cb932"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 12:06:27 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 12:06:27 2015 -0700"
      },
      "message": "Keymaster key validity dates are optional.\n\nThis CL makes Android Keystore framework code add\nKM_TAG_ACTIVE_DATETIME, KM_TAG_ORIGINATION_EXPIRE_DATETIME, and\nKM_TAG_USAGE_EXPIRE_DATETIME tags to the authorizations set only\nif the corresponding time instants were specified through the\nframework-level API. This is fine because these tags are optional as\nit turns out.\n\nBug: 18088752\nChange-Id: I6a5ae4cadb441e61576231815e6bec6e9248bc72\n"
    },
    {
      "commit": "81d299e4b8bb7520881f39303f25b5d68417b9e2",
      "tree": "a4e0e64cfe8bb18134cad489c101471586d8ab08",
      "parents": [
        "bb0e985bed952734f4271672fd804539a66a2d36",
        "856aebe571e2efe332c1258b3131bfbae6f4b396"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 18:58:23 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jun 23 18:58:25 2015 +0000"
      },
      "message": "Merge \"Don\u0027t fail if self-signed certificate can\u0027t be signed.\" into mnc-dev"
    },
    {
      "commit": "856aebe571e2efe332c1258b3131bfbae6f4b396",
      "tree": "7a3f0d80f8d0fd21ba1390a401af1bd6e26496bd",
      "parents": [
        "6d2268a57603e1c60329b93fb853ac2c134cb932"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 10:54:44 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 10:54:44 2015 -0700"
      },
      "message": "Don\u0027t fail if self-signed certificate can\u0027t be signed.\n\nThis makes Android Keystore\u0027s KeyPairGenerator fall back to generating\na self-signed certificate with an invalid/fake signature when the\nattempt to generate a self-signed certificate with a valid signature\nfails.\n\nThere is a growing number of reasons/authorizations due to which the\ngenerated private key cannot be used to sign the self-signed\ncertificate. It\u0027s safer for KeyPairGenerator to succeed than to fail.\n\nBug: 22033161\nChange-Id: I1ecbd421346166bfd536b5cfbaea169b11f0b1c8\n"
    },
    {
      "commit": "7ecb298c6d5a4af561ed98dbc0ff4040132d01d5",
      "tree": "7973a848a84dcab633e37f503ca34b1b744850c9",
      "parents": [
        "6d2268a57603e1c60329b93fb853ac2c134cb932"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 09:08:06 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Jun 23 09:09:11 2015 -0700"
      },
      "message": "Fix typo in Android Keystore KeyFactory exception message.\n\nThe typo was pointed out by kroot@ in code review of\n4ecd092226fbd748b4a26f3bbb5c4d25a3488fff after it was submitted.\n\nBug: 18088752\nChange-Id: I50d2fa93e1a2d352fe432e34ce98add82a71c483\n"
    },
    {
      "commit": "e26f9d95c6da72c4e96739cb0b743cea3edfd1e6",
      "tree": "ece6e666aa7629b3415bb6bf9377eec8e5c4ebaf",
      "parents": [
        "bf224d93cca7a7db1d65762bab41fb8a65e2b1fe",
        "6e90ade5dd7a3c3cd8a3949c863c6e72f9912233"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 22:27:49 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Jun 22 22:27:51 2015 +0000"
      },
      "message": "Merge \"Adjust minimum size of PKCS#1 RSA padding overhead.\" into mnc-dev"
    },
    {
      "commit": "3867709fb3840fa26072fef66ba7121a0e41871f",
      "tree": "5f6f5f5b683c5df3afdf3ad5f63ff2016fd90daf",
      "parents": [
        "c54bcade1b7ec7e044aca7fe9c60357ad957a8c2"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 13:42:46 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 13:42:46 2015 -0700"
      },
      "message": "Document that RSA OAEP requires digest authorization.\n\nRSA encryption/decryption keys used with RSA OAEP padding scheme now\nrequire the key to be authorized for the digest used by OAEP.\n\nBug: 21998286\nChange-Id: I1f5eb1b30a1b574c45ffcabed6096de8671882d3\n"
    },
    {
      "commit": "6e90ade5dd7a3c3cd8a3949c863c6e72f9912233",
      "tree": "5daea962ba97bfc433346dec91a4fc4af789b8f1",
      "parents": [
        "c54bcade1b7ec7e044aca7fe9c60357ad957a8c2"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 13:21:59 2015 -0700"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Mon Jun 22 13:21:59 2015 -0700"
      },
      "message": "Adjust minimum size of PKCS#1 RSA padding overhead.\n\nThis raises the space overhead estimate by one byte, due to me having\noriginally forgotten that when signing using RSA PKCS#1 padding\nscheme, the plaintext of the RSA operation needs a leading 0 byte.\n\nBug: 21955742\nChange-Id: If78efcd375afd8902a14a2217ddedfea87d4d337\n"
    }
  ],
  "next": "84a378f256bf7925ceb5d2c039a033d3e59b75df"
}
