summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Cole Faust <colefaust@google.com> 2024-11-12 18:56:49 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2024-11-12 18:56:49 +0000
commitc4253deedac2021ed50d633288acf26e0df797e1 (patch)
tree26591f1afc6dff6ba764e5576126fb304ef2fd33
parentf18c94b40f765cdf147bdd3e5c0f5012240093b8 (diff)
parentb3d6e75538d3d4e372bd4f433a5f7eacf743cc86 (diff)
Merge "Make chained_partitions accept other vbmeta modules" into main
-rw-r--r--filesystem/vbmeta.go152
-rw-r--r--fsgen/vbmeta_partitions.go8
2 files changed, 104 insertions, 56 deletions
diff --git a/filesystem/vbmeta.go b/filesystem/vbmeta.go
index 6a3fc1f18..ebb3ff951 100644
--- a/filesystem/vbmeta.go
+++ b/filesystem/vbmeta.go
@@ -26,8 +26,19 @@ import (
func init() {
android.RegisterModuleType("vbmeta", VbmetaFactory)
+ pctx.HostBinToolVariable("avbtool", "avbtool")
}
+var (
+ extractPublicKeyRule = pctx.AndroidStaticRule("avb_extract_public_key",
+ blueprint.RuleParams{
+ Command: `${avbtool} extract_public_key --key $in --output $out`,
+ CommandDeps: []string{
+ "${avbtool}",
+ },
+ })
+)
+
type vbmeta struct {
android.ModuleBase
@@ -60,8 +71,15 @@ type VbmetaProperties struct {
// have to be signed (use_avb: true).
Partitions proptools.Configurable[[]string]
- // List of chained partitions that this vbmeta deletages the verification.
- Chained_partitions []ChainedPartitionProperties
+ // Metadata about the chained partitions that this vbmeta delegates the verification.
+ // This is an alternative to chained_partitions, using chained_partitions instead is simpler
+ // in most cases. However, this property allows building this vbmeta partition without
+ // its chained partitions existing in this build.
+ Chained_partition_metadata []ChainedPartitionProperties
+
+ // List of chained partitions that this vbmeta delegates the verification. They are the
+ // names of other vbmeta modules.
+ Chained_partitions []string
// List of key-value pair of avb properties
Avb_properties []avbProperty
@@ -93,6 +111,20 @@ type ChainedPartitionProperties struct {
Private_key *string `android:"path"`
}
+type vbmetaPartitionInfo struct {
+ // Name of the partition
+ Name string
+
+ // Rollback index location, non-negative int
+ RollbackIndexLocation int
+
+ // The path to the public key of the private key used to sign this partition. Derived from
+ // the private key.
+ PublicKey android.Path
+}
+
+var vbmetaPartitionProvider = blueprint.NewProvider[vbmetaPartitionInfo]()
+
// vbmeta is the partition image that has the verification information for other partitions.
func VbmetaFactory() android.Module {
module := &vbmeta{}
@@ -103,13 +135,18 @@ func VbmetaFactory() android.Module {
type vbmetaDep struct {
blueprint.BaseDependencyTag
- kind string
}
-var vbmetaPartitionDep = vbmetaDep{kind: "partition"}
+type chainedPartitionDep struct {
+ blueprint.BaseDependencyTag
+}
+
+var vbmetaPartitionDep = vbmetaDep{}
+var vbmetaChainedPartitionDep = chainedPartitionDep{}
func (v *vbmeta) DepsMutator(ctx android.BottomUpMutatorContext) {
ctx.AddDependency(ctx.Module(), vbmetaPartitionDep, v.properties.Partitions.GetOrDefault(ctx, nil)...)
+ ctx.AddDependency(ctx.Module(), vbmetaChainedPartitionDep, v.properties.Chained_partitions...)
}
func (v *vbmeta) installFileName() string {
@@ -124,8 +161,6 @@ func (v *vbmeta) partitionName() string {
const vbmetaMaxSize = 64 * 1024
func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- extractedPublicKeys := v.extractPublicKeys(ctx)
-
v.output = android.PathForModuleOut(ctx, v.installFileName()).OutputPath
builder := android.NewRuleBuilder(pctx, ctx)
@@ -175,25 +210,66 @@ func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) {
cmd.FlagWithInput("--include_descriptors_from_image ", signedImage)
}
- for i, cp := range v.properties.Chained_partitions {
- name := proptools.String(cp.Name)
+ seenRils := make(map[int]bool)
+ for _, cp := range ctx.GetDirectDepsWithTag(vbmetaChainedPartitionDep) {
+ info, ok := android.OtherModuleProvider(ctx, cp, vbmetaPartitionProvider)
+ if !ok {
+ ctx.PropertyErrorf("chained_partitions", "Expected all modules in chained_partitions to provide vbmetaPartitionProvider, but %s did not", cp.Name())
+ continue
+ }
+ if info.Name == "" {
+ ctx.PropertyErrorf("chained_partitions", "name must be specified")
+ continue
+ }
+
+ ril := info.RollbackIndexLocation
+ if ril < 0 {
+ ctx.PropertyErrorf("chained_partitions", "rollback index location must be 0, 1, 2, ...")
+ continue
+ } else if seenRils[ril] {
+ ctx.PropertyErrorf("chained_partitions", "Multiple chained partitions with the same rollback index location %d", ril)
+ continue
+ }
+ seenRils[ril] = true
+
+ publicKey := info.PublicKey
+ cmd.FlagWithArg("--chain_partition ", fmt.Sprintf("%s:%d:%s", info.Name, ril, publicKey.String()))
+ cmd.Implicit(publicKey)
+ }
+ for _, cpm := range v.properties.Chained_partition_metadata {
+ name := proptools.String(cpm.Name)
if name == "" {
ctx.PropertyErrorf("chained_partitions", "name must be specified")
continue
}
- ril := proptools.IntDefault(cp.Rollback_index_location, i+1)
+ ril := proptools.IntDefault(cpm.Rollback_index_location, -1)
if ril < 0 {
- ctx.PropertyErrorf("chained_partitions", "must be 0, 1, 2, ...")
+ ctx.PropertyErrorf("chained_partition_metadata", "rollback index location must be 0, 1, 2, ...")
+ continue
+ } else if seenRils[ril] {
+ ctx.PropertyErrorf("chained_partition_metadata", "Multiple chained partitions with the same rollback index location %d", ril)
continue
}
+ seenRils[ril] = true
var publicKey android.Path
- if cp.Public_key != nil {
- publicKey = android.PathForModuleSrc(ctx, proptools.String(cp.Public_key))
+ if cpm.Public_key != nil {
+ publicKey = android.PathForModuleSrc(ctx, *cpm.Public_key)
+ } else if cpm.Private_key != nil {
+ privateKey := android.PathForModuleSrc(ctx, *cpm.Private_key)
+ extractedPublicKey := android.PathForModuleOut(ctx, "chained_metadata", name+".avbpubkey")
+ ctx.Build(pctx, android.BuildParams{
+ Rule: extractPublicKeyRule,
+ Input: privateKey,
+ Output: extractedPublicKey,
+ })
+ publicKey = extractedPublicKey
} else {
- publicKey = extractedPublicKeys[name]
+ ctx.PropertyErrorf("public_key", "Either public_key or private_key must be specified")
+ continue
}
+
cmd.FlagWithArg("--chain_partition ", fmt.Sprintf("%s:%d:%s", name, ril, publicKey.String()))
cmd.Implicit(publicKey)
}
@@ -211,6 +287,19 @@ func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) {
v.installDir = android.PathForModuleInstall(ctx, "etc")
ctx.InstallFile(v.installDir, v.installFileName(), v.output)
+ extractedPublicKey := android.PathForModuleOut(ctx, v.partitionName()+".avbpubkey")
+ ctx.Build(pctx, android.BuildParams{
+ Rule: extractPublicKeyRule,
+ Input: key,
+ Output: extractedPublicKey,
+ })
+
+ android.SetProvider(ctx, vbmetaPartitionProvider, vbmetaPartitionInfo{
+ Name: v.partitionName(),
+ RollbackIndexLocation: ril,
+ PublicKey: extractedPublicKey,
+ })
+
ctx.SetOutputFiles([]android.Path{v.output}, "")
}
@@ -224,43 +313,6 @@ func (v *vbmeta) rollbackIndexCommand(ctx android.ModuleContext) string {
}
}
-// Extract public keys from chained_partitions.private_key. The keys are indexed with the partition
-// name.
-func (v *vbmeta) extractPublicKeys(ctx android.ModuleContext) map[string]android.OutputPath {
- result := make(map[string]android.OutputPath)
-
- builder := android.NewRuleBuilder(pctx, ctx)
- for _, cp := range v.properties.Chained_partitions {
- if cp.Private_key == nil {
- continue
- }
-
- name := proptools.String(cp.Name)
- if name == "" {
- ctx.PropertyErrorf("chained_partitions", "name must be specified")
- continue
- }
-
- if _, ok := result[name]; ok {
- ctx.PropertyErrorf("chained_partitions", "name %q is duplicated", name)
- continue
- }
-
- privateKeyFile := android.PathForModuleSrc(ctx, proptools.String(cp.Private_key))
- publicKeyFile := android.PathForModuleOut(ctx, name+".avbpubkey").OutputPath
-
- builder.Command().
- BuiltTool("avbtool").
- Text("extract_public_key").
- FlagWithInput("--key ", privateKeyFile).
- FlagWithOutput("--output ", publicKeyFile)
-
- result[name] = publicKeyFile
- }
- builder.Build("vbmeta_extract_public_key", fmt.Sprintf("Extract public keys for %s", ctx.ModuleName()))
- return result
-}
-
var _ android.AndroidMkProviderInfoProducer = (*vbmeta)(nil)
func (v *vbmeta) PrepareAndroidMKProviderInfo(config android.Config) *android.AndroidMkProviderInfo {
diff --git a/fsgen/vbmeta_partitions.go b/fsgen/vbmeta_partitions.go
index f7b46389b..52f8ae521 100644
--- a/fsgen/vbmeta_partitions.go
+++ b/fsgen/vbmeta_partitions.go
@@ -51,7 +51,7 @@ func createVbmetaPartitions(ctx android.LoadHookContext, generatedPartitionTypes
var result []vbmetaModuleInfo
- var chainedPartitions []filesystem.ChainedPartitionProperties
+ var chainedPartitions []string
var partitionTypesHandledByChainedPartitions []string
for chainedName, props := range partitionVars.ChainedVbmetaPartitions {
chainedName = "vbmeta_" + chainedName
@@ -117,11 +117,7 @@ func createVbmetaPartitions(ctx android.LoadHookContext, generatedPartitionTypes
},
).HideFromMake()
- chainedPartitions = append(chainedPartitions, filesystem.ChainedPartitionProperties{
- Name: &chainedName,
- Rollback_index_location: &ril,
- Private_key: &props.Key,
- })
+ chainedPartitions = append(chainedPartitions, name)
result = append(result, vbmetaModuleInfo{
moduleName: name,