From 06a04fec4da9e53986b1bd747db63edaed5b905a Mon Sep 17 00:00:00 2001 From: Miguel Date: Wed, 23 Feb 2022 16:37:15 +0000 Subject: Add engineProbe to BcKeyStoreSpi. Test: atest CtsLibcoreOjTestCases:test.java.security.KeyStore.ProbeKeystores Change-Id: I461a06b1edd53105e478ebb6a6fe3259219bca7f --- .../jcajce/provider/keystore/bc/BcKeyStoreSpi.java | 51 ++++++++++++++++++++++ .../jcajce/provider/keystore/bc/BcKeyStoreSpi.java | 51 ++++++++++++++++++++++ .../jcajce/provider/keystore/bc/BcKeyStoreSpi.java | 51 ++++++++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java index 2c439f4e..5ec21c8b 100644 --- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java +++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java @@ -931,6 +931,33 @@ public class BcKeyStoreSpi dOut.close(); } + // BEGIN Android-added: new API for KeyStore probing. + /** + * Probe the first few bytes of the keystore data stream for a valid + * keystore encoding. Only the primary keystore implementation is probed. + */ + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. + /** * the BouncyCastle store. This wont work with the key tool as the * store is stored encrypted on disk, so the password is mandatory, @@ -1050,6 +1077,30 @@ public class BcKeyStoreSpi cOut.close(); } + + // BEGIN Android-added: new API for KeyStore probing. + @Override + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. } public static class Std diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java index 44faf7db..9605cedd 100644 --- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java +++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java @@ -935,6 +935,33 @@ public class BcKeyStoreSpi dOut.close(); } + // BEGIN Android-added: new API for KeyStore probing. + /** + * Probe the first few bytes of the keystore data stream for a valid + * keystore encoding. Only the primary keystore implementation is probed. + */ + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. + /** * the BouncyCastle store. This wont work with the key tool as the * store is stored encrypted on disk, so the password is mandatory, @@ -1055,6 +1082,30 @@ public class BcKeyStoreSpi cOut.close(); } + + // BEGIN Android-added: new API for KeyStore probing. + @Override + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. } /** diff --git a/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java b/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java index 44be654a..6c2c25b0 100644 --- a/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java +++ b/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi.java @@ -935,6 +935,33 @@ public class BcKeyStoreSpi dOut.close(); } + // BEGIN Android-added: new API for KeyStore probing. + /** + * Probe the first few bytes of the keystore data stream for a valid + * keystore encoding. Only the primary keystore implementation is probed. + */ + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. + /** * the BouncyCastle store. This wont work with the key tool as the * store is stored encrypted on disk, so the password is mandatory, @@ -1055,6 +1082,30 @@ public class BcKeyStoreSpi cOut.close(); } + + // BEGIN Android-added: new API for KeyStore probing. + @Override + public boolean engineProbe(InputStream stream) throws IOException { + if (stream == null) { + throw new NullPointerException("input stream must not be null"); + } + DataInputStream dIn = new DataInputStream(stream); + int version = dIn.readInt(); + + if (version != STORE_VERSION) { + if (version != 0 && version != 1) { + return false; + } + } + byte[] salt = new byte[dIn.readInt()]; + + if (salt.length != STORE_SALT_SIZE) { + return false; + } + + return true; + } + // END Android-added: new API for KeyStore probing. } /** -- cgit v1.2.3