Search in sources :

Example 1 with CodeTransparency

use of com.android.bundle.CodeTransparencyOuterClass.CodeTransparency in project bundletool by google.

the class AddTransparencyCommandTest method execute_defaultMode_success.

@Test
public void execute_defaultMode_success() throws Exception {
    createBundle(bundlePath);
    AddTransparencyCommand addTransparencyCommand = AddTransparencyCommand.builder().setMode(Mode.DEFAULT).setBundlePath(bundlePath).setOutputPath(outputBundlePath).setSignerConfig(signerConfig).build();
    addTransparencyCommand.execute();
    AppBundle outputBundle = AppBundle.buildFromZip(new ZipFile(outputBundlePath.toFile()));
    Optional<ByteSource> signedTransparencyFile = outputBundle.getBundleMetadata().getFileAsByteSource(BUNDLETOOL_NAMESPACE, BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME);
    assertThat(signedTransparencyFile).isPresent();
    JsonWebSignature jws = (JsonWebSignature) JsonWebSignature.fromCompactSerialization(signedTransparencyFile.get().asCharSource(Charset.defaultCharset()).read());
    assertThat(jws.getAlgorithmHeaderValue()).isEqualTo(RSA_USING_SHA256);
    assertThat(jws.getCertificateChainHeaderValue()).isEqualTo(signerConfig.getCertificates());
    // jws.getPayload method will do signature verification using the public key set below.
    jws.setKey(signerConfig.getCertificates().get(0).getPublicKey());
    CodeTransparency transparencyProto = getTransparencyProto(jws.getPayload());
    assertThat(transparencyProto).isEqualTo(expectedTransparencyProto());
}
Also used : AppBundle(com.android.tools.build.bundletool.model.AppBundle) ZipFile(java.util.zip.ZipFile) JsonWebSignature(org.jose4j.jws.JsonWebSignature) ByteSource(com.google.common.io.ByteSource) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) Test(org.junit.Test)

Example 2 with CodeTransparency

use of com.android.bundle.CodeTransparencyOuterClass.CodeTransparency in project bundletool by google.

the class AddTransparencyCommandTest method execute_injectSignature.

@Test
public void execute_injectSignature() throws Exception {
    // create bundle.
    createBundle(bundlePath);
    // add transparency file in default mode.
    Path tmpOutputBundlePath = tmpDir.resolve("tmp_output_bundle.aab");
    AddTransparencyCommand.builder().setMode(Mode.DEFAULT).setBundlePath(bundlePath).setOutputPath(tmpOutputBundlePath).setSignerConfig(signerConfig).build().execute();
    // get the correct transparency signature bytes.
    AppBundle tmpOutputBundle = AppBundle.buildFromZip(new ZipFile(tmpOutputBundlePath.toFile()));
    ByteSource signedTransparencyFile = tmpOutputBundle.getBundleMetadata().getFileAsByteSource(BUNDLETOOL_NAMESPACE, BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME).get();
    String jws = signedTransparencyFile.asCharSource(Charset.defaultCharset()).read();
    String signature = ImmutableList.copyOf(Splitter.on(".").split(jws)).get(2);
    byte[] signatureBytes = BaseEncoding.base64Url().decode(signature);
    Files.write(transparencySignatureFilePath, signatureBytes);
    // inject signature into the original bundle
    AddTransparencyCommand.builder().setMode(Mode.INJECT_SIGNATURE).setBundlePath(bundlePath).setOutputPath(outputBundlePath).setTransparencyKeyCertificate(signerConfig.getCertificates().get(0)).setTransparencySignaturePath(transparencySignatureFilePath).build().execute();
    // verify that the output bundle contains signed code transparency metadata.
    AppBundle outputBundle = AppBundle.buildFromZip(new ZipFile(outputBundlePath.toFile()));
    Optional<ByteSource> finalSignedTransparencyFile = outputBundle.getBundleMetadata().getFileAsByteSource(BUNDLETOOL_NAMESPACE, BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME);
    assertThat(finalSignedTransparencyFile).isPresent();
    JsonWebSignature finalJws = (JsonWebSignature) JsonWebSignature.fromCompactSerialization(finalSignedTransparencyFile.get().asCharSource(Charset.defaultCharset()).read());
    assertThat(finalJws.getAlgorithmHeaderValue()).isEqualTo(RSA_USING_SHA256);
    assertThat(finalJws.getCertificateChainHeaderValue()).isEqualTo(signerConfig.getCertificates());
    // jws.getPayload method will do signature verification using the public key set below.
    finalJws.setKey(signerConfig.getCertificates().get(0).getPublicKey());
    CodeTransparency transparencyProto = getTransparencyProto(finalJws.getPayload());
    assertThat(transparencyProto).isEqualTo(expectedTransparencyProto());
}
Also used : Path(java.nio.file.Path) AppBundle(com.android.tools.build.bundletool.model.AppBundle) ZipFile(java.util.zip.ZipFile) JsonWebSignature(org.jose4j.jws.JsonWebSignature) ByteSource(com.google.common.io.ByteSource) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) Test(org.junit.Test)

