Skip to content
Snippets Groups Projects
Commit dd143db7 authored by Janik Besendorf's avatar Janik Besendorf
Browse files

adds check for TEE backed KeyStore

parent 7ef560e0
No related branches found
No related tags found
No related merge requests found
...@@ -31,6 +31,7 @@ import android.media.MediaDrm; ...@@ -31,6 +31,7 @@ import android.media.MediaDrm;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyInfo;
import android.security.keystore.KeyProperties; import android.security.keystore.KeyProperties;
import android.security.keystore.StrongBoxUnavailableException; import android.security.keystore.StrongBoxUnavailableException;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -55,13 +56,17 @@ import java.io.InputStreamReader; ...@@ -55,13 +56,17 @@ import java.io.InputStreamReader;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.Key;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException; import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException;
import java.util.UUID; import java.util.UUID;
import javax.crypto.KeyGenerator; import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
//import androidx.biometric.BiometricPrompt; //import androidx.biometric.BiometricPrompt;
...@@ -150,6 +155,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -150,6 +155,7 @@ public class MainActivity extends AppCompatActivity {
json.put("ro.boot.verifiedbootstate", getProp("ro.boot.verifiedbootstate")); json.put("ro.boot.verifiedbootstate", getProp("ro.boot.verifiedbootstate"));
json.put("ro.boot.veritymode", getProp("ro.boot.veritymode")); json.put("ro.boot.veritymode", getProp("ro.boot.veritymode"));
json.put("KeyStore", keyStorePresence()); json.put("KeyStore", keyStorePresence());
json.put("TEE", TEE());
json.put("Strongbox", isStrongbox()); json.put("Strongbox", isStrongbox());
json.put("StrongboxPM", isStrongboxPM()); json.put("StrongboxPM", isStrongboxPM());
json.put("DeviceAdmin", deviceAdmin()); json.put("DeviceAdmin", deviceAdmin());
...@@ -274,6 +280,48 @@ public class MainActivity extends AppCompatActivity { ...@@ -274,6 +280,48 @@ public class MainActivity extends AppCompatActivity {
} }
} }
private boolean TEE(){
//generates a key and then uses keyInfo.isInsideSecureHardware() to check wheter it is stored in a TEE (or an SE)
KeyGenerator kg = null;
try {
kg = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
kg.init(new KeyGenParameterSpec.Builder("keystore1", 0)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.build());
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
} else {
return false;
}
SecretKey key = kg.generateKey();
SecretKeyFactory factory = null;
try {
factory = SecretKeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore");
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
e.printStackTrace();
return false;
}
KeyInfo keyInfo = null;
try {
keyInfo = (KeyInfo) factory.getKeySpec(key, KeyInfo.class);
} catch (InvalidKeySpecException e) {
// Not an Android KeyStore key.
e.printStackTrace();
}
if (keyInfo != null){
return keyInfo.isInsideSecureHardware();
}
return false;
}
private boolean isStrongbox() { private boolean isStrongbox() {
// similar to keyStorePresence we use .setIsStrongBoxBacked to make using Strongbox // similar to keyStorePresence we use .setIsStrongBoxBacked to make using Strongbox
// mandatory for a dummy Key Generation which will result in // mandatory for a dummy Key Generation which will result in
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment