Essentials: [SecureStorage] Java.Lang.UnrecoverableKeyException

Created on 10 Jan 2019  路  23Comments  路  Source: xamarin/Essentials

Description

I get an exception when calling GetAsync and SetAsync in SecureStorage

Steps to Reproduce

Tried to call GetAsync on a key that should exist. Later tried to call SetAsync for that same key.
I don't have a repro yet, but I provided a lot of stack trace & debug info...

Exception happens both in GetAsync and SetAsync

Expected Behavior

Just return the value

Actual Behavior

Exception thrown.

Exception message: Failed to obtain information about key
Exception type: Java.Security.UnrecoverableKeyException
Exception stacktrace:

  at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00089] in <42dc777b518744fdae9988e94489a4a0>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeNonvirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0001f] in <42dc777b518744fdae9988e94489a4a0>:0 
  at Java.Security.KeyStore.GetKey (System.String alias, System.Char[] password) [0x00043] in <1219ce5aae934ab095dc0e05b2110050>:0 
  at Xamarin.Essentials.AndroidKeyStore.GetSymmetricKey () [0x00011] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:164 
  at Xamarin.Essentials.AndroidKeyStore.GetKey () [0x0002d] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:108 
  at Xamarin.Essentials.AndroidKeyStore.Encrypt (System.String data) [0x00000] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:249 
  at Xamarin.Essentials.SecureStorage.PlatformSetAsync (System.String key, System.String data) [0x00014] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:48 
  at Xamarin.Essentials.SecureStorage.SetAsync (System.String key, System.String value) [0x00021] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.shared.cs:27 
  at BelgianRail.Edrive.Core.Services.SettingsService+<GetDbKey>d__4.MoveNext () [0x0012b] in /Users/sam/Code/3factr/ypto-edrive/src/Shared/Core/Services/SettingsService.cs:75 
  --- End of managed Java.Security.UnrecoverableKeyException stack trace ---
java.security.UnrecoverableKeyException: Failed to obtain information about key
    at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreSecretKeyFromKeystore(AndroidKeyStoreProvider.java:282)
    at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:98)
    at java.security.KeyStore.getKey(KeyStore.java:1062)
Caused by: android.security.KeyStoreException: -32
    at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
    at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreSecretKeyFromKeystore(AndroidKeyStoreProvider.java:283)
    ... 2 more

Inner exception is of type Java.Lang.Exception
Inner exception message: -32
Inner exception stacktrace:


  --- End of managed Java.Lang.Exception stack trace ---
android.security.KeyStoreException: -32
    at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
    at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreSecretKeyFromKeystore(AndroidKeyStoreProvider.java:283)
    at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:98)
    at java.security.KeyStore.getKey(KeyStore.java:1062)

Basic Information