Example 3 with CodeTransparency

use of com.android.bundle.CodeTransparencyOuterClass.CodeTransparency in project bundletool by google.

the class BundleTransparencyCheckUtils method checkTransparency.

/**
 * Verifies code transparency for the given bundle, and returns {@link TransparencyCheckResult}.
 *
 * @throws InvalidBundleException if an error occurs during verification.
 */
public static TransparencyCheckResult checkTransparency(AppBundle bundle, ByteSource signedTransparencyFile) {
    if (bundle.hasSharedUserId()) {
        throw InvalidBundleException.builder().withUserMessage("Transparency file is present in the bundle, but it can not be verified because" + " `sharedUserId` attribute is specified in one of the manifests.").build();
    }
    TransparencyCheckResult.Builder result = TransparencyCheckResult.builder();
    JsonWebSignature jws = CodeTransparencyCryptoUtils.parseJws(signedTransparencyFile);
    if (!CodeTransparencyCryptoUtils.verifySignature(jws)) {
        return result.errorMessage("Verification failed because code transparency signature is invalid.").build();
    }
    result.transparencySignatureVerified(true).transparencyKeyCertificateFingerprint(CodeTransparencyCryptoUtils.getCertificateFingerprint(jws));
    CodeTransparency parsedTransparencyFile = CodeTransparencyFactory.parseFrom(jws.getUnverifiedPayload());
    CodeTransparencyVersion.checkVersion(parsedTransparencyFile);
    MapDifference<String, CodeRelatedFile> difference = Maps.difference(getCodeRelatedFilesFromParsedTransparencyFile(parsedTransparencyFile), getCodeRelatedFilesFromBundle(bundle));
    result.fileContentsVerified(difference.areEqual());
    if (!difference.areEqual()) {
        result.errorMessage(getDiffAsString(difference));
    }
    return result.build();
}
Also used : JsonWebSignature(org.jose4j.jws.JsonWebSignature) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) CodeRelatedFile(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile)

Example 4 with CodeTransparency

use of com.android.bundle.CodeTransparencyOuterClass.CodeTransparency in project bundletool by google.

the class BuildApksManagerTest method transparencyFilePropagatedAsExpected.

