Skip to content

Commit 95d39d8

Browse files
author
android-build-team Robot
committed
Snap for 6608602 from b0479b00cb89fe85f5d6af8c27f9dfab770a89f9 to ub-testdpc-rvc-release
Change-Id: If828144a481241007bb66f800149dca8c4762b15
2 parents 43599b8 + e83e6d0 commit 95d39d8

File tree

7 files changed

+135
-40
lines changed

7 files changed

+135
-40
lines changed

app/build.gradle

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ apply from: '../dist.gradle'
55
ext {
66
/* Version code for *next* release, bump *after* a release is created. */
77
// 1 or more digits
8-
versionMajor = 6
8+
versionMajor = 7
99
// exactly 1 digit
10-
versionMinor = 2
10+
versionMinor = 0
1111
// exactly 2 digits
1212
versionBuild = 00
1313
}
@@ -82,20 +82,28 @@ android {
8282
}
8383
}
8484

85-
task stripTestOnlyNormalDebug << {
86-
stripTestOnlyForBuild("normal", "debug")
85+
task stripTestOnlyNormalDebug {
86+
doLast {
87+
stripTestOnlyForBuild("normal", "debug")
88+
}
8789
}
8890

89-
task stripTestOnlyNormalRelease << {
90-
stripTestOnlyForBuild("normal", "release")
91+
task stripTestOnlyNormalRelease {
92+
doLast {
93+
stripTestOnlyForBuild("normal", "release")
94+
}
9195
}
9296

93-
task stripTestOnlyReplicaDebug << {
94-
stripTestOnlyForBuild("replica", "debug")
97+
task stripTestOnlyReplicaDebug {
98+
doLast {
99+
stripTestOnlyForBuild("replica", "debug")
100+
}
95101
}
96102

97-
task stripTestOnlyReplicaRelease << {
98-
stripTestOnlyForBuild("replica", "release")
103+
task stripTestOnlyReplicaRelease {
104+
doLast {
105+
stripTestOnlyForBuild("replica", "release")
106+
}
99107
}
100108

101109
tasks.whenTaskAdded { task ->

app/src/main/java/com/afwsamples/testdpc/policy/PolicyManagementFragment.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
import com.afwsamples.testdpc.policy.keyguard.LockScreenPolicyFragment;
117117
import com.afwsamples.testdpc.policy.keyguard.PasswordConstraintsFragment;
118118
import com.afwsamples.testdpc.policy.keymanagement.GenerateKeyAndCertificateTask;
119+
import com.afwsamples.testdpc.policy.keymanagement.KeyGenerationParameters;
119120
import com.afwsamples.testdpc.policy.keymanagement.SignAndVerifyTask;
120121
import com.afwsamples.testdpc.policy.locktask.KioskModeActivity;
121122
import com.afwsamples.testdpc.policy.locktask.LockTaskAppInfoArrayAdapter;
@@ -1616,14 +1617,8 @@ private boolean installKeyPair(final PrivateKey key, final Certificate cert, fin
16161617
}
16171618
}
16181619

1619-
private void generateKeyPair(final String alias, boolean isUserSelectable,
1620-
byte[] attestationChallenge,
1621-
int idAttestationFlags,
1622-
boolean useStrongBox,
1623-
boolean generateEcKey) {
1624-
new GenerateKeyAndCertificateTask(
1625-
alias, isUserSelectable, attestationChallenge, idAttestationFlags,
1626-
useStrongBox, generateEcKey, getActivity(), mAdminComponentName).execute();
1620+
private void generateKeyPair(final KeyGenerationParameters params) {
1621+
new GenerateKeyAndCertificateTask(params, getActivity(), mAdminComponentName).execute();
16271622
}
16281623

16291624
/**
@@ -2772,19 +2767,23 @@ private void showPromptForGeneratedKeyAlias(String alias) {
27722767
R.id.include_device_meid_in_attestation);
27732768
final CheckBox useStrongBoxCheckbox = aliasNamingView.findViewById(
27742769
R.id.use_strongbox);
2770+
final CheckBox useIndividualAttestationCheckbox = aliasNamingView.findViewById(
2771+
R.id.use_individual_attestation);
2772+
useIndividualAttestationCheckbox.setEnabled(Util.SDK_INT >= VERSION_CODES.R);
27752773

27762774
new AlertDialog.Builder(getActivity())
27772775
.setTitle(getString(R.string.certificate_alias_prompt_title))
27782776
.setView(aliasNamingView)
27792777
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
27802778
@Override
27812779
public void onClick(DialogInterface dialog, int which) {
2782-
String alias = input.getText().toString();
2783-
boolean isUserSelectable = userSelectableCheckbox.isChecked();
2780+
KeyGenerationParameters.Builder paramsBuilder =
2781+
new KeyGenerationParameters.Builder();
2782+
paramsBuilder.setAlias(input.getText().toString());
2783+
paramsBuilder.setIsUserSelectable(userSelectableCheckbox.isChecked());
27842784

2785-
byte[] attestationChallenge = null;
27862785
if (includeAttestationChallengeCheckbox.isChecked()) {
2787-
attestationChallenge = new byte[] {0x61, 0x62, 0x63};
2786+
paramsBuilder.setAttestationChallenge(new byte[] {0x61, 0x62, 0x63});
27882787
}
27892788

27902789
int idAttestationFlags = 0;
@@ -2800,10 +2799,15 @@ public void onClick(DialogInterface dialog, int which) {
28002799
if (deviceMeidAttestationCheckbox.isChecked()) {
28012800
idAttestationFlags |= DevicePolicyManager.ID_TYPE_MEID;
28022801
}
2802+
if (useIndividualAttestationCheckbox.isChecked()) {
2803+
idAttestationFlags |=
2804+
DevicePolicyManager.ID_TYPE_INDIVIDUAL_ATTESTATION;
2805+
}
2806+
paramsBuilder.setIdAttestationFlags(idAttestationFlags);
2807+
paramsBuilder.setUseStrongBox(useStrongBoxCheckbox.isChecked());
2808+
paramsBuilder.setGenerateEcKey(ecKeyCheckbox.isChecked());
28032809

2804-
generateKeyPair(alias, isUserSelectable, attestationChallenge,
2805-
idAttestationFlags, useStrongBoxCheckbox.isChecked(),
2806-
ecKeyCheckbox.isChecked());
2810+
generateKeyPair(paramsBuilder.build());
28072811
}
28082812
})
28092813
.setNegativeButton(android.R.string.cancel, null)

app/src/main/java/com/afwsamples/testdpc/policy/keymanagement/GenerateKeyAndCertificateTask.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import android.security.keystore.KeyGenParameterSpec;
2828
import android.security.keystore.KeyProperties;
2929
import android.security.keystore.StrongBoxUnavailableException;
30+
import android.util.Base64;
3031
import android.util.Log;
3132
import android.view.View;
3233
import android.widget.TextView;
@@ -60,20 +61,15 @@ public class GenerateKeyAndCertificateTask extends AsyncTask<Void, Integer, Atte
6061
private final Activity mActivity;
6162

6263
public GenerateKeyAndCertificateTask(
63-
String alias,
64-
boolean isUserSelectable,
65-
byte[] attestationChallenge,
66-
int idAttestationFlags,
67-
boolean useStrongBox,
68-
boolean generateEcKey,
64+
KeyGenerationParameters params,
6965
Activity activity,
7066
ComponentName admin) {
71-
mAlias = alias;
72-
mIsUserSelectable = isUserSelectable;
73-
mAttestationChallenge = attestationChallenge;
74-
mIdAttestationFlags = idAttestationFlags;
75-
mUseStrongBox = useStrongBox;
76-
mGenerateEcKey = generateEcKey;
67+
mAlias = params.alias;
68+
mIsUserSelectable = params.isUserSelectable;
69+
mAttestationChallenge = params.attestationChallenge;
70+
mIdAttestationFlags = params.idAttestationFlags;
71+
mUseStrongBox = params.useStrongBox;
72+
mGenerateEcKey = params.generateEcKey;
7773
mActivity = activity;
7874
mAdminComponentName = admin;
7975
mDevicePolicyManager =
@@ -121,6 +117,15 @@ protected AttestedKeyPair doInBackground(Void... voids) {
121117
return null;
122118
}
123119

120+
List<Certificate> attestationRecord = keyPair.getAttestationRecord();
121+
if (attestationRecord != null) {
122+
Log.i(TAG, "Attestation record:");
123+
for (Certificate cert : attestationRecord) {
124+
Log.i(TAG, Base64.encodeToString(cert.getEncoded(), Base64.NO_WRAP));
125+
}
126+
Log.i(TAG, "End of attestation record.");
127+
}
128+
124129
X500Principal subject = new X500Principal("CN=TestDPC, O=Android, C=US");
125130
// Self-signed certificate: Same subject and issuer.
126131
X509Certificate selfSigned =
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.afwsamples.testdpc.policy.keymanagement;
2+
3+
public class KeyGenerationParameters {
4+
public final String alias;
5+
public final boolean isUserSelectable;
6+
public final byte[] attestationChallenge;
7+
public final int idAttestationFlags;
8+
public final boolean useStrongBox;
9+
public final boolean generateEcKey;
10+
11+
public KeyGenerationParameters(
12+
String alias, boolean isUserSelectable, byte[] attestationChallenge,
13+
int idAttestationFlags, boolean useStrongBox, boolean generateEcKey) {
14+
this.alias = alias;
15+
this.isUserSelectable = isUserSelectable;
16+
this.attestationChallenge = attestationChallenge;
17+
this.idAttestationFlags = idAttestationFlags;
18+
this.useStrongBox = useStrongBox;
19+
this.generateEcKey = generateEcKey;
20+
}
21+
22+
public static class Builder {
23+
private String mAlias;
24+
private boolean mIsUserSelectable;
25+
private byte[] mAttestationChallenge;
26+
private int mIdAttestationFlags;
27+
private boolean mUseStrongBox;
28+
private boolean mGenerateEcKey;
29+
30+
public Builder setAlias(String alias) {
31+
mAlias = alias;
32+
return this;
33+
}
34+
35+
public Builder setIsUserSelectable(boolean isUserSelectable) {
36+
mIsUserSelectable = isUserSelectable;
37+
return this;
38+
}
39+
40+
public Builder setAttestationChallenge(byte[] attestationChallenge) {
41+
mAttestationChallenge = attestationChallenge;
42+
return this;
43+
}
44+
45+
public Builder setIdAttestationFlags(int idAttestationFlags) {
46+
mIdAttestationFlags = idAttestationFlags;
47+
return this;
48+
}
49+
50+
public Builder setUseStrongBox(boolean useStrongBox) {
51+
mUseStrongBox = useStrongBox;
52+
return this;
53+
}
54+
55+
public Builder setGenerateEcKey(boolean generateEcKey) {
56+
mGenerateEcKey = generateEcKey;
57+
return this;
58+
}
59+
60+
public KeyGenerationParameters build() {
61+
return new KeyGenerationParameters(mAlias, mIsUserSelectable, mAttestationChallenge,
62+
mIdAttestationFlags, mUseStrongBox, mGenerateEcKey);
63+
}
64+
65+
}
66+
}

app/src/main/res/layout/key_generation_prompt.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,21 @@
9393
android:layout_height="wrap_content"
9494
android:text="@string/meid_attestation_checkbox"/>
9595

96+
<TextView
97+
android:layout_width="fill_parent"
98+
android:layout_height="wrap_content"
99+
android:text="@string/strongbox_features_description"/>
100+
96101
<CheckBox
97102
android:id="@+id/use_strongbox"
98103
android:layout_width="match_parent"
99104
android:layout_height="wrap_content"
100105
android:text="@string/use_strongbox_checkbox"/>
101106

107+
<CheckBox
108+
android:id="@+id/use_individual_attestation"
109+
android:layout_width="match_parent"
110+
android:layout_height="wrap_content"
111+
android:text="@string/use_individual_attestation_checkbox"/>
112+
102113
</LinearLayout>

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,10 @@
565565
<string name="serial_num_attestation_checkbox">Include device serial number</string>
566566
<string name="imei_attestation_checkbox">Include device IMEI</string>
567567
<string name="meid_attestation_checkbox">Include device MEID</string>
568+
<string name="strongbox_features_description">StrongBox-related options</string>
568569
<string name="use_strongbox_checkbox">Use StrongBox</string>
570+
<string name="use_individual_attestation_checkbox">Use Individual Attestation Certificate</string>
571+
569572

570573
<!-- Strings for app restrictions -->
571574
<string name="managed_configurations">Managed configurations</string>

settings.gradle

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
include ':TestDPC'
2-
project(':TestDPC').projectDir = new File(rootDir, "vendor/unbundled_google/packages/TestDPC/app")
3-
include ':CosuApp'
4-
project(':CosuApp').projectDir = new File(rootDir, "vendor/unbundled_google/packages/TestDPC/cosuapp")
2+
project(':TestDPC').projectDir = new File(rootDir, "vendor/unbundled_google/packages/TestDPC/app")

0 commit comments

Comments
 (0)