333 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Protocol Buffer
		
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Protocol Buffer
		
	
	
	
// Copyright 2021 The Pigweed Authors
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
 | 
						|
// use this file except in compliance with the License. You may obtain a copy of
 | 
						|
// the License at
 | 
						|
//
 | 
						|
//     https://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
// License for the specific language governing permissions and limitations under
 | 
						|
// the License.
 | 
						|
//
 | 
						|
// Implementation of metadata formats specified in TUF Specification.
 | 
						|
// See https://theupdateframework.github.io/specification/latest/
 | 
						|
 | 
						|
syntax = "proto3";
 | 
						|
 | 
						|
package pw.software_update;
 | 
						|
 | 
						|
import "google/protobuf/timestamp.proto";
 | 
						|
 | 
						|
// Metadata for a particular TUF role (e.g. targets metadata).
 | 
						|
// Was TufMetadata
 | 
						|
message SignedRootMetadata {
 | 
						|
  // Serialized RootMetadata message that is the data portion of the metadata.
 | 
						|
  bytes serialized_root_metadata = 1;
 | 
						|
 | 
						|
  // Signature of the canonical form of the role's serialized metadata
 | 
						|
  // (serialized_root_metadata).
 | 
						|
  repeated Signature signatures = 2;
 | 
						|
}
 | 
						|
 | 
						|
message SignedTimestampMetadata {
 | 
						|
  // Serialized TimestampMetadata message that is the data portion of the
 | 
						|
  // metadata.
 | 
						|
  bytes serialized_timestamp_metadata = 1;
 | 
						|
 | 
						|
  // Signature of the canonical form of the role's serialized metadata
 | 
						|
  // (serialized_timestamp_metadata).
 | 
						|
  repeated Signature signatures = 2;
 | 
						|
}
 | 
						|
 | 
						|
message SignedSnapshotMetadata {
 | 
						|
  // Serialized SnapshotMetadata message that is the data portion of the
 | 
						|
  // metadata.
 | 
						|
  bytes serialized_snapshot_metadata = 1;
 | 
						|
 | 
						|
  // Signature of the canonical form of the role's serialized metadata
 | 
						|
  // (serialized_snapshot_metadata).
 | 
						|
  repeated Signature signatures = 2;
 | 
						|
}
 | 
						|
 | 
						|
message SignedTargetsMetadata {
 | 
						|
  // Serialized TargetsMetadata message that is the data portion of the
 | 
						|
  // metadata.
 | 
						|
  bytes serialized_targets_metadata = 1;
 | 
						|
 | 
						|
  // Signature of the canonical form of the role's serialized metadata
 | 
						|
  // (serialized_targets_metadata).
 | 
						|
  repeated Signature signatures = 2;
 | 
						|
}
 | 
						|
 | 
						|
message CommonMetadata {
 | 
						|
  // Version number of the TUF Specification.
 | 
						|
  // Follows the Semantic Versioning 2.0.0 (semver) format. Metadata is
 | 
						|
  // written according to this version, and clients MUST verify that
 | 
						|
  // "spec_version" matches the expected version number.
 | 
						|
  // E.g. "1.0.0".
 | 
						|
  string spec_version = 1;
 | 
						|
 | 
						|
  // Metadata file version.
 | 
						|
  // Clients MUST NOT replace a metadata file with a version number less than
 | 
						|
  // the one currently trusted.
 | 
						|
  uint32 version = 2;
 | 
						|
 | 
						|
  // Expiration time for the metadata.
 | 
						|
  // Indicates when this metadata should be considered expired and no longer
 | 
						|
  // trusted by clients. Notice the TUF Specification defines this as a JSON
 | 
						|
  // string following the ISO 8601 standard. The expected format of the date and
 | 
						|
  // time string is "YYYY-MM-DDTHH:MM:SSZ". Time is always in UTC, and the "Z"
 | 
						|
  // time zone designator is attached to indicate a zero UTC offset.
 | 
						|
  // E.g. "2030-08-26T16:48:27Z".
 | 
						|
  optional google.protobuf.Timestamp expires = 3;
 | 
						|
 | 
						|
  // Role type for the metadata.
 | 
						|
  // Indicates the type of the metadata. Valid values are 'root', 'targets',
 | 
						|
  // 'snapshot' and 'timestamp' as defined in the TUF spec, though we don't
 | 
						|
  // plan to support 'mirrors'.
 | 
						|
  //
 | 
						|
  // This field serves as a "magic code" that identifies a particular type of
 | 
						|
  // a metadata. During verification, the client is expected to check this
 | 
						|
  // field against the expected role type immediately after verifying the
 | 
						|
  // signatures of a metadata. This can be considered a "confidence booster"
 | 
						|
  // in the absence of canonical protobuf -- i.e. it makes the various
 | 
						|
  // `serialized_x_metadata` fields more tamper resistant.
 | 
						|
  optional string role = 4;
 | 
						|
}
 | 
						|
 | 
						|