@Test
public void transparencyFilePropagatedAsExpected() throws Exception {
    String dexFilePath = "dex/classes.dex";
    byte[] dexFileInBaseModuleContent = TestData.readBytes("testdata/dex/classes.dex");
    byte[] dexFileInFeatureModuleContent = TestData.readBytes("testdata/dex/classes-other.dex");
    String libFilePath = "lib/x86_64/libsome.so";
    byte[] libFileInBaseModuleContent = new byte[] { 4, 5, 6 };
    CodeTransparency codeTransparency = CodeTransparency.newBuilder().addCodeRelatedFile(CodeRelatedFile.newBuilder().setType(CodeRelatedFile.Type.DEX).setPath("base/" + dexFilePath).setSha256(ByteSource.wrap(dexFileInBaseModuleContent).hash(Hashing.sha256()).toString())).addCodeRelatedFile(CodeRelatedFile.newBuilder().setType(CodeRelatedFile.Type.NATIVE_LIBRARY).setPath("base/" + libFilePath).setSha256(ByteSource.wrap(libFileInBaseModuleContent).hash(Hashing.sha256()).toString()).setApkPath(libFilePath)).addCodeRelatedFile(CodeRelatedFile.newBuilder().setType(CodeRelatedFile.Type.DEX).setPath("feature/" + dexFilePath).setSha256(ByteSource.wrap(dexFileInFeatureModuleContent).hash(Hashing.sha256()).toString())).build();
    Path bundlePath = tmpDir.resolve("bundle.aab");
    AppBundleBuilder appBundle = new AppBundleBuilder().addModule("base", module -> module.setManifest(androidManifest("com.test.app", withMinSdkVersion(20))).setResourceTable(resourceTableWithTestLabel("Test feature")).addFile(dexFilePath, bundlePath, ZipPath.create("base/" + dexFilePath), dexFileInBaseModuleContent).addFile(libFilePath, bundlePath, ZipPath.create("base/" + libFilePath), libFileInBaseModuleContent).setNativeConfig(nativeLibraries(targetedNativeDirectory("lib/x86_64", nativeDirectoryTargeting(AbiAlias.X86_64))))).addModule("feature", module -> module.setManifest(androidManifest("com.test.app", withDelivery(DeliveryType.ON_DEMAND), withFusingAttribute(true), withTitle("@string/test_label", TEST_LABEL_RESOURCE_ID))).addFile(dexFilePath, bundlePath, ZipPath.create("feature/" + dexFilePath), dexFileInFeatureModuleContent)).addMetadataFile(BundleMetadata.BUNDLETOOL_NAMESPACE, BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME, CharSource.wrap(createJwsToken(codeTransparency, certificate, privateKey)).asByteSource(Charset.defaultCharset()));
    TestComponent.useTestModule(this, createTestModuleBuilder().withOutputPath(outputFilePath).withAppBundle(appBundle.build()).build());
    buildApksManager.execute();
    ZipFile apkSetFile = openZipFile(outputFilePath.toFile());
    BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir);
    ImmutableList<ApkDescription> splitApks = apkDescriptions(splitApkVariants(result));
    // Transparency file should be propagated to main split of the base module.
    ImmutableList<ApkDescription> mainSplitsOfBaseModule = splitApks.stream().filter(apk -> apk.getSplitApkMetadata().getSplitId().isEmpty() && apk.getSplitApkMetadata().getIsMasterSplit()).collect(toImmutableList());
    assertThat(mainSplitsOfBaseModule).hasSize(2);
    for (ApkDescription apk : mainSplitsOfBaseModule) {
        ZipFile zipFile = openZipFile(extractFromApkSetFile(apkSetFile, apk.getPath(), outputDir));
        assertThat(filesUnderPath(zipFile, ZipPath.create("META-INF"))).contains("META-INF/" + BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME);
    }
    // Other splits should not contain transparency file.
    ImmutableList<ApkDescription> otherSplits = splitApks.stream().filter(apk -> !apk.getSplitApkMetadata().getSplitId().isEmpty()).collect(toImmutableList());
    assertThat(otherSplits).hasSize(4);
    for (ApkDescription apk : otherSplits) {
        ZipFile zipFile = openZipFile(extractFromApkSetFile(apkSetFile, apk.getPath(), outputDir));
        assertThat(filesUnderPath(zipFile, ZipPath.create("META-INF"))).isEmpty();
    }
    // Because minSdkVersion < 21, bundle has a feature module and merging strategy is
    // MERGE_IF_NEEDED (default), transparency file should not be propagated to standalone APK.
    assertThat(standaloneApkVariants(result)).hasSize(1);
    ImmutableList<ApkDescription> standaloneApks = apkDescriptions(standaloneApkVariants(result).get(0));
    File standaloneApkFile = extractFromApkSetFile(apkSetFile, standaloneApks.get(0).getPath(), outputDir);
    ZipFile standaloneApkZip = openZipFile(standaloneApkFile);
    assertThat(filesUnderPath(standaloneApkZip, ZipPath.create("META-INF"))).isEmpty();
}
Also used : TestUtils.filesUnderPath(com.android.tools.build.bundletool.testing.TestUtils.filesUnderPath) Path(java.nio.file.Path) ZipPath(com.android.tools.build.bundletool.model.ZipPath) TEST_LABEL_RESOURCE_ID(com.android.tools.build.bundletool.testing.ResourcesTableFactory.TEST_LABEL_RESOURCE_ID) SYSTEM(com.android.tools.build.bundletool.commands.BuildApksCommand.ApkBuildMode.SYSTEM) ApkTargeting(com.android.bundle.Targeting.ApkTargeting) ApkSetUtils.parseTocFromFile(com.android.tools.build.bundletool.testing.ApkSetUtils.parseTocFromFile) TargetingUtils.alternativeLanguageTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.alternativeLanguageTargeting) Bundletool(com.android.bundle.Config.Bundletool) ARM64_V8A(com.android.bundle.Targeting.Abi.AbiAlias.ARM64_V8A) AssetModulesConfig(com.android.bundle.Config.AssetModulesConfig) Map(java.util.Map) DensityAlias(com.android.bundle.Targeting.ScreenDensity.DensityAlias) TestUtils.filesUnderPath(com.android.tools.build.bundletool.testing.TestUtils.filesUnderPath) Path(java.nio.file.Path) SourceStamp(com.android.tools.build.bundletool.model.SourceStamp) ManifestProtoUtils.withTitle(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withTitle) TargetingUtils.nativeDirectoryTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.nativeDirectoryTargeting) ASSETS_DIRECTORY(com.android.tools.build.bundletool.model.BundleModule.ASSETS_DIRECTORY) DIRECTORY(com.android.tools.build.bundletool.commands.BuildApksCommand.OutputFormat.DIRECTORY) DeviceFactory.sdkVersion(com.android.tools.build.bundletool.testing.DeviceFactory.sdkVersion) ApkSet(com.android.bundle.Commands.ApkSet) BundleConfig(com.android.bundle.Config.BundleConfig) TextureCompressionFormatTargeting(com.android.bundle.Targeting.TextureCompressionFormatTargeting) TargetingUtils.variantAbiTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.variantAbiTargeting) SystemApkOption(com.android.tools.build.bundletool.commands.BuildApksCommand.SystemApkOption) ManifestProtoUtils.androidManifestForFeature(com.android.tools.build.bundletool.testing.ManifestProtoUtils.androidManifestForFeature) TargetingUtils.assetsDirectoryTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.assetsDirectoryTargeting) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) SystemApkMetadata(com.android.bundle.Commands.SystemApkMetadata) STAMP_SOURCE_METADATA_KEY(com.android.tools.build.bundletool.model.SourceStamp.STAMP_SOURCE_METADATA_KEY) MDPI(com.android.tools.build.bundletool.testing.ResourcesTableFactory.MDPI) ApexManifest(com.android.apex.ApexManifestProto.ApexManifest) ZipPath(com.android.tools.build.bundletool.model.ZipPath) ManifestProtoUtils.withInstantOnDemandDelivery(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withInstantOnDemandDelivery) RunWith(org.junit.runner.RunWith) MDPI_VALUE(com.android.tools.build.bundletool.model.utils.ResourcesUtils.MDPI_VALUE) SdkVersion(com.android.bundle.Targeting.SdkVersion) TEXTURE_COMPRESSION_FORMAT(com.android.tools.build.bundletool.model.OptimizationDimension.TEXTURE_COMPRESSION_FORMAT) DeviceFactory.mergeSpecs(com.android.tools.build.bundletool.testing.DeviceFactory.mergeSpecs) StandaloneApkMetadata(com.android.bundle.Commands.StandaloneApkMetadata) SigningConfiguration(com.android.tools.build.bundletool.model.SigningConfiguration) Theories(org.junit.experimental.theories.Theories) ResultUtils.instantApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.instantApkVariants) ImmutableSet.toImmutableSet(com.google.common.collect.ImmutableSet.toImmutableSet) ApkDescription(com.android.bundle.Commands.ApkDescription) Before(org.junit.Before) X86(com.android.bundle.Targeting.Abi.AbiAlias.X86) USER_PACKAGE_OFFSET(com.android.tools.build.bundletool.testing.ResourcesTableFactory.USER_PACKAGE_OFFSET) AssetSliceSet(com.android.bundle.Commands.AssetSliceSet) Iterables.getOnlyElement(com.google.common.collect.Iterables.getOnlyElement) IOException(java.io.IOException) Test(org.junit.Test) Correspondence(com.google.common.truth.Correspondence) ALL_MODULES_SHORTCUT(com.android.tools.build.bundletool.commands.ExtractApksCommand.ALL_MODULES_SHORTCUT) ResultUtils.apexApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.apexApkVariants) AppBundle(com.android.tools.build.bundletool.model.AppBundle) CodeRelatedFile(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile) X509Certificate(java.security.cert.X509Certificate) ManifestProtoUtils.withNativeActivity(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withNativeActivity) ManifestProtoUtils.androidManifest(com.android.tools.build.bundletool.testing.ManifestProtoUtils.androidManifest) AndroidManifest(com.android.tools.build.bundletool.model.AndroidManifest) Maps.transformValues(com.google.common.collect.Maps.transformValues) ManifestProtoUtils.withInstallLocation(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withInstallLocation) ResourceTableBuilder(com.android.tools.build.bundletool.testing.ResourceTableBuilder) AssetsDirectoryTargeting(com.android.bundle.Targeting.AssetsDirectoryTargeting) TargetingUtils.languageTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.languageTargeting) ManifestProtoUtils.withOnDemandDelivery(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withOnDemandDelivery) ZipFile(java.util.zip.ZipFile) ZipEntry(java.util.zip.ZipEntry) PERSISTENT(com.android.tools.build.bundletool.commands.BuildApksCommand.ApkBuildMode.PERSISTENT) ImmutableSet(com.google.common.collect.ImmutableSet) Collection(java.util.Collection) KeyStore(java.security.KeyStore) InstantMetadata(com.android.bundle.Commands.InstantMetadata) Collectors(java.util.stream.Collectors) ScreenDensity(com.android.bundle.Targeting.ScreenDensity) InvalidVersionCodeException(com.android.tools.build.bundletool.model.exceptions.InvalidVersionCodeException) DefaultTargetingValue(com.android.bundle.Commands.DefaultTargetingValue) ManifestProtoUtils.withOnDemandAttribute(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withOnDemandAttribute) CertificateHelper(com.android.tools.build.bundletool.model.utils.CertificateHelper) AppBundleBuilder(com.android.tools.build.bundletool.testing.AppBundleBuilder) ApkSetUtils(com.android.tools.build.bundletool.testing.ApkSetUtils) PermanentlyFusedModule(com.android.bundle.Commands.PermanentlyFusedModule) FilePreconditions(com.android.tools.build.bundletool.model.utils.files.FilePreconditions) ManifestProtoUtils.withMaxSdkVersion(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withMaxSdkVersion) BundleType(com.android.bundle.Config.BundleConfig.BundleType) DeviceFactory.locales(com.android.tools.build.bundletool.testing.DeviceFactory.locales) MoreExecutors(com.google.common.util.concurrent.MoreExecutors) TargetingUtils.alternativeTextureCompressionTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.alternativeTextureCompressionTargeting) TargetingUtils.variantSdkTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.variantSdkTargeting) ResultUtils.standaloneApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.standaloneApkVariants) ApkModifier(com.android.tools.build.bundletool.model.ApkModifier) BundleConfigBuilder(com.android.tools.build.bundletool.testing.BundleConfigBuilder) Hashing(com.google.common.hash.Hashing) TargetingUtils.moduleDeviceGroupsTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.moduleDeviceGroupsTargeting) ManifestProtoUtils.withDeviceGroupsCondition(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withDeviceGroupsCondition) TargetingUtils.toAbi(com.android.tools.build.bundletool.testing.TargetingUtils.toAbi) Inject(javax.inject.Inject) ModuleMetadata(com.android.bundle.Commands.ModuleMetadata) ImmutableList(com.google.common.collect.ImmutableList) Charset(java.nio.charset.Charset) ManifestProtoUtils.withSplitNameService(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withSplitNameService) CharSource(com.google.common.io.CharSource) Truth8.assertThat(com.google.common.truth.Truth8.assertThat) LDPI(com.android.tools.build.bundletool.testing.ResourcesTableFactory.LDPI) CertificateFactory(com.android.tools.build.bundletool.testing.CertificateFactory) TargetingUtils.sdkVersionFrom(com.android.tools.build.bundletool.testing.TargetingUtils.sdkVersionFrom) TestData(com.android.tools.build.bundletool.TestData) Truth.assertThat(com.google.common.truth.Truth.assertThat) FileUtils(com.android.tools.build.bundletool.testing.FileUtils) TargetingUtils.nativeLibraries(com.android.tools.build.bundletool.testing.TargetingUtils.nativeLibraries) Ignore(org.junit.Ignore) InvalidCommandException(com.android.tools.build.bundletool.model.exceptions.InvalidCommandException) ApkVerifier(com.android.apksig.ApkVerifier) Configuration(com.android.aapt.ConfigurationOuterClass.Configuration) KeyPair(java.security.KeyPair) Value(com.android.bundle.Config.SplitDimension.Value) UNIVERSAL(com.android.tools.build.bundletool.commands.BuildApksCommand.ApkBuildMode.UNIVERSAL) ResourcesTableFactory.locale(com.android.tools.build.bundletool.testing.ResourcesTableFactory.locale) TargetingUtils.textureCompressionTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.textureCompressionTargeting) DeviceFactory.abis(com.android.tools.build.bundletool.testing.DeviceFactory.abis) TargetingUtils.variantMultiAbiTargetingFromAllTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.variantMultiAbiTargetingFromAllTargeting) DeliveryType(com.android.bundle.Commands.DeliveryType) ManifestProtoUtils.withUsesSplit(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withUsesSplit) ResourcesTableFactory.resourceTableWithTestLabel(com.android.tools.build.bundletool.testing.ResourcesTableFactory.resourceTableWithTestLabel) Version(com.android.tools.build.bundletool.model.version.Version) TruthZip(com.android.tools.build.bundletool.testing.truth.zip.TruthZip) Theory(org.junit.experimental.theories.Theory) KeyPairGenerator(java.security.KeyPairGenerator) ImmutableMultiset.toImmutableMultiset(com.google.common.collect.ImmutableMultiset.toImmutableMultiset) BundleToolVersion(com.android.tools.build.bundletool.model.version.BundleToolVersion) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) Set(java.util.Set) ARMEABI_V7A(com.android.bundle.Targeting.Abi.AbiAlias.ARMEABI_V7A) LanguageTargeting(com.android.bundle.Targeting.LanguageTargeting) ManifestProtoUtils.withInstallTimeRemovableElement(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withInstallTimeRemovableElement) Executors(java.util.concurrent.Executors) ManifestProtoUtils.withMinSdkVersion(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withMinSdkVersion) ApexImages(com.android.bundle.Files.ApexImages) TargetingUtils.apexImageTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.apexImageTargeting) ImmutableMap.toImmutableMap(com.google.common.collect.ImmutableMap.toImmutableMap) DeviceFactory.density(com.android.tools.build.bundletool.testing.DeviceFactory.density) TextureCompressionFormat(com.android.bundle.Targeting.TextureCompressionFormat) PrivateKey(java.security.PrivateKey) ByteStreams(com.google.common.io.ByteStreams) ManifestProtoUtils.withInstallTimeDelivery(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withInstallTimeDelivery) ResultUtils.systemApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.systemApkVariants) DEVELOPMENT_SDK_VERSION(com.android.tools.build.bundletool.model.AndroidManifest.DEVELOPMENT_SDK_VERSION) TargetingUtils.targetedApexImage(com.android.tools.build.bundletool.testing.TargetingUtils.targetedApexImage) ListeningExecutorService(com.google.common.util.concurrent.ListeningExecutorService) TruthZip.assertThat(com.android.tools.build.bundletool.testing.truth.zip.TruthZip.assertThat) Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) Iterables(com.google.common.collect.Iterables) Optimizations(com.android.bundle.Config.Optimizations) ATC(com.android.bundle.Targeting.TextureCompressionFormat.TextureCompressionFormatAlias.ATC) TargetingUtils.textureCompressionFormat(com.android.tools.build.bundletool.testing.TargetingUtils.textureCompressionFormat) Component(dagger.Component) LANGUAGE(com.android.tools.build.bundletool.model.OptimizationDimension.LANGUAGE) ApkSetUtils.extractTocFromApkSetFile(com.android.tools.build.bundletool.testing.ApkSetUtils.extractTocFromApkSetFile) Closer(com.google.common.io.Closer) ImmutableMultiset(com.google.common.collect.ImmutableMultiset) AppBundleSerializer(com.android.tools.build.bundletool.io.AppBundleSerializer) ResultUtils.splitApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.splitApkVariants) SplitApkMetadata(com.android.bundle.Commands.SplitApkMetadata) ANDROID_P_API_VERSION(com.android.tools.build.bundletool.model.utils.Versions.ANDROID_P_API_VERSION) ByteSource(com.google.common.io.ByteSource) CodeTransparencyTestUtils.createJwsToken(com.android.tools.build.bundletool.testing.CodeTransparencyTestUtils.createJwsToken) ANDROID_Q_API_VERSION(com.android.tools.build.bundletool.model.utils.Versions.ANDROID_Q_API_VERSION) VariantTargeting(com.android.bundle.Targeting.VariantTargeting) AdbServer(com.android.tools.build.bundletool.device.AdbServer) StandaloneConfig(com.android.bundle.Config.StandaloneConfig) Int32Value(com.google.protobuf.Int32Value) DeviceFactory.deviceTier(com.android.tools.build.bundletool.testing.DeviceFactory.deviceTier) Files(java.nio.file.Files) ANDROID_N_API_VERSION(com.android.tools.build.bundletool.model.utils.Versions.ANDROID_N_API_VERSION) TargetingUtils.targetedNativeDirectory(com.android.tools.build.bundletool.testing.TargetingUtils.targetedNativeDirectory) TestCase.fail(junit.framework.TestCase.fail) FileOutputStream(java.io.FileOutputStream) X86_64(com.android.bundle.Targeting.Abi.AbiAlias.X86_64) BundleMetadata(com.android.tools.build.bundletool.model.BundleMetadata) ANDROID_M_API_VERSION(com.android.tools.build.bundletool.model.utils.Versions.ANDROID_M_API_VERSION) TargetingUtils.assets(com.android.tools.build.bundletool.testing.TargetingUtils.assets) File(java.io.File) ApkSetUtils.extractFromApkSetFile(com.android.tools.build.bundletool.testing.ApkSetUtils.extractFromApkSetFile) ResultUtils.archivedApkVariants(com.android.tools.build.bundletool.model.utils.ResultUtils.archivedApkVariants) Paths(java.nio.file.Paths) FakeAdbServer(com.android.tools.build.bundletool.testing.FakeAdbServer) Abi(com.android.bundle.Targeting.Abi) TargetingUtils.sdkVersionTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.sdkVersionTargeting) ManifestProtoUtils.withAppIcon(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withAppIcon) Variant(com.android.bundle.Commands.Variant) TestUtils.extractAndroidManifest(com.android.tools.build.bundletool.testing.TestUtils.extractAndroidManifest) MoreCollectors.onlyElement(com.google.common.collect.MoreCollectors.onlyElement) ManifestProtoUtils.androidManifestForAssetModule(com.android.tools.build.bundletool.testing.ManifestProtoUtils.androidManifestForAssetModule) TargetingUtils.mergeVariantTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.mergeVariantTargeting) ManifestProtoUtils.withDelivery(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withDelivery) TargetingUtils.deviceTierTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.deviceTierTargeting) TargetingUtils.targetedAssetsDirectory(com.android.tools.build.bundletool.testing.TargetingUtils.targetedAssetsDirectory) After(org.junit.After) ManifestProtoUtils.withTargetSdkVersion(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withTargetSdkVersion) ImmutableMap(com.google.common.collect.ImmutableMap) FromDataPoints(org.junit.experimental.theories.FromDataPoints) List(java.util.List) Certificate(java.security.cert.Certificate) INSTANT(com.android.tools.build.bundletool.commands.BuildApksCommand.ApkBuildMode.INSTANT) DataPoints(org.junit.experimental.theories.DataPoints) ABI(com.android.tools.build.bundletool.model.OptimizationDimension.ABI) ManifestProtoUtils.withCustomThemeActivity(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withCustomThemeActivity) TargetingUtils.apkLanguageTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.apkLanguageTargeting) TestModule(com.android.tools.build.bundletool.testing.TestModule) BeforeClass(org.junit.BeforeClass) TargetingUtils.apexImages(com.android.tools.build.bundletool.testing.TargetingUtils.apexImages) BuildApksResult(com.android.bundle.Commands.BuildApksResult) DeviceTierTargeting(com.android.bundle.Targeting.DeviceTierTargeting) SdkVersionTargeting(com.android.bundle.Targeting.SdkVersionTargeting) ProtoTruth.assertThat(com.google.common.truth.extensions.proto.ProtoTruth.assertThat) MIPS(com.android.bundle.Targeting.Abi.AbiAlias.MIPS) ManifestProtoUtils.withInstant(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withInstant) ARCHIVE(com.android.tools.build.bundletool.commands.BuildApksCommand.ApkBuildMode.ARCHIVE) Assert.assertNotNull(org.junit.Assert.assertNotNull) InvalidBundleException(com.android.tools.build.bundletool.model.exceptions.InvalidBundleException) ManifestProtoUtils.withFusingAttribute(com.android.tools.build.bundletool.testing.ManifestProtoUtils.withFusingAttribute) TargetingUtils.apkMultiAbiTargetingFromAllTargeting(com.android.tools.build.bundletool.testing.TargetingUtils.apkMultiAbiTargetingFromAllTargeting) ETC1_RGB8(com.android.bundle.Targeting.TextureCompressionFormat.TextureCompressionFormatAlias.ETC1_RGB8) AssetModulesInfo(com.android.bundle.Commands.AssetModulesInfo) Maps(com.google.common.collect.Maps) AbiAlias(com.android.bundle.Targeting.Abi.AbiAlias) Rule(org.junit.Rule) Collections(java.util.Collections) TemporaryFolder(org.junit.rules.TemporaryFolder) ApkDescription(com.android.bundle.Commands.ApkDescription) ZipFile(java.util.zip.ZipFile) BuildApksResult(com.android.bundle.Commands.BuildApksResult) AppBundleBuilder(com.android.tools.build.bundletool.testing.AppBundleBuilder) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) ApkSetUtils.parseTocFromFile(com.android.tools.build.bundletool.testing.ApkSetUtils.parseTocFromFile) CodeRelatedFile(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile) ZipFile(java.util.zip.ZipFile) ApkSetUtils.extractTocFromApkSetFile(com.android.tools.build.bundletool.testing.ApkSetUtils.extractTocFromApkSetFile) File(java.io.File) ApkSetUtils.extractFromApkSetFile(com.android.tools.build.bundletool.testing.ApkSetUtils.extractFromApkSetFile) Test(org.junit.Test)

