From e72c579fd4e60f8c8fff78fcb28a6219952bbc02 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 25 Mar 2025 19:04:58 +0100 Subject: [PATCH] add stub AndroidKeyStore security provider --- src/api-impl/android/content/Context.java | 6 + .../security/keystore/AndroidKeyStore.java | 120 ++++++++++++++++++ src/api-impl/meson.build | 1 + 3 files changed, 127 insertions(+) create mode 100644 src/api-impl/android/security/keystore/AndroidKeyStore.java diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 9c727af7..54e41de1 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -60,6 +60,8 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.security.Provider; +import java.security.Security; import java.util.HashMap; import java.util.Map; @@ -126,6 +128,10 @@ public class Context extends Object { application_info.sourceDir = native_get_apk_path(); package_manager = new PackageManager(); + Provider provider = new Provider("AndroidKeyStore", 1.0, "Android KeyStore provider") {}; + provider.put("KeyStore.AndroidKeyStore", "android.security.keystore.AndroidKeyStore"); + Security.addProvider(provider); + r.applyPackageQuirks(application_info.packageName); } diff --git a/src/api-impl/android/security/keystore/AndroidKeyStore.java b/src/api-impl/android/security/keystore/AndroidKeyStore.java new file mode 100644 index 00000000..2b7e24b7 --- /dev/null +++ b/src/api-impl/android/security/keystore/AndroidKeyStore.java @@ -0,0 +1,120 @@ +package android.security.keystore; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.Key; +import java.security.KeyStoreException; +import java.security.KeyStoreSpi; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; + +public class AndroidKeyStore extends KeyStoreSpi { + + HashMap map = new HashMap<>(); + + @Override + public Key engineGetKey(String alias, char[] password) throws NoSuchAlgorithmException, UnrecoverableKeyException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineGetKey'"); + } + + @Override + public Certificate[] engineGetCertificateChain(String alias) { + // TODO Auto-generated method stub + System.out.println("engineGetCertificateChain(" + alias + ") called"); + return new Certificate[0]; + } + + @Override + public Certificate engineGetCertificate(String alias) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineGetCertificate'"); + } + + @Override + public Date engineGetCreationDate(String alias) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineGetCreationDate'"); + } + + @Override + public void engineSetKeyEntry(String alias, Key key, char[] password, Certificate[] chain) + throws KeyStoreException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineSetKeyEntry'"); + } + + @Override + public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain) throws KeyStoreException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineSetKeyEntry'"); + } + + @Override + public void engineSetCertificateEntry(String alias, Certificate cert) throws KeyStoreException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineSetCertificateEntry'"); + } + + @Override + public void engineDeleteEntry(String alias) throws KeyStoreException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineDeleteEntry'"); + } + + @Override + public Enumeration engineAliases() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineAliases'"); + } + + @Override + public boolean engineContainsAlias(String alias) { + // TODO Auto-generated method stub + System.out.println("engineContainsAlias(" + alias + ") called"); + return map.containsKey(alias); + } + + @Override + public int engineSize() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineSize'"); + } + + @Override + public boolean engineIsKeyEntry(String alias) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineIsKeyEntry'"); + } + + @Override + public boolean engineIsCertificateEntry(String alias) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineIsCertificateEntry'"); + } + + @Override + public String engineGetCertificateAlias(Certificate cert) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineGetCertificateAlias'"); + } + + @Override + public void engineStore(OutputStream stream, char[] password) + throws IOException, NoSuchAlgorithmException, CertificateException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'engineStore'"); + } + + @Override + public void engineLoad(InputStream stream, char[] password) + throws IOException, NoSuchAlgorithmException, CertificateException { + } + +} diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 2afa31db..620719e9 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -354,6 +354,7 @@ srcs = [ 'android/provider/CalendarContract.java', 'android/provider/ContactsContract.java', 'android/provider/Settings.java', + 'android/security/keystore/AndroidKeyStore.java', 'android/service/media/MediaBrowserService.java', 'android/telecom/ConnectionService.java', 'android/telecom/TelecomManager.java',