// This content is signed.
 | 
						|
message RootMetadata {
 | 
						|
  CommonMetadata common_metadata = 1;
 | 
						|
 | 
						|
  // Whether the repo supports consistent snapshots. If the repo has frequent
 | 
						|
  // updates, you should set this to true.
 | 
						|
  bool consistent_snapshot = 2;
 | 
						|
 | 
						|
  // Map from Keyid to Key.
 | 
						|
  // Keyid is a unique identifier that identifies a cryptographic key.
 | 
						|
  // Contains all of cryptographic keys used by this repository.
 | 
						|
  repeated KeyMapping keys = 3;
 | 
						|
 | 
						|
  // KeyConfig is the list of keys use for a particular role and the threshold.
 | 
						|
  // Threshold is number of keys of that role whose signatures are required in
 | 
						|
  // order to consider a file as being properly signed by that role.
 | 
						|
  SignatureRequirement root_signature_requirement = 4;
 | 
						|
  SignatureRequirement timestamp_signature_requirement = 5;
 | 
						|
  SignatureRequirement snapshot_signature_requirement = 6;
 | 
						|
  SignatureRequirement targets_signature_requirement = 7;
 | 
						|
 | 
						|
  // This is NOT a part of the TUF Specification.
 | 
						|
  reserved 8 to 31;  // Reserved for TUF Specification changes.
 | 
						|
 | 
						|
  reserved 32 to 64;  // Reserved for future Pigweed usage.
 | 
						|
 | 
						|
  reserved 65 to 255;  // Reserved for project-specific usage.
 | 
						|
}
 | 
						|
 | 
						|
// The timestamp role is used for freshness check of the snapshot. Any
 | 
						|
// project-specific update metadata should go in the top-level targets_metadata
 | 
						|
// or with the TargetFile information
 | 
						|
message TimestampMetadata {
 | 
						|
  CommonMetadata common_metadata = 1;
 | 
						|
 | 
						|
  // Only one snapshot_metadata is used per timestamp.
 | 
						|
  MetadataFile snapshot_metadata = 2;
 | 
						|
 | 
						|
  // This is NOT a part of the TUF Specification.
 | 
						|
  reserved 3 to 31;  // Reserved for TUF Specification changes.
 | 
						|
 | 
						|
  reserved 32 to 64;  // Reserved for future Pigweed usage.
 | 
						|
 | 
						|
  reserved 65 to 255;  // Reserved for project-specific usage.
 | 
						|
}
 | 
						|
 | 
						|
// The snapshot role is used to ensure that the collection of targets_metadata
 | 
						|
// files is securely consistent (no target metadata mix and match). Any
 | 
						|
// project-specific update metadata should go in the top-level targets_metadata
 | 
						|
// or with the TargetFile information
 | 
						|
message SnapshotMetadata {
 | 
						|
  CommonMetadata common_metadata = 1;
 | 
						|
 | 
						|
  // Map from Target metadata file name to MetadataFile.
 | 
						|
  // File name can be an arbitrary name or a full file name with relative path.
 | 
						|
  // This map should contain an entry for the top level targets role and all
 | 
						|
  // delegated roles.
 | 
						|
  repeated MetadataFile targets_metadata = 2;
 | 
						|
 | 
						|
  // This is NOT a part of the TUF Specification.
 | 
						|
  reserved 3 to 31;  // Reserved for TUF Specification changes.
 | 
						|
 | 
						|
  reserved 32 to 64;  // Reserved for future Pigweed usage.
 | 
						|
 | 
						|
  reserved 65 to 255;  // Reserved for project-specific usage.
 | 
						|
}
 | 
						|
 | 
						|