Example 5 with CodeTransparency

use of com.android.bundle.CodeTransparencyOuterClass.CodeTransparency in project bundletool by google.

the class CodeTransparencyValidatorTest method createBundle.

private void createBundle(Path path, CodeTransparency codeTransparency) throws Exception {
    String transparencyPayload = JsonFormat.printer().print(codeTransparency);
    AppBundleBuilder appBundle = new AppBundleBuilder().addModule("base", module -> module.setManifest(androidManifest("com.test.app")).addFile(DEX_PATH, DEX_FILE_CONTENT).addFile(NATIVE_LIB_PATH, NATIVE_LIB_FILE_CONTENT)).addMetadataFile(BundleMetadata.BUNDLETOOL_NAMESPACE, BundleMetadata.TRANSPARENCY_SIGNED_FILE_NAME, CharSource.wrap(createJwsToken(transparencyPayload)).asByteSource(Charset.defaultCharset()));
    new AppBundleSerializer().writeToDisk(appBundle.build(), path);
}
Also used : Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) X509Certificate(java.security.cert.X509Certificate) KeyPair(java.security.KeyPair) ManifestProtoUtils.androidManifest(com.android.tools.build.bundletool.testing.ManifestProtoUtils.androidManifest) RunWith(org.junit.runner.RunWith) NATIVE_LIBRARY(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile.Type.NATIVE_LIBRARY) Hashing(com.google.common.hash.Hashing) Charset(java.nio.charset.Charset) AppBundleSerializer(com.android.tools.build.bundletool.io.AppBundleSerializer) ZipFile(java.util.zip.ZipFile) CharSource(com.google.common.io.CharSource) ByteSource(com.google.common.io.ByteSource) Path(java.nio.file.Path) Before(org.junit.Before) KeyPairGenerator(java.security.KeyPairGenerator) JsonWebSignature(org.jose4j.jws.JsonWebSignature) CertificateFactory(com.android.tools.build.bundletool.testing.CertificateFactory) InvalidBundleException(com.android.tools.build.bundletool.model.exceptions.InvalidBundleException) RSA_USING_SHA256(org.jose4j.jws.AlgorithmIdentifiers.RSA_USING_SHA256) Test(org.junit.Test) BundleMetadata(com.android.tools.build.bundletool.model.BundleMetadata) JUnit4(org.junit.runners.JUnit4) Truth.assertThat(com.google.common.truth.Truth.assertThat) JoseException(org.jose4j.lang.JoseException) AppBundleBuilder(com.android.tools.build.bundletool.testing.AppBundleBuilder) Rule(org.junit.Rule) JsonFormat(com.google.protobuf.util.JsonFormat) PrivateKey(java.security.PrivateKey) DEX(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile.Type.DEX) CodeTransparency(com.android.bundle.CodeTransparencyOuterClass.CodeTransparency) AppBundle(com.android.tools.build.bundletool.model.AppBundle) CodeRelatedFile(com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile) TemporaryFolder(org.junit.rules.TemporaryFolder) AppBundleBuilder(com.android.tools.build.bundletool.testing.AppBundleBuilder) AppBundleSerializer(com.android.tools.build.bundletool.io.AppBundleSerializer)

