[third_party/pigweed/src] Roll 45 commits

ea93eb586cad181 pw_multibuf: Deduplicate const+non_const iterators
731239b6ed7f3c7 pw_multibuf: Clean up API
6da9d6f3be9f314 pw_string: Support InlineBasicString<std::byte>; I
65ff5c3ac772677 pw_bluetooth: Add hci_data.emb
312412b466c5118 pw_web: Capture browser logs in the log viewer
5ce9ca7349c2469 bootstrap: Warn about Windows case-sensitivity sup
f25eb6ab8c1d4cc pw_toolchain_bazel: Support Windows in toolchain t
6bbe3599f021969 docs: Clarify rvalue docs
25069b4047a57f3 pw_bluetooth: Add ISO feature bit to controllers
b45cf66960471b7 pw_libc: Add stdfix target
a34ea92cad00ee7 pw_rust: Add Rust tokenized logging example
70eae9f48da58eb pw_allocator: Remove split_free_list_allocator.cc
6a1b2e4920556e0 pw_libc: Facilitate next llvm-libc roll
1c993470e827d03 pw_result: Add constructor deduction guide
ad40c5f7cb65f17 pw_assert_log: Depend on pw_log_headers in Android
cf062ce10841003 pw_rpc_transport: Add log for no packet available
58e754ea92e9ed8 pw_stream_uart_mcuxpresso: Fix code examples in do
f4e6db77b1ae6c0 pw_transfer: Only request a single chunk in test
f816e851eec8000 pw_assert_log: Fix PW_HANDLE_CRASH to handle 0 arg
c76277cc6e7c7ea roll: clang-next
75809db522a27fe pw_allocator: Add missing dep
2a3d10804995f5b pw_tokenizer: Fix missing bazel filegroup
518bb002c55ebb9 pw_async2: Add converting constructors to Poll
6b0b9c2f3ca1b6c pw_stream_uart_mcuxpresso: Implement DoRead DMA
3ca23db2114f542 pw_stream_uart_mcuxpresso: Implement DoWrite DMA
6992b4612b3a18a pw_stream_uart_mcuxpresso: Implement init / deinit
fef14dcb5e4615e pw_sync: Allow implict conversion when moving Borr
b10b18a6800a187 pw_allocator: Use BlockAllocator instead of altern
73892fa16303e22 pw_stream_uart_mcuxpresso: USART DMA scaffolding
837563b4de97b83 pw_bluetooth: Add ISO definitions to Controller
eb4a400f6004b68 pw_json: Update example; fix typo and declaration
ba1c16c185f0f3b third_party: Android.bp: Export fuchsia_sdk_lib_st
02d9eea12c0e172 pw_build: Fix ProjectBuilder recipe percentage
f0da8850b48b1b0 pw_multibuf: Add +=N and +n operators to iterator
5e33ad5c30e0f1f pw_log: Show child docs in site nav
fbd7625e11bc103 docs: Reorder tocdepth and title
e7ad04fb98a2093 pw_multibuf: Add slicing operations to MultiBuf
2423b1d51274848 docs: Prefer rvalue references
55dcce2af4ea7e5 pw_containers: Rename VariableLengthEntryQueue
17c586758a74044 pw_containers: Rename VariableLengthEntryQueue fil
e589acdd101d978 pw_containers: VariableLengthEntryQueue C++ API
44a57f1aae6e911 pw_transfer: Fix WindowPacketDropper proxy filter
614d94afb734817 pw_tokenizer: Add Detokenizer constructor with elf
1ea2d051c56f0ad docs: Update changelog
544a7b57c35e116 Revert "roll: clang"

https://pigweed.googlesource.com/pigweed/pigweed
third_party/pigweed/src Rolled-Commits: 154897dd5f6d239..ea93eb586cad181
Roller-URL: https://ci.chromium.org/b/8754439676994519537
GitWatcher: ignore
CQ-Do-Not-Cancel-Tryjobs: true
Change-Id: I41c4f436485ea5859f78a0327e89ab13db20caa2
Reviewed-on: https://pigweed-review.googlesource.com/c/open-dice/+/194830
Commit-Queue: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
Bot-Commit: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
1 file changed
tree: 904aea9532384050efaad35921d33c802091ac11
  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.