// The targets role describes the target files that comprise the software
 | 
						|
// update. Targets metadata is organized in to a top-level targets metadata file
 | 
						|
// and optional multiple deligated targets metadata files
 | 
						|
//
 | 
						|
// The top-level targets metatdata is the correct place to put any
 | 
						|
// project-specific build version information, including build ID, hardware rev,
 | 
						|
// etc.
 | 
						|
message TargetsMetadata {
 | 
						|
  CommonMetadata common_metadata = 1;
 | 
						|
 | 
						|
  // Collection of target file information
 | 
						|
  repeated TargetFile target_files = 2;
 | 
						|
  // Target file name can be an arbitrary name or a path that describes where
 | 
						|
  // the file lives relative to the base directory of the repository, e.g.
 | 
						|
  // "path/to/amber_tools/0".
 | 
						|
 | 
						|
  // TODO: When it is time to support delegation, add delegation information
 | 
						|
  // here.
 | 
						|
 | 
						|
  // This is NOT a part of the TUF Specification.
 | 
						|
  reserved 9 to 31;  // Reserved for TUF Specification changes.
 | 
						|
 | 
						|
  reserved 32 to 64;  // Reserved for future Pigweed usage.
 | 
						|
 | 
						|
  reserved 65 to 255;  // Reserved for project-specific usage.
 | 
						|
}
 | 
						|
 | 
						|
message Signature {
 | 
						|
  // Identifier of the key, which is bytes of the SHA-256 hash of the
 | 
						|
  // canonical form of the key.
 | 
						|
  bytes key_id = 1;
 | 
						|
 | 
						|
  // The signature of the canonical form of the role's serialized metadata
 | 
						|
  // (serialized_{root,timestamp,snapshot,targets}_metadata).
 | 
						|
  bytes sig = 2;
 | 
						|
}
 | 
						|
 | 
						|
message KeyMapping {
 | 
						|
  // Identifier of the key, which is bytes of the SHA-256 hash of the
 | 
						|
  // canonical form of the key.
 | 
						|
  bytes key_id = 1;
 | 
						|
 | 
						|
  // Cryptographic key
 | 
						|
  Key key = 2;
 | 
						|
}
 | 
						|
 | 
						|
// Identifies an asymmetric cryptographic key.
 | 
						|
message Key {
 | 
						|
  // Denotes a public key signature system, such as RSA or ECDSA.
 | 
						|
  KeyType key_type = 1;
 | 
						|
 | 
						|
  // Denotes the signature scheme corresponding to the key type. For example:
 | 
						|
  // "rsassa-pss-sha256" or "ecdsa-sha2-nistp256".
 | 
						|
  KeyScheme scheme = 2;
 | 
						|
 | 
						|
  // Stores the serialized public key for this cryptographic algorithm.
 | 
						|
  bytes keyval = 3;
 | 
						|
}
 | 
						|
 | 
						|
// The set of cryptographic keys used by a specific role. For example, list of
 | 
						|
// key_ids used by the top level role "root".
 | 
						|
message SignatureRequirement {
 | 
						|
  // Set of Keyid's.
 | 
						|
  // Keyid is a unique identifier that identifies a cryptographic key.
 | 
						|
  // E.g. "f2d5020d08aea06a0a9192eb6a4f549e17032ebefa1aa9ac167c1e3e727930d6".
 | 
						|
  repeated bytes key_ids = 1;
 | 
						|
 | 
						|
  // Threshold of signatures required to trust given file.
 | 
						|
  // In other words; the number of keys of that role whose signatures are
 | 
						|
  // required in order to consider a file as being properly signed by that role.
 | 
						|
  uint32 threshold = 2;
 | 
						|
}
 | 
						|
 | 
						|
enum HashFunction {
 | 
						|
  // Never use this in any TUF metadata.
 | 
						|
  UNKNOWN_HASH_FUNCTION = 0;
 | 
						|
 | 
						|
  SHA256 = 1;
 | 
						|
}
 | 
						|
 | 
						|
message Hash {
 | 
						|
  HashFunction function = 1;
 | 
						|
  // Digest of the cryptographic hash function computed on the target file.
 | 
						|
  bytes hash = 2;
 | 
						|
}
 | 
						|
 | 
						|
