Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b73e1524 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Add DPM.hasKeyPair()

The method returns true if a private key and a user certifiate are
present in KeyChain under this alias.

Bug: 160457441
Test: atest com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testKeyManagement
Test: atest com.android.cts.devicepolicy.MixedDeviceOwnerTest#testDelegatedCertInstallerDirectly
Test: atest android.admin.cts.DevicePolicyManagerTest
Change-Id: I15ca6190db1ef4dbf0caabe9d46008d92f758df5
parent 3a9b54f7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6968,6 +6968,7 @@ package android.app.admin {
    method public boolean grantKeyPairToApp(@Nullable android.content.ComponentName, @NonNull String, @NonNull String);
    method public boolean hasCaCertInstalled(@Nullable android.content.ComponentName, byte[]);
    method public boolean hasGrantedPolicy(@NonNull android.content.ComponentName, int);
    method public boolean hasKeyPair(@NonNull String);
    method public boolean hasLockdownAdminConfiguredNetworks(@NonNull android.content.ComponentName);
    method public boolean installCaCert(@Nullable android.content.ComponentName, byte[]);
    method public boolean installExistingPackage(@NonNull android.content.ComponentName, String);
+21 −0
Original line number Diff line number Diff line
@@ -5349,6 +5349,27 @@ public class DevicePolicyManager {
        }
    }
    // STOPSHIP(b/174298501): clarify the expected return value following generateKeyPair call.
    /**
     * Called by a device or profile owner, or delegated certificate installer, to query whether a
     * certificate and private key are installed under a given alias.
     *
     * @param alias The alias under which the key pair is installed.
     * @return {@code true} if a key pair with this alias exists, {@code false} otherwise.
     * @throws SecurityException if the caller is not a device or profile owner or a delegated
     *         certificate installer.
     * @see #setDelegatedScopes
     * @see #DELEGATION_CERT_INSTALL
     */
    public boolean hasKeyPair(@NonNull String alias) {
        throwIfParentInstance("hasKeyPair");
        try {
            return mService.hasKeyPair(mContext.getPackageName(), alias);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
    /**
     * Called by a device or profile owner, or delegated certificate installer, to generate a
     * new private/public key pair. If the device supports key generation via secure hardware,
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ interface IDevicePolicyManager {
            in byte[] certBuffer, in byte[] certChainBuffer, String alias, boolean requestAccess,
            boolean isUserSelectable);
    boolean removeKeyPair(in ComponentName who, in String callerPackage, String alias);
    boolean hasKeyPair(in String callerPackage, in String alias);
    boolean generateKeyPair(in ComponentName who, in String callerPackage, in String algorithm,
            in ParcelableKeyGenParameterSpec keySpec,
            in int idAttestationFlags, out KeymasterCertificateChain attestationChain);
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ interface IKeyChainService {
    boolean installKeyPair(
        in byte[] privateKey, in byte[] userCert, in byte[] certChain, String alias, int uid);
    boolean removeKeyPair(String alias);
    boolean containsKeyPair(String alias);

    // APIs used by Settings
    boolean deleteCaCertificate(String alias);
+5 −0
Original line number Diff line number Diff line
@@ -101,4 +101,9 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub {
    public boolean canProfileOwnerResetPasswordWhenLocked(int userId) {
        return false;
    }

    public boolean hasKeyPair(String callerPackage, String alias) {
        // STOPSHIP: implement delegation code in ArcDevicePolicyManagerWrapperService & nuke this.
        return false;
    }
}
Loading