1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage etc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc init() { 25*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("avbpubkey", AvbpubkeyModuleFactory) 26*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("avbtool", "avbtool") 27*333d2b36SAndroid Build Coastguard Worker} 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workertype avbpubkeyProperty struct { 30*333d2b36SAndroid Build Coastguard Worker Private_key *string `android:"path"` 31*333d2b36SAndroid Build Coastguard Worker} 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workertype AvbpubkeyModule struct { 34*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker properties avbpubkeyProperty 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker outputPath android.WritablePath 39*333d2b36SAndroid Build Coastguard Worker installPath android.InstallPath 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workerfunc AvbpubkeyModuleFactory() android.Module { 43*333d2b36SAndroid Build Coastguard Worker module := &AvbpubkeyModule{} 44*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 45*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) 46*333d2b36SAndroid Build Coastguard Worker return module 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workervar avbPubKeyRule = pctx.AndroidStaticRule("avbpubkey", 50*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 51*333d2b36SAndroid Build Coastguard Worker Command: `${avbtool} extract_public_key --key ${in} --output ${out}.tmp` + 52*333d2b36SAndroid Build Coastguard Worker ` && ( if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out} ; fi )`, 53*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${avbtool}"}, 54*333d2b36SAndroid Build Coastguard Worker Description: "Extracting system_other avb key", 55*333d2b36SAndroid Build Coastguard Worker }) 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc (m *AvbpubkeyModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 58*333d2b36SAndroid Build Coastguard Worker if !m.ProductSpecific() { 59*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("avbpubkey module type must set product_specific to true") 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker m.outputPath = android.PathForModuleOut(ctx, ctx.ModuleName(), "system_other.avbpubkey") 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 65*333d2b36SAndroid Build Coastguard Worker Rule: avbPubKeyRule, 66*333d2b36SAndroid Build Coastguard Worker Input: android.PathForModuleSrc(ctx, proptools.String(m.properties.Private_key)), 67*333d2b36SAndroid Build Coastguard Worker Output: m.outputPath, 68*333d2b36SAndroid Build Coastguard Worker }) 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker m.installPath = android.PathForModuleInstall(ctx, "etc/security/avb") 71*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(m.installPath, "system_other.avbpubkey", m.outputPath) 72*333d2b36SAndroid Build Coastguard Worker} 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Workerfunc (m *AvbpubkeyModule) AndroidMkEntries() []android.AndroidMkEntries { 75*333d2b36SAndroid Build Coastguard Worker if m.IsSkipInstall() { 76*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{} 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{ 80*333d2b36SAndroid Build Coastguard Worker { 81*333d2b36SAndroid Build Coastguard Worker Class: "ETC", 82*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(m.outputPath), 83*333d2b36SAndroid Build Coastguard Worker }} 84*333d2b36SAndroid Build Coastguard Worker} 85