// Descriptor for a file stored in this repository. Linked to from target
 | 
						|
// metadata.
 | 
						|
message TargetFile {
 | 
						|
  // Target file name can be an arbitrary name or a path that describes where
 | 
						|
  // the file lives relative to the base directory of the repository, e.g.
 | 
						|
  // "path/to/amber_tools/0".
 | 
						|
  string file_name = 1;
 | 
						|
 | 
						|
  // Size of the target file (element payload) in bytes. This the size as stored
 | 
						|
  // in the bundle. The final applied size can be different due to optional
 | 
						|
  // compression.
 | 
						|
  uint64 length = 2;
 | 
						|
 | 
						|
  // Map from algorithm name to Hash.
 | 
						|
  // Algorithm name is the name of a cryptographic hash function. E.g. "sha256".
 | 
						|
  // The Hash string is the hex digest of the cryptographic function computed on
 | 
						|
  // the target file. E.g.
 | 
						|
  // "65b8c67f51c993d898250f40aa57a317d854900b3a04895464313e48785440da".
 | 
						|
  repeated Hash hashes = 3;
 | 
						|
 | 
						|
  // This is NOT a part of the TUF Specification.
 | 
						|
  reserved 4 to 15;  // Reserved for TUF Specification changes.
 | 
						|
 | 
						|
  reserved 16 to 31;  // Reserved for future Pigweed usage.
 | 
						|
 | 
						|
  reserved 32 to 255;  // Reserved for future project-specific usage.
 | 
						|
}
 | 
						|
 | 
						|
message MetadataFile {
 | 
						|
  // Target file name can be an arbitrary name or a path that describes where
 | 
						|
  // the file lives relative to the base directory of the repository, e.g.
 | 
						|
  // "path/to/target/0".
 | 
						|
  optional string file_name = 1;
 | 
						|
 | 
						|
  // Metadata file version. E.g. 3.
 | 
						|
  uint32 version = 2;
 | 
						|
 | 
						|
  // Size of the target file in bytes.
 | 
						|
  optional uint64 length = 3;
 | 
						|
 | 
						|
  // Map from algorithm name to Hash.
 | 
						|
  // Algorithm name is the name of a cryptographic hash function. E.g. "sha256".
 | 
						|
  // The Hash is the hex digest of the cryptographic function computed on the
 | 
						|
  // target file. E.g.
 | 
						|
  // "65b8c67f51c993d898250f40aa57a317d854900b3a04895464313e48785440da".
 | 
						|
  repeated Hash hashes = 4;
 | 
						|
}
 | 
						|
 | 
						|
enum KeyType {
 | 
						|
  // Never use this in any TUF metadata.
 | 
						|
  UNKNOWN_KEY_TYPE = 0;
 | 
						|
 | 
						|
  RSA = 1;
 | 
						|
 | 
						|
  ED25519 = 2;
 | 
						|
 | 
						|
  ECDSA_SHA2_NISTP256 = 3;
 | 
						|
}
 | 
						|
 | 
						|
enum KeyScheme {
 | 
						|
  // Never use this in any TUF metadata.
 | 
						|
  UNKNOWN_KEY_SCHEME = 0;
 | 
						|
 | 
						|
  // RSA Probabilistic signature scheme with appendix.
 | 
						|
  // The underlying hash function is SHA256.
 | 
						|
  // In TUF Specification, this is referred to as "rsassa-pss-sha256".
 | 
						|
  RSASSA_PSS_SHA256_SCHEME = 1;
 | 
						|
 | 
						|
  // Elliptic Curve digital signature algorithm based on Twisted Edwards curves.
 | 
						|
  // See https://ed25519.cr.yp.to/.
 | 
						|
  // In TUF Specification, it is referred to as "ed25519".
 | 
						|
  ED25519_SCHEME = 2;
 | 
						|
 | 
						|
  // Elliptic Curve Digital Signature Algorithm with NIST P-256 curve signing
 | 
						|
  // and SHA-256 hashing. See
 | 
						|
  // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm In
 | 
						|
  // TUF Specification, it is referred to as "ecdsa-sha2-nistp256".
 | 
						|
  ECDSA_SHA2_NISTP256_SCHEME = 3;
 | 
						|
}
 |