Contents of xamarin essentials preferences file:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="22caab64206056720e77568586cf2fd2">psv1wmo0SgB4vRj/xx2j/q8YhdZ7IpccOtO8ivYUKY/ucUP3k10rKhpgRqBAPa6csUKuspNOVowESEuNjyUF4ZTW25xc3Nmrmhwsy0jSsFyNLSbi/BQeleLFH6LPgHmRNpJimLF7OFSxkbbBBliTxDnU8j0EKsvlfji8A3Sp/yyLyMFOaFZDoIU/zhwCknRB3xU8YroDCsKZ75jTH6ApBPOpELGiRwbLWKVgKVaixbshW22kxkXxmeL57Tb+Y1hrH/GZh6H4tBqqivyZ80w9Aqy9j1GKzuHTKLJsFLbYfW8sYaXCytTfuXIN31e4a/SFFCHt9ufkBiGe92vMyX8MRO9gDLZ0wua6oS75v4N3HXpgx64kd7YyBPjXIdACIVBcgzLZmiexRKPyw0+qh1cm5kU1B4ABzw6yTIfXwntpzvvfsyrd5g8V274FdKnAgPfZRAN8KfMhq3xTraNd6UnbY13QcEQMDKqPTcFd1vnh6eiBOcaE2DX2Csk6y+RqjqMkFYlyP8gQwaX9ucG6nLlryMw/wxC239uHiyysiSnogZItxTrIFWSoxlTx3VsMv2XvG+XWaKWxT1/CFukl49MMbcOytSrOIbsz7w8qoK1XcrPoshXQ2NqAYaWEbL/an+kEh1HsOGRcIQ1T2qcrcPMnfhlc5BF2jLvhEKKKCghWdCdl7X/vdJS6vL5WrwbUV2Cffp8FU4rEgezMNygQ2qYout8CDtRL0yT++9RHthNj+3ai4tLZBPrxoh5X8JrCWGvykxuNBQP77FRAMM8pntPuHhNC1QNP1WWgJbFqKL9sHvVZRcuqWKBE0gSHpKLqeA5AGu6W98nzSYMkYqkjtLTeIshw8sVanHfwfqx2lSuAULm9oJ/xR680VfDe3FiZD8M0a0HC6rOytOgDiTHBMYQ1b4LDIhLD0PIHKnjPd83AElY6APYhaIuRH6kFenB1QUnGajyNa5HcG29IlYysOch3z4+oa9yfsdJNBnNdyGV5etzh74DGublgKp+o0g34/NFITKxmZiRxqKiB6VOzQZx7aiNOtvwGldcsOZ6TpYFFyIOPjMNAIeL6pgculCtPpfw2D4VwgfcX/ovN70QU6qGe2MWM7+QfxNscIecH5MjSXKaOsPKWo+TFd/DmY61pcWqA4hr91NppqE4bHymJ/38NQ/4IMj/yQiUyL7r54QgfSR9Hz3hKiijXICfIRURlNzGKZ/AOY6hR1bANsmKt+70ZUk1AF64lDhVlGIutAgz9eSzXTq50UqS74pEhS1OtYbHgtepfk0J6X0YAF4OB7PBtUz47ve4QSk4VuSDy+8N8EveAHP1wYSVxfqOJWG1QuumqJXZyThNvKlNIwihpkkCfaRB2P95X+5XvIzCpeJyYReKFdt/ysqJb7ezSQqGIMrcrtB0iW7Rbe15WpE/yN8VGb6L2T1VUapqEdg2hI253fymlM9ORtZRvORqG9FPFDzKm7NxQJUhREfD9c6Dyvj3rUqNZ/BytS5lm7MHqJLpIEFLIfdFkGvfYBnInA/cnjOtqC91ZXea1bT9RmkyNfM7jcbfmF1hBixa3RqScm6S0oojeslyOM54FrLVWSp9EqEl0USQpcjHcRwgIlWwPV8VlL1vNJ+8k1dVxF1egxzsAP8tWsH7sxrQNWR7e+P6lLpbQP/v6O0AQhTN4HYZe0SUMRRblBFpxUE/Of62iTWffPW1Su+aQqZ8nzveoTaFsHd0I0KDyHtUzYueMPYaMN2MD</string>
    <boolean name="essentials_use_symmetric" value="true" />
    <string name="0c4d0d7a45a30f5a91648a82059ef792">WkYVNMC4CxvWdLNCKklJkNdj96JX3Rs1URDteucue7QmaVjrd9KJN9RhuuQFSLF9deH+46swvqJ6xvtpFYCo3IQnIJ/2NnPh</string>
    <string name="675ed9f7559c8224be748a0729de6e75">Swv3jDtGkPI7VGB7uTzl0XLjG8/3sSWe7BnwUdhw5Ca3gAMaM9NyFAyQTi6MYdEr/UWuUl87FW8swg1xCaKTyX95+8Yt27nJBwVPh5jS/wbS2GAHQLPMvVPvDxEYMUKW2g3yXF9vgU1FH7qlCEzEB8wpy9g9dDa8Yx1/rwVfSIsuey4BeSTDWfzilQwTXLdRK6a/EMddrE6DZSxszrt2mouyiI9AZ4YGZMkeiDDDqC6jYE0MPfCOmsQVrLZUHXH9Gc/wC5Nl9CkK7u7gb1hlL45zY4rCotzXKvkNxE6IdN6JqA78OCTOUcyg+papkvdlgzKS+hnKJGhOcKlj+SWAONMAlNdMbAylquyXOUIvesOAHDqX+eKV3yr3smayQY0eDYUASNlh2HttUbkQ3Zg84e3iqnAVyUmjubnLRtGT3MeiqQh+wb8BLcj5glgldaY040wUWVnb1MyEm61d1346glGjPWP0rR7yAB3rJDMvJF1/95z7T7AXwGC35I+po6rmc5vxxWo/DwOhV/Xa1DWdeD6JX8vb6YaeaM0odWMYrxoA6uEtBvuPnC0bFhVOinWKse7k40MfOBFxBFGkqZiK8653alWQSRrf4/7ub1A9yj0xKhlWpgi8ZcEUBhEN1XlC3WHc+ve7n7eRdpCxB/Eknk8xrtr0KMiRSCW/+n1UrFCRmtH0QhjyBRQrXPmxzozHVZb9i1fIw2+81X9ezMku4wb6Fgfv4dFm7kSEbYBG/DEMRFavFRq64SLkIUkFKTCyxMIKsiFZjzG2l2b5Djd6Le0Y+IPCEp565JDL2Muv4MqRkMsxS+Mf/WSwy1O4aD+x8L/T3DNdJT8vEDWhK2WdeTyRZFcYe8KgdAMXBTDDMpi80Jw6LYDKiaVLrvizcif2Q2+sBBWiqymKCIK6/zeYP2ino6TJnquBW1SeyRRJY7Wr3YZ9+ho7FM8sBCnTq65sUHx0aqEK84OMP8R2mgCySZ9LE06oPiEhK1rvBBtm+LXpcRQzgaWKdyKNV0/PO6BK47dJyNDxkcXlvYLWSQu5tccCjW2zSCgy+8+eTGsX8Z1u9Ep3us42uECcvZa6sfPmCO+NXFOTrUmeG22E2pdf/qOtUV83ht+eJBAWafJVGGqbNwTfZ/JUnSidw5xS3u88w8VrG+jCu/wwtDRYJgzQysM88L13aG44zc6If80SNfzapc1ilB3k+76zLwAkq2UISoe6MdYLHTLk1j+Xf8E6qCtUx2Y4Rq73RNe/FUSr91Zb0LdqLlQZMx7k5j6ipK2KLw3fsMklRNwDU3tVBn5SKGm+zjFsi8IvyqsZtbyZjjgpMbhGqpEoe8rChpHA2XjduDgfFob6V91CY7BlGedAjoN3xOzGCbvzYRjIbcKxVufbgpu3TYnjB4GI0PCnDLt1mz+YCBCTXqGIscjErPtk/oJMsQ8nmwYMIjpgeOIYvdZPIJ/IseA81s2dRd0hBvyoXaLx7wgMEuMKP+x2WZ9Tg/axuHRav9980m94GEbTgzaX0qLR5hQevQhNsPboVb5i3D6Z5xKwHmzoLuBEdhcRkHrQit+nywlPq4aZzFkqhtiZc5u3FNm79etj64Fg4l/wzSJUz5XS3vY7tw/1AgMiuyUsU0XJKDXo9fZpvYU0ERA3ZwJRP8pdkUOZJjgRVso6pYr8W8RPasvHblj+VNjPO9lnslvE5r7T8kDbvVwkZWphzL6RXRrGg335lJNv9HpUjHOBxPKj5bfIO4Aud03bTVq9pFYhyjaWDVm/2PDo07yNiEs1RugaoqLpvszCuQeWt98PP8aJxcqP0E4r6f0arHjklyjL3yqk0ANF7NcVz7LJoua6yL5gHG3WA0KJaMMIjuDfGIarumCK4NHP1+BLm2jR02yZfxdePSo1uIuSuguihJtJpg4G7YXFaxsetrR9A9M4kXF/UiRf/iM=</string>
