[third_party/pigweed/src] Roll 68 commits

825f89f0c2fd45d roll: bazel
178dee4d673a285 emboss: Update emboss repo to tag v2024.0501.21542
33da8827caa5441 pw_package: Suppress package progress messages
6c158d179f8e53b pw_log: Add core::fmt style format string support
f2bfca90d64a6d4 pw_bluetooth: Remove hci_vendor
664cea90c2e3998 pw_transfer: Lock resource_responder_ access
c3c31b852086eb2 docs: Update changelog
63761bcd7861acf pw_bluetooth_proxy: Reserve ACL LE slots from host
64d7ace864708ce pw_log: Rename Rust logging API to be less verbose
1f22c59e3a2f664 pw_log: Add Rust support for untyped strings
c3d2877b7aa6c78 pw_rpc: Fix macro name in docs and comments
d0ff89e952d68de pw_toolchain: Fix CMake build on macOS
d5f3adeb5cafd73 pw_protobuf_compiler: Fix bazel failure if proto d
fc8d0557e06a367 pw_protobuf_compiler: Add a no_prefix test
ac388e7bdae6d03 pw_ide: Raise specific error on bad settings file
6920d0bb3b6898a pw_protobuf_compiler: Tests fail to build under cm
3aa838ba32d99bb pw_allocator: Improve namespacing
89c90454a256760 pw_toolchain: Add no-canonical-system-headers
59bc1cdc76fbc59 pw_allocator: Use singletons for stateless allocat
5b96d29bb8a6ff0 pw_digital_io_linux: Refactor test
e59fb801bd8584c pw_build: Fix type hint
9cbecdc781e3706 pw_digital_io_linux: Remove OwnedFd::operator=(int
9818527a8610c7a pw_bluetooth_sapphire: Use hci_android.emb.h
1a7803b5be6ed6f third_party: Add missing libfit deps for Android
0b7dd705b9c1159 pw_bluetooth: Rename hci_vendor to hci_android (wi
ae704b9dd8618ac pw_bluetooth: Add Vendor BQR subevent prefix
7b7d2fd94a5d29c pw_build: Add chipset constraint for imxrt500 fami
07d564b6cd7e9cd pw_presubmit: reST format end-of-file formatting
618d59adc376e67 pw_bluetooth: Add HCI informational commands
0a8168cbf0c950d pw_thread: Fix remaining compilability issues
aa19504faca0b72 pw_web: Fix font colors in packaged version
31875b799730ab1 pw_toolchain: Register ARM m33 toolchains
58a09c188df0cc6 pw_async2: Add AllocateTask
8c5103f3da47d9c pw_grpc: Remove old constructor after migration
962861dc8e2714c pw_build: CMake recipe for the pw build command
5bda8d1632020bd pw_digital_io_linux: Move OwnedFd to its own heade
6fb2433c30e6733 pw_cpu_exception_cortex_m: Add util_test to tests
71017480adf7fb1 boringssl: Add cmake integration
63e6774b2b84f81 pw_bluetooth: Add header alias in command complete
58a80c6548797d2 pw_bluetooth_proxy: Rename ProcessH4* to HandleH4*
e0a6e32b38b20eb pw_bluetooth_proxy: Rename passthrough_test.cc to
ac1d46f720ff626 roll: clang-next
b890f6af0b74e9a pw_web: Fix icons in packaged version
74efe356798f1e7 pw_tls_client: Add cmake facades
08d5e68858f9e26 pw_grpc: Support fragmented gRPC messages if an al
b572538413b3dcc pw_bluetooth: Add Event Codes to emboss
de89ebf66fe51fa pw_bluetooth: Add opcode_enum to command and respo
e84673095f8d862 pw_bluetooth_proxy: Move ProxyHost methods to .cc
5c47f7009f66838 pw_bluetooth_proxy: Rename HciProxy to ProxyHost
26f064159c278b2 pw_bluetooth_proxy: Delete policies functionality
e3a20766f69442f pw_bluetooth: Sync with recent APCF changes
aa6b152d30aa3cc pw_rpc: Add private method for sending internal::P
299330f742b9c86 pw_transfer: Add resource_id to all GetResourceSta
73ed577762ec7ba pw_rust: Build examples in presubmit
829be4bfa88060d pw_web: Fix text download format
a36109556535979 pw_bluetooth: Define Common Data Types
5f043974e7207fb pw_stream_uart_mcuxpresso: Add interrupt safe writ
4d23123c37a3363 npm: Update package-lock.json
33d6d7e04508964 pw_bluetooth: Add LoopbackCommandEvent
189b54cf33ff8e2 *: Run clang-format
53be9f9c6724a4f pw_bluetooth: Support Read RSSI command and event
fa1938a64124d21 pw_assert: Fix support for print_and_abort in Baze
4f13eae7187e8ba pw_build: Add a `test_main` param to `pw_cc_test`
5e4e82bec8288b7 pw_thread_threadx: Remove unused dependency
51572a37f0c380b pw_env_setup: Update default sysroot version
e0492ee7eaed1f4 roll: clang
73d4ddb4cb33de4 pw_allocator: Add missing return statement
a1faba5d2d569a1 SEED-0129: Claim SEED number

https://pigweed.googlesource.com/pigweed/pigweed
third_party/pigweed/src Rolled-Commits: ccc5241d8133cd2..825f89f0c2fd45d
Roller-URL: https://ci.chromium.org/b/8748732067150059489
GitWatcher: ignore
CQ-Do-Not-Cancel-Tryjobs: true
Change-Id: I014d74d317cdc792e52077a4409a1d026338b000
Reviewed-on: https://pigweed-review.googlesource.com/c/open-dice/+/208359
Bot-Commit: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
Commit-Queue: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
1 file changed
tree: 3d734af89c1c07017ae89a0af4209922e4065c5a
  1. build_overrides/
  2. docs/
  3. images/
  4. include/
  5. src/
  6. third_party/
  7. toolchains/
  8. tools/
  9. .clang-format
  10. .gitignore
  11. .gitmodules
  12. .gn
  13. banner.txt
  14. bootstrap.sh
  15. BUILD.gn
  16. BUILDCONFIG.gn
  17. generate_test_values.py
  18. LICENSE
  19. navbar.md
  20. OWNERS
  21. pigweed.json
  22. pyproject.toml
  23. README.md
  24. run_fuzzer.sh
README.md

Open Profile for DICE

This repository contains the specification for the Open Profile for DICE along with production-quality code. This profile is a specialization of the Hardware Requirements for a Device Identifier Composition Engine and DICE Layering Architecture specifications published by the Trusted Computing Group (TCG). For readers already familiar with those specs, notable distinctives of this profile include:

  • Separate CDIs for attestation and sealing use cases
  • Categorized inputs, including values related to verified boot
  • Certified UDS values
  • X.509 or CBOR certificates

Mailing List

You can find us (and join us!) at https://groups.google.com/g/open-profile-for-dice. We're happy to answer questions and discuss proposed changes or features.

Specification

The specification can be found here. It is versioned using a major.minor scheme. Compatibility is maintained across minor versions but not necessarily across major versions.

Code

Production quality, portable C code is included. The main code is in dice.h and dice.c. Cryptographic and certificate generation operations are injected via a set of callbacks. Multiple implementations of these operations are provided, all equally acceptable. Integrators should choose just one of these, or write their own.

Tests are included for all code and the build files in this repository can be used to build and run these tests.

Disclaimer: This is not an officially supported Google product.

Thirdparty Dependencies

Different implementations use different third party libraries. The third_party directory contains build files and git submodules for each of these. The submodules must be initialized once after cloning the repo, using git submodule update --init, and updated after pulling commits that roll the submodules using git submodule update.

Building and Running Tests

Quick setup

To setup the build environment the first time:

$ git submodule update --init
$ source bootstrap.sh
$ gn gen out

To build and run tests:

$ ninja -C out

More details

The easiest way, and currently the only supported way, to build and run tests is from a Pigweed environment on Linux. Pigweed does support other host platforms so it shouldn't be too hard to get this running on Windows for example, but we use Linux.

There are two scripts to help set this up:

  • bootstrap.sh will initialize submodules, bootstrap a Pigweed environment, and generate build files. This can take some time and may download on the order of 1GB of dependencies so the normal workflow is to just do this once.

  • activate.sh quickly reactivates an environment that has been previously bootstrapped.

These scripts must be sourced into the current session: source activate.sh.

In the environment, from the base directory of the dice-profile checkout, run ninja -C out to build everything and run all tests. You can also run pw watch which will build, run tests, and continue to watch for changes.

This will build and run tests on the host using the clang toolchain. Pigweed makes it easy to configure other targets and toolchains. See toolchains/BUILD.gn and the Pigweed documentation.

Porting

The code is designed to be portable and should work with a variety of modern toolchains and in a variety of environments. The main code in dice.h and dice.c is C99; it uses uint8_t, size_t, and memcpy from the C standard library. The various ops implementations are as portable as their dependencies (often not C99 but still very portable). Notably, this code uses designated initializers for readability. This is a feature available in C since C99 but missing from C++ until C++20 where it appears in a stricter form.

Style

The Google C++ Style Guide is used. A .clang-format file is provided for convenience.

Incorporating

To incorporate the code into another project, there are a few options:

  • Copy only the necessary code. For example:

    1. Take the main code as is: include/dice/dice.h, src/dice.c

    2. Choose an implementation for crypto and certificate generation or choose to write your own. If you choose the boringssl implementation, for example, take include/dice/utils.h, include/dice/boringssl_ops.h, src/utils.c, and src/boringssl_ops.c. Taking a look at the library targets in BUILD.gn may be helpful.

  • Add this repository as a git submodule and integrate into the project build, optionally using the gn library targets provided.

  • Integrate into a project already using Pigweed using the gn build files provided.

Size Reports

The build reports code size using Bloaty McBloatface via the pw_bloat Pigweed module. There are two reports generated:

  • Library sizes - This report includes just the library code in this repository. It shows the baseline DICE code with no ops selected, and it shows the delta introduced by choosing various ops implementations. This report does not include the size of the third party dependencies.

  • Executable sizes - This report includes sizes for the library code in this repository plus all dependencies linked into a simple main function which makes a single DICE call with all-zero input. It shows the baseline DICE code with no ops (and therefore no dependencies other than libc), and it shows the delta introduced by choosing various ops implementations. This report does include the size of the third party dependencies. Note that rows specialized from ‘Boringssl Ops’ use that as a baseline for sizing.

The reports will be in the build output, but you can also find the reports in .txt files in the build output. For example, cat out/host_optimized/gen/*.txt | less will display all reports.

Thread Safety

This code does not itself use mutable global variables, or any other type of shared data structure so there is no thread-safety concerns. However, additional care is needed to ensure dependencies are configured to be thread-safe. For example, the current boringssl configuration defines OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED, and that would need to be changed before running in a threaded environment.

Clearing Sensitive Data

This code makes a reasonable effort to clear memory holding sensitive data. This may help with a broader strategy to clear sensitive data but it is not sufficient on its own. Here are a few things to consider.

  • The caller of this code is responsible for buffers they own (of course).
  • The ops implementations need to clear any copies they make of sensitive data. Both boringssl and mbedtls attempt to zeroize but this may need additional care to integrate correctly. For example, boringssl skips optimization prevention when OPENSSL_NO_ASM is defined (and it is currently defined).
  • Sensitive data may remain in cache.
  • Sensitive data may have been swapped out.
  • Sensitive data may be included in a crash dump.