From 90991d41fc38d317bfdec74e00939a26a343c7de Mon Sep 17 00:00:00 2001 From: Song Pan Date: Tue, 11 Feb 2020 17:39:09 +0000 Subject: [PATCH] Add unit test for parsing apks with two certificates. Bug:148373316 Test: atest AppIntegrityManagerServiceImpl Change-Id: Ia6c8e28a09ded8e5695b02c9d93d13e321dfcbe7 --- .../DummyAppTwoCerts.apk | Bin 0 -> 8351 bytes .../AppIntegrityManagerServiceImplTest.java | 46 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/DummyAppTwoCerts.apk diff --git a/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/DummyAppTwoCerts.apk b/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/DummyAppTwoCerts.apk new file mode 100644 index 0000000000000000000000000000000000000000..9161d869f3a1d0cf302273f3bb966bd9b37c58af GIT binary patch literal 8351 zcmeHNcUV)&7QYD{3`h}BS^`ohO>7zHGBVn9j^y$Vr45y65ih=ADXATDfZ zQUs(0q!>Yvu5?%tl=?(@H> zf$b&)aB?yl4x!1Y>6-|G5j{_5UoUrOQ-Y`aNf$qVm0T*5@ zW<(`OhZ5=v8S;Kht83D(mcRm^J!B{k*X7MMqhZZP?Z3T_J#9!p`J&V)a2@TtJd#RAR zrWNYwqa;mvuVyPNsQ_+bkVKiSW{u|ENqm!c&*354nq8JDOXS6u0aCRA^Wtw(x++_! zxB=OY#KCH{SOBst$uV4%gqi?xIkYI{Au#{?>M!WXPufGwBoBWEXqwPt?Vo3d?V z!?SEhjLw+VD&43IjrWB=cQ+1I(Ccr zX7t6D({}_3XCGa{@!M`&ujj-~^f#z`z3T zJ>j7CF5bbro>e@n9k22J&MQRFC~xu6*hGAU&6 Q)Y2UBQQZ+iO7*8;MK0vOP63updlzdYtJCFQOWF$m2W>Z&=*4 zuWZTBmieg!)90xf(Y?)Hat^b62K~`AsOkN!YUKr#Vt9&(hlg>LTv2e3xt)W|>UMt& z>A1Z~xS;7{7&o`dU|IE)HCq?`GSyC2nahUorpLKI_h5lE)$6IMcn6X~#84 zk00^WO-$YC(Zx2gcJf7*Z(F4DeEIy11#$>CR+L(ogUaaaF8{h1#k&ayWkf@I3?7 zYT#=M31S=4OMmMK7Ytc+%HOePLEZ_os$un_W=4+K=OtqB^lFem zq7W7%j(mJMkmF1mqNaMAOqtG-72M=7*LyR)eubvKI(J+ae`$q30}IB~z{H}$Uk=0q zoNSnr&|gkM(I64&{FjKR4IHtwFGSP;w$8(^L?jb>6aTx34k?J@NAi6kBF?Wwgx<_V z7!(S#iHUwqe!tLP^@3!4{gmwpl*2F3A&G|~_knKOks4(XCr zPA3Ro&dsQg@b6H^jcX8{5Okw=YoF=A(%WWI_DU0o-5#gTUA!V1aD{F`;AKa_hmMrLG z;j~sl;rZf2BAT6UvB+F6E;h6@!G>y=Ipk)eNRR{iey}BJA5IVXD$`K7M-|L z@dQUR=Xji}{y}@EG5Wxxsot#z(cx6L5(55S<<-0Ih2Bm)U*x=E&>=lZNfCB07t5SF z7zwwm3RQW8&aizm*B4g6F{5A6L}s-@kdjXSB&!(6O`2-yqOkFsJrsR&TypGFt3%x7 z5^86?c%#I9fAvBX^>vCCFA}}MP8;h^Q;mz-X_Rsyc!eNg_h(eJRiC{4ggk9xQ&=8I zE~8Ajg=U;fp0<0n`nsy+$m4Ln3~h=$TSIZ{Q)T*)=gOGLKi>72teVGW((wJ!5d#9nqkp4sAX{A@Sd$;Gb>GOi*BV z+G6%6$`xL;Hj;XqnAD*7daFc{j!9c2j9*_QZ^VVG!SU4fiZa1Ln9!9jm1Y$&+>IIq zSjWgh6Qv68<^9GA+y7(3k?q_b1{)OuJh}3FRs?ul*kL)5ei literal 0 HcmV?d00001 diff --git a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java index f78fbda44b338..0d4c6e82d9512 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java @@ -40,6 +40,8 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -66,6 +68,7 @@ import com.android.server.integrity.engine.RuleEvaluationEngine; import com.android.server.integrity.model.IntegrityCheckResult; import com.android.server.testutils.TestUtils; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -77,6 +80,8 @@ import org.mockito.junit.MockitoRule; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -87,6 +92,9 @@ public class AppIntegrityManagerServiceImplTest { private static final String TEST_APP_PATH = "/data/local/tmp/AppIntegrityManagerServiceTestApp.apk"; + private static final String TEST_APP_TWO_CERT_PATH = + "AppIntegrityManagerServiceImplTest/DummyAppTwoCerts.apk"; + private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; private static final String VERSION = "version"; private static final String TEST_FRAMEWORK_PACKAGE = "com.android.frameworks.servicestests"; @@ -105,6 +113,11 @@ public class AppIntegrityManagerServiceImplTest { private static final String INSTALLER_SHA256 = "30F41A7CBF96EE736A54DD6DF759B50ED3CC126ABCEF694E167C324F5976C227"; + private static final String DUMMY_APP_TWO_CERTS_CERT_1 = + "C0369C2A1096632429DFA8433068AECEAD00BAC337CA92A175036D39CC9AFE94"; + private static final String DUMMY_APP_TWO_CERTS_CERT_2 = + "94366E0A80F3A3F0D8171A15760B88E228CD6E1101F0414C98878724FBE70147"; + private static final String PLAY_STORE_PKG = "com.android.vending"; private static final String ADB_INSTALLER = "adb"; private static final String PLAY_STORE_CERT = "play_store_cert"; @@ -128,6 +141,7 @@ public class AppIntegrityManagerServiceImplTest { private PackageManager mSpyPackageManager; private File mTestApk; + private File mTestApkTwoCerts; private final Context mRealContext = InstrumentationRegistry.getTargetContext(); // under test @@ -136,6 +150,10 @@ public class AppIntegrityManagerServiceImplTest { @Before public void setup() throws Exception { mTestApk = new File(TEST_APP_PATH); + mTestApkTwoCerts = File.createTempFile("AppIntegrity", ".apk"); + try (InputStream inputStream = mRealContext.getAssets().open(TEST_APP_TWO_CERT_PATH)) { + Files.copy(inputStream, mTestApkTwoCerts.toPath(), REPLACE_EXISTING); + } mService = new AppIntegrityManagerServiceImpl( @@ -154,6 +172,11 @@ public class AppIntegrityManagerServiceImplTest { when(mIntegrityFileManager.initialized()).thenReturn(true); } + @After + public void tearDown() throws Exception { + mTestApkTwoCerts.delete(); + } + @Test public void updateRuleSet_notAuthorized() throws Exception { makeUsSystemApp(); @@ -292,6 +315,29 @@ public class AppIntegrityManagerServiceImplTest { assertEquals(INSTALLER_CERTIFICATE_NOT_EVALUATED, allowedInstallers.get(ADB_INSTALLER)); } + @Test + public void handleBroadcast_correctArgs_multipleCerts() throws Exception { + whitelistUsAsRuleProvider(); + makeUsSystemApp(); + ArgumentCaptor broadcastReceiverCaptor = + ArgumentCaptor.forClass(BroadcastReceiver.class); + verify(mMockContext) + .registerReceiver(broadcastReceiverCaptor.capture(), any(), any(), any()); + Intent intent = makeVerificationIntent(); + intent.setDataAndType(Uri.fromFile(mTestApkTwoCerts), PACKAGE_MIME_TYPE); + when(mRuleEvaluationEngine.evaluate(any())).thenReturn(IntegrityCheckResult.allow()); + + broadcastReceiverCaptor.getValue().onReceive(mMockContext, intent); + runJobInHandler(); + + ArgumentCaptor metadataCaptor = + ArgumentCaptor.forClass(AppInstallMetadata.class); + verify(mRuleEvaluationEngine).evaluate(metadataCaptor.capture()); + AppInstallMetadata appInstallMetadata = metadataCaptor.getValue(); + assertThat(appInstallMetadata.getAppCertificates()).containsExactly( + DUMMY_APP_TWO_CERTS_CERT_1, DUMMY_APP_TWO_CERTS_CERT_2); + } + @Test public void handleBroadcast_allow() throws Exception { whitelistUsAsRuleProvider();