</map>
  • Version with issue: 1.0.0
  • Last known good version: ?
  • IDE: VS 4 Mac 7.7.2
  • Platform Target Frameworks:

    • Android: Android 8.1

  • Android Support Library Version: 28
  • Affected Devices: emulator Android 8.0 with Google APIs x64

IDE info

=== Visual Studio Enterprise 2017 for Mac ===

Version 7.7.2 (build 21)
Installation UUID: e1324239-09f8-4ef0-841d-818a176fdfbd
    GTK+ 2.24.23 (Raleigh theme)
    Xamarin.Mac 4.4.1.178 (master / eeaeb7e6)

    Package version: 516000221

=== Mono Framework MDK ===

Runtime:
    Mono 5.16.0.221 (2018-06/b63e5378e38) (64-bit)
    Package version: 516000221

=== NuGet ===

Version: 4.8.0.5385

=== .NET Core ===

Runtime: /usr/local/share/dotnet/dotnet
Runtime Versions:
    2.2.0
    2.1.2
    2.1.1
    2.1.0
    2.0.7
    2.0.5
SDK: /usr/local/share/dotnet/sdk/2.2.100/Sdks
SDK Versions:
    2.2.100
    2.1.302
    2.1.301
    2.1.300
    2.1.200
    2.1.4
