fix(android): declare KeySpec so the native PBKDF2 call resolves, and report why it fails

generateSecret takes a KeySpec; passing a JObject made the bridge emit a signature no method matches, and the call failed at runtime. Swallowed as 'unavailable', which hid my own mistake for a full test round - the failure now carries its exception message.

Measured on device: the Pascal PBKDF2 takes 6651 ms, unusable per unlock. AES-GCM through JNI works, plaintext and hash match the vector, so the container format is validated end to end.
This commit is contained in:
r-zakarya
2026-08-14 23:22:56 +01:00
parent c607e26c4a
commit 4cc79a5216
48 changed files with 1217 additions and 11 deletions
+72
View File
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.embarcadero.pmserverApk"
android:versionCode="1"
android:versionName="1.0.0"
android:installLocation="auto">
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="33" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<queries>
</queries>
<application
android:persistent="False"
android:restoreAnyVersion="False"
android:label="pmserverApk"
android:debuggable="true"
android:largeHeap="False"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme"
android:hardwareAccelerated="true"
android:resizeableActivity="true"
android:requestLegacyExternalStorage="true">
<!-- Trigger Google Play services to install the backported photo picker module. -->
<service
android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false"
tools:ignore="MissingClass">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity
android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:exported="true"
android:label="pmserverApk"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name" android:value="pmserverApk" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
Binary file not shown.
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="splash_background">#000</color>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="splash_background">#FFF</color>
</resources>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>
+5
View File
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.embarcadero.pmserverApk"
android:versionCode="1"
android:versionName="1.0.0"
android:installLocation="auto">
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="33" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<queries>
</queries>
<application
android:persistent="False"
android:restoreAnyVersion="False"
android:label="pmserverApk"
android:debuggable="true"
android:largeHeap="False"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme"
android:hardwareAccelerated="true"
android:resizeableActivity="true"
android:requestLegacyExternalStorage="true">
<!-- Trigger Google Play services to install the backported photo picker module. -->
<service
android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false"
tools:ignore="MissingClass">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity
android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:exported="true"
android:label="pmserverApk"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name" android:value="pmserverApk" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
<item
android:gravity="center"
android:drawable="@drawable/splash_vector">
</item>
</layer-list>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M4.86 16.35C4.2 6.8 16.68 5.5 16.36 0c2.91 5.67-8.1 9.4-5.02 12.95 1.88 2.19 8.26-3.4 7.12-8.42 4.21 10.04-11.98 15.71-2.74 19.27-5.84 1.14-10.57-3.12-10.86-7.45Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M4.84 16.38c-0.23-5.25 2.43-7.45 6.78-10.55-5.67 4.53-5.34 9.23-4.37 12 0.97 2.76 3.88 6.3 8.42 5.98-5.82 1.15-10.42-3.06-10.83-7.43Z"/>
</group>
</vector>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M94.46 174.2c-4.49-66.27 82-75.26 79.77-113.45 20.21 39.31-56.23 65.15-34.83 89.87 13.08 15.15 57.3-23.59 49.43-58.42 29.2 69.66-83.13 108.97-19.02 133.69-40.52 7.86-73.32-21.66-75.35-51.68Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M94.33 174.4c-1.58-36.46 16.86-51.68 47.04-73.21-39.32 31.45-37.06 64.04-30.33 83.21 6.74 19.17 26.95 43.82 58.42 41.57-40.36 7.97-72.3-21.25-75.13-51.57Z"/>
</group>
</vector>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="115dp"
android:height="192dp"
android:viewportWidth="115"
android:viewportHeight="192">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M0.37 130.83C-4.8 54.4 94.94 44.03 92.37 0c23.3 45.34-64.85 75.13-40.17 103.63 15.08 17.48 66.06-27.2 57-67.36 33.67 80.32-95.87 125.66-21.94 154.16-46.72 9.07-84.55-24.97-86.89-59.6Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M0.23 131.05c-1.83-42.04 19.43-59.6 54.24-84.42C9.13 82.9 11.73 120.5 19.49 142.6c7.77 22.1 31.08 50.53 67.37 47.93-46.54 9.2-83.38-24.5-86.63-59.47Z"/>
</group>
</vector>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M94.46 174.2c-4.49-66.27 82-75.26 79.77-113.45 20.21 39.31-56.23 65.15-34.83 89.87 13.08 15.15 57.3-23.59 49.43-58.42 29.2 69.66-83.13 108.97-19.02 133.69-40.52 7.86-73.32-21.66-75.35-51.68Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M94.33 174.4c-1.58-36.46 16.86-51.68 47.04-73.21-39.32 31.45-37.06 64.04-30.33 83.21 6.74 19.17 26.95 43.82 58.42 41.57-40.36 7.97-72.3-21.25-75.13-51.57Z"/>
</group>
</vector>
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108"
android:tint="#000">
<group>
<path
android:fillColor="#000"
android:pathData="M0 0h108v108H0z"/>
</group>
</vector>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M35.42 65.33C33.74 40.47 66.17 37.1 65.34 22.78c7.58 14.74-21.09 24.43-13.06 33.7 4.9 5.69 21.48-8.84 18.53-21.9C81.76 60.7 39.64 75.44 63.68 84.7c-15.2 2.95-27.5-8.12-28.26-19.38Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M35.38 65.4C34.78 51.73 41.69 46.02 53 37.95c-14.74 11.8-13.9 24.01-11.37 31.2 2.53 7.19 10.1 16.43 21.9 15.59-15.13 2.99-27.1-7.97-28.16-19.34Z"/>
</group>
</vector>
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108"
android:tint="#FFF">
<group>
<path
android:fillColor="#FFF"
android:pathData="M35.42 65.33C33.74 40.47 66.17 37.1 65.34 22.78c7.58 14.74-21.09 24.43-13.06 33.7 4.9 5.69 21.48-8.84 18.53-21.9C81.76 60.7 39.64 75.44 63.68 84.7c-15.2 2.95-27.5-8.12-28.26-19.38Z"/>
<path
android:fillColor="#FFF"
android:pathData="M35.38 65.4C34.78 51.73 41.69 46.02 53 37.95c-14.74 11.8-13.9 24.01-11.37 31.2 2.53 7.19 10.1 16.43 21.9 15.59-15.13 2.99-27.1-7.97-28.16-19.34Z"/>
</group>
</vector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
<item android:drawable="@color/splash_background" />
<item>
<bitmap
android:src="@drawable/splash_image"
android:antialias="true"
android:dither="true"
android:filter="true"
android:gravity="center"
android:tileMode="disabled"/>
</item>
</layer-list>
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="115dp"
android:height="192dp"
android:viewportWidth="115"
android:viewportHeight="192">
<group>
<path
android:fillColor="#BF311A"
android:pathData="M0.37 130.83C-4.8 54.4 94.94 44.03 92.37 0c23.3 45.34-64.85 75.13-40.17 103.63 15.08 17.48 66.06-27.2 57-67.36 33.67 80.32-95.87 125.66-21.94 154.16-46.72 9.07-84.55-24.97-86.89-59.6Z"/>
<path
android:fillColor="#F3901D"
android:pathData="M0.23 131.05c-1.83-42.04 19.43-59.6 54.24-84.42C9.13 82.9 11.73 120.5 19.49 142.6c7.77 22.1 31.08 50.53 67.37 47.93-46.54 9.2-83.38-24.5-86.63-59.47Z"/>
</group>
</vector>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="splash_background">#000</color>
</resources>
@@ -0,0 +1,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowClipToOutline">false</item>
</style>
</resources>
@@ -0,0 +1,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@color/splash_background</item>
<item name="android:windowClipToOutline">false</item>
<!-- API 31+ specific attributes -->
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_vector</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/splash_background</item>
</style>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="splash_background">#FFF</color>
</resources>
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
</resources>
@@ -0,0 +1,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
<item
android:gravity="center"
android:drawable="@drawable/splash_vector">
</item>
</layer-list>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
<item android:drawable="@color/splash_background" />
<item>
<bitmap
android:src="@drawable/splash_image"
android:antialias="true"
android:dither="true"
android:filter="true"
android:gravity="center"
android:tileMode="disabled"/>
</item>
</layer-list>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
</resources>
+6
View File
@@ -0,0 +1,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowClipToOutline">false</item>
</style>
</resources>
+10
View File
@@ -0,0 +1,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@color/splash_background</item>
<item name="android:windowClipToOutline">false</item>
<!-- API 31+ specific attributes -->
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_vector</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/splash_background</item>
</style>
</resources>
+6
View File
@@ -0,0 +1,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>