Aggregations

CodeTransparency (com.android.bundle.CodeTransparencyOuterClass.CodeTransparency)6 ZipFile (java.util.zip.ZipFile)5 JsonWebSignature (org.jose4j.jws.JsonWebSignature)5 AppBundle (com.android.tools.build.bundletool.model.AppBundle)4 ByteSource (com.google.common.io.ByteSource)4 Path (java.nio.file.Path)4 Test (org.junit.Test)4 CodeRelatedFile (com.android.bundle.CodeTransparencyOuterClass.CodeRelatedFile)3 AppBundleSerializer (com.android.tools.build.bundletool.io.AppBundleSerializer)2 BundleMetadata (com.android.tools.build.bundletool.model.BundleMetadata)2 InvalidBundleException (com.android.tools.build.bundletool.model.exceptions.InvalidBundleException)2 AppBundleBuilder (com.android.tools.build.bundletool.testing.AppBundleBuilder)2 CertificateFactory (com.android.tools.build.bundletool.testing.CertificateFactory)2 ManifestProtoUtils.androidManifest (com.android.tools.build.bundletool.testing.ManifestProtoUtils.androidManifest)2 Hashing (com.google.common.hash.Hashing)2 CharSource (com.google.common.io.CharSource)2 Truth.assertThat (com.google.common.truth.Truth.assertThat)2 Charset (java.nio.charset.Charset)2 KeyPair (java.security.KeyPair)2 KeyPairGenerator (java.security.KeyPairGenerator)2