MSBuild SDKs: /Library/Frameworks/Mono.framework/Versions/5.16.0/lib/mono/msbuild/15.0/bin/Sdks

=== Xamarin.Profiler ===

Version: 1.6.4
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Apple Developer Tools ===

Xcode 10.1 (14460.46)
Build 10B61

=== Xamarin.Mac ===

Version: 5.2.1.12 (Visual Studio Enterprise)
Hash: 65ec520f
Branch: 
Build date: 2018-12-05 12:06:09-0500

=== Xamarin.iOS ===

Version: 12.2.1.12 (Visual Studio Enterprise)
Hash: 65ec520f
Branch: d15-9
Build date: 2018-12-05 12:06:09-0500

=== Xamarin.Android ===

Version: 9.1.4.2 (Visual Studio Enterprise)
Android SDK: /Users/sam/Library/Android/sdk
    Supported Android versions:
        2.3   (API level 10)
        4.0.3 (API level 15)
        5.0   (API level 21)
        6.0   (API level 23)
        7.0   (API level 24)
        7.1   (API level 25)
        8.0   (API level 26)
        8.1   (API level 27)

SDK Tools Version: 26.1.1
SDK Platform Tools Version: 28.0.1
SDK Build Tools Version: 28.0.3

Java SDK: /Users/sam/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_1.8.0.9
openjdk version "1.8.0-9"
OpenJDK Runtime Environment (build 1.8.0-9-microsoft-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

=== Android Device Manager ===

Version: 7.7.1.0
Hash: 06ceaea1

=== Xamarin Inspector ===

Version: 1.4.3
Hash: db27525
Branch: 1.4-release
Build date: Mon, 09 Jul 2018 21:20:18 GMT
Client compatibility: 1

=== Build Information ===

Release ID: 707020021
Git revision: f1fea53df9eb0bb5890a9563c0d7ea7b03922144
Build date: 2018-12-14 18:37:35+00
Build branch: release-7.7
Xamarin extensions: 9c5cea335e6a9ce4ccfde31c4aa06c25a3576085

=== Operating System ===

Mac OS X 10.14.2
Darwin 18.2.0 Darwin Kernel Version 18.2.0
    Mon Nov 12 20:24:46 PST 2018
    root:xnu-4903.231.4~2/RELEASE_X86_64 x86_64

=== Enabled user installed extensions ===

Android Signature Tool 2.1.2
Gist Ide Information 1.1.0
NuGet Package Explorer 0.3
Open With 0.1
NuGet Package Management Extensions 0.15
xUnit.NET 2 testing framework support 0.7.5
bug

Most helpful comment

Also running into this issue after factory resetting an Android Emulator.

All 23 comments

Does this happen consistently?

It looks like perhaps the keystore is locked or uninitialized. I may need a logcat possibly to see more on it. Will investigate

Also, where are you running the code? Are you running it in background code at all or a service?

Logcat:

01-18 18:11:04.721  [email protected]  1373    -   D   TrustyKeymaster  Device received get_key_characteristics
01-18 18:11:04.721  [email protected]  1373    -   E   TrustyKeymaster  calling trusty_keymaster_call insize 199 msg size 203
01-18 18:11:04.721  [email protected]  1373    -   E   TrustyKeymaster  Received 4 byte response
01-18 18:11:04.721  [email protected]  1373    -   E   TrustyKeymaster  Error: Response of size 4 contained error code -33
01-18 18:11:04.726  [email protected]  1373    -   D   TrustyKeymaster  Device received get_key_characteristics
01-18 18:11:04.726  [email protected]  1373    -   E   TrustyKeymaster  calling trusty_keymaster_call insize 199 msg size 203
01-18 18:11:04.726  [email protected]  1373    -   E   TrustyKeymaster  Received 4 byte response
01-18 18:11:04.726  [email protected]  1373    -   E   TrustyKeymaster  Error: Response of size 4 contained error code -33

When I get the exception, it's on thread 1 (so the UI thread I suppose). It's during the init phase of MVVMCross.

It doesn't happen consistently, but when it happens, it keeps happening until I clear the app's data.

Are you reading / writing to the storage from different threads at all? @jamesmontemagno maybe this has something to do with that change you did to not save settings synchronously - or was that just for preferences? I know that secure storage has some hand in preferences for some things.

Yes, probably from different threads. However not at that same time. My app can't do anything unless it has the key to unlock the database which is the first thing it retrieved from SecureStorage at startup. Did I miss something in the docs about the thread I should be using?

I don't think we expect any issues. Not sure how hard it would be, but is it possible to wrap the calls to read/write to secure storage in MainThread.BeginInvokeOnMainThread and see if the issue is still happening? If it does, then we can look to see if something is corrupting the data. If it fixes the problem, we can have a look at what we can do to fix this.

I'm also running into a similar issue. The Set call was being called from a background thread. Switching it to force the set call from the main thread (Device.BeginInvokeOnMainThread) had no impact.

[MonoDroid] System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Java.Security.UnrecoverableKeyException: Failed to obtain information about key ---> Java.Lang.Exception: Invalid key blob
[MonoDroid]    --- End of inner exception stack trace ---
[MonoDroid]   at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00089] in <da9f450baed342f3af31c42cec968688>:0 
[MonoDroid]   at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeNonvirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0001f] in <da9f450baed342f3af31c42cec968688>:0 
[MonoDroid]   at Java.Security.KeyStore.GetKey (System.String alias, System.Char[] password) [0x00043] in <ea97b6d670fe4c1ba9dadb89b2fa0103>:0 
[MonoDroid]   at Xamarin.Essentials.AndroidKeyStore.GetSymmetricKey () [0x00011] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:164 
[MonoDroid]   at Xamarin.Essentials.AndroidKeyStore.GetKey () [0x0002d] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:108 
[MonoDroid]   at Xamarin.Essentials.AndroidKeyStore.Encrypt (System.String data) [0x00000] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:249 
[MonoDroid]   at Xamarin.Essentials.SecureStorage.PlatformSetAsync (System.String key, System.String data) [0x00014] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:48 
[MonoDroid]   at Xamarin.Essentials.SecureStorage.SetAsync (System.String key, System.String value) [0x00021] in C:\agent\_work\69\s\Xamarin.Essentials\SecureStorage\SecureStorage.shared.cs:27 
[MonoDroid]   at app.xam.Services.LocalStorageServiceBase.set_SasToken (app.xam.Member.SasToken value) [0x0001a] in /Users/kensykora/Workspace/app.xam/src/app.xam/Services/LocalStorageServiceBase.cs:296 
[MonoDroid]   at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
[MonoDroid]   at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0003b] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
[MonoDroid]    --- End of inner exception stack trace ---
[MonoDroid]   at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00054] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
[MonoDroid]   at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x0005d] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
[MonoDroid]   at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
[MonoDroid]   at app.xam.Services.LocalStorageServiceBase+<ClearAll>d__46.MoveNext () [0x001fb] in /Users/kensykora/Workspace/app.xam/src/app.xam/Services/LocalStorageServiceBase.cs:247 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at app.xam.Services.Login.LoginService+<UserLogin>d__21.MoveNext () [0x007e5] in /Users/kensykora/Workspace/app.xam/src/app.xam/Services/Login/LoginService.cs:471 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at app.xam.Services.Login.LoginService+<UserLogin>d__20.MoveNext () [0x00054] in /Users/kensykora/Workspace/app.xam/src/app.xam/Services/Login/LoginService.cs:364 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at app.xam.Services.Login.LoginService+<Auth_Completed>d__25.MoveNext () [0x00085] in /Users/kensykora/Workspace/app.xam/src/app.xam/Services/Login/LoginService.cs:544 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
[MonoDroid]   at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <ea97b6d670fe4c1ba9dadb89b2fa0103>:0 
[MonoDroid]   at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <ea97b6d670fe4c1ba9dadb89b2fa0103>:0 
[MonoDroid]   at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <ea97b6d670fe4c1ba9dadb89b2fa0103>:0 
[MonoDroid]   at (wrapper dynamic-method) System.Object.35(intptr,intptr)

The issue seems to be some sort or race condition.

Can you try not running on other threads or tasks and just on the main and see if you get this issue. A repro of the issue would be very helpful so we can diagnose it better.

I've tried to run at the Main thread and I also getting the error. I have a private repo and I could share with you @jamesmontemagno, but I think you will need some steps to use the app, because it's a not-yet-commercial app. How can we do that ?

Most likely need to try to integrate this: https://stackoverflow.com/questions/36488219/android-security-keystoreexception-invalid-key-blob. I am curious if our changes in 1.1.0 fix this though with some of the things we did in the preferences part....

I assume just a snippet is code is fine.

Android Cipher is not thread safe so that is usually where people see issues.

@jamesmontemagno Any news?

@jbravobr can you share the repo with me

I'm experiencing the same issue:

Java.Security.UnrecoverableKeyException: Failed to obtain information about key ---> Java.Lang.Exception: Invalid key blob --- End of inner exception stack trace --- at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00089] in <fdf05f528e174febb3e55b587dbab368>:0 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeNonvirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0001f] in <fdf05f528e174febb3e55b587dbab368>:0 at Java.Security.KeyStore.GetKey (System.String alias, System.Char[] password) [0x00039] in /Users/builder/jenkins/workspace/monodroid-multibranch_d16-0-ROFMKET2X57L6OM33VV4CLSC53EGKYMXL7RAG3T2HOJWPTP3PQCA/monodroid/external/xamarin-android/src/Mono.Android/obj/Release/android-27/mcw/Java.Security.KeyStore.cs:1439 at Xamarin.Essentials.AndroidKeyStore.GetSymmetricKey () [0x00011] in D:\a\1\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:173 at Xamarin.Essentials.AndroidKeyStore.GetKey () [0x0002d] in D:\a\1\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:117 at Xamarin.Essentials.AndroidKeyStore.Decrypt (System.Byte[] data) [0x00009] in D:\a\1\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:301 at Xamarin.Essentials.SecureStorage.PlatformGetAsync (System.String key) [0x0004f] in D:\a\1\s\Xamarin.Essentials\SecureStorage\SecureStorage.android.cs:35 at Xamarin.Essentials.SecureStorage.GetAsync (System.String key) [0x00013] in D:\a\1\s\Xamarin.Essentials\SecureStorage\SecureStorage.shared.cs:16

Any updates on this? I'm using Xamarin Essentials 1.1.0

I just started experiencing the same issue.

problem too!
if it will happen periodically, how can we use it for saving important data??

Having the same problem on 1.1.0

I'm getting this issue when I close the emulator for some time, then, when I try to use my app again, it throws at the Get call.

Update: as James posted, apparently it has something to do with unlocking the device and a race condition, this answer has more info: https://stackoverflow.com/questions/36652675/java-security-unrecoverablekeyexception-failed-to-obtain-information-about-priv

Update 2: I was able to repro this consistently when I use quick boot with my emulator. I just have to close the emulator and redeploy using quick boot. When the app tries to access the key it throws an exception. If the above answer is correct, this might be because of the 30s wait time.

I stumbled across this same issue myself today (1.2.0)
I assumed it was because I was running my app in an emulator.

It looks like the aws-amplify team ran into this same issue in their aws-sdk-android repo.

They merged a PR to address this issue which essentially gives up on a key when they get an UnrecoverableKeyException.

Here's the code where they treat all exceptions in KeyStore.getKey equivalently and here is the code where they give up on the encryption key for any failure in retrieving it.

Quoting the commit message:

Causes of Failures

1. The retrieval of secrets from disk fails due to the encryption key being lost.
   a. End-user changes lock screen type which wipes off the encryption keys in the Android KeyStore. This could happen when the app is in foreground, background, closed.

2. The retrieval of secrets from disk fails due to the wrong encryption key used.
   a. End-user uninstalls the app which wipes off the encryption key in Android KeyStore. The encrypted secrets are backed up by Android and restored when the app is installed again. No

3. The retrieval of secrets from disk fails due to the encryption key not being recoverable.
   a. A cause has not been identified why key is not recoverable.

Item 3a is the most important here: They discovered that encryption keys are mysteriously unrecoverable under certain circumstances, but they did not determine what those circumstances are.

Proposed Fix

Under all these circumstances, the AWSKeyValueStore would return null for get operations and not write to disk for put operations.

This is a reiteration of the above: Namely that their approach is to give up on any key for which they encounter an UnrecoverableKeyException.

Any progress on this issue?

Also running into this issue after factory resetting an Android Emulator.

running into this scenario too, is there a possibility to simply check if the securestorage is available/accessible?

Was this page helpful?
0 / 5 